我对将 mysql 与 php 结合使用还很陌生,这是我在网上找到的检索结果的内容:
$con = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die("Cannot connect to the database");
$query = "SELECT ... FROM ... WHERE ID=5";
$result = mysql_query($query);
$num = mysql_num_rows($result);
if ($num > 0 ) {
// do stuff
} else {
// inform user
}
mysql_close($con);
ID
是我表的自动生成的非空主键。现在,我的表中有 20 条记录。如果我输入 ID
与这些现有记录中的任何一个对应的值,一切顺利并按预期工作。
但是,如果我输入 ID
例如,54 的值或与我现有的 20 条记录中的任何一条都不对应的任何值(意味着不存在具有此类 ID
的行),我期望 $num <= 0
我的条件语句将转到 else
堵塞。但我发现情况并非如此 - 它仍然转到 TRUE
分支并前进到// do stuff
block ,所以我在 phpmyadmin 上运行了查询,发现我正好得到 1 行 NULL
在所有领域。这就是为什么 $num
正在返回 1
这是>0
.
问题:
- 我该如何正确地检查不存在的行?这样我的脚本的其余部分只会在我实际获得包含数据的行时运行。
- 我找到了
mysql_store_result
和mysql_free_result
在网上研究这个但是没有足够的信息来使它们正常工作。比如我将它们放在我的代码中的什么位置,为什么我可以在没有它们的情况下立即在 php 中做我需要做的事情,等等? - 在 php 中处理 mysql 数据库时,我是否遗漏了任何“最佳实践”内容?
- 当我必须调用多个 sql 语句时,我所做的是循环遍历
$query
-$result
-$num
我之前的过程mysql_close
我的连接。这是“最佳实践”吗?
非常感谢,伙计们,你们都很棒。
更新:包括整个查询
SELECT Dyna,
Floater,
Can.Label as CanLabel,
GROUP_CONCAT(DISTINCT Vanity.Name SEPARATOR ', ') as VanityName,
GROUP_CONCAT(DISTINCT Univ SEPARATOR ', ') as Univ,
ShopDate,
ManuDate,
FlipTran,
Remarks,
Bib,
Abbrev,
ShopChar,
Comment,
Value,
ERUSD
FROM
(Vanity INNER JOIN ((Vanity INNER JOIN Shoppy ON Vanity.VanityID = Shoppy.VanityID) INNER JOIN ShoppyVanity ON Shoppy.ID = ShoppyVanity.ID) ON Vanity.MethodID = ShoppyVanity.MethodID) INNER JOIN UAC ON (Shoppy.VanityID = UAC.VanityID) AND (Vanity.VanityID = UAC.VanityID)
WHERE (((Shoppy.ID)=5))
最佳答案
如果您使用组聚合函数,例如 GROUP_CONCAT
,MySQL 将从您的整个结果集中创建一个组。如果没有结果,它将改为在 NULL
值上运行它们,从而产生一个空行。尝试将此添加到查询的最后,以删除其中没有有效数据的行:
HAVING VanityName 不为空
关于php - mysql_query ("SELECT...") 为不存在的主键值返回 NULL 值行,呈现 (mysql_num_rows > 0) 检查无用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7776167/