首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql_query(“选择.”)返回不存在的主键值的空值行,呈现(mysql_num_rows > 0)检查无用

问Mysql_query(“选择.”)返回不存在的主键值的空值行,呈现(mysql_num_rows > 0)检查无用
EN

Stack Overflow用户
提问于 2011-10-15 06:13:41
回答 4查看 3.4K关注 0票数 1

我对在php中使用mysql非常陌生,下面是我在网上找到的检索结果的方法:

代码语言:javascript
复制
$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块,所以我在phpmyadmin上运行了查询,发现我在所有字段中都得到了与NULL完全相同的1行。这就是为什么$num要返回1,也就是>0。

问题:

  1. 如何正确地检查不存在的行?因此,只有当我得到一个包含数据的行时,我的脚本的其余部分才会运行。

,

  1. ,我在在线研究这个问题时找到了mysql_store_result和mysql_free_result,但是没有足够的信息使它们正常工作。就像在我的代码中放置它们一样,为什么我可以在没有它们的情况下在php中完成我现在需要做的事情呢?
  2. 在处理php?
  3. 中的mysql数据库时所缺少的“最佳实践”--当我必须调用几个sql语句时,我所做的就是在连接mysql_close之前循环通过mysql_close进程。这是“最佳实践”吗?

太感谢了,伙计们,你们都太棒了。

更新:包括整个查询的

代码语言:javascript
复制
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))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-15 07:03:07

如果使用组聚合函数(如GROUP_CONCAT ),MySQL将在整个结果集中创建一个组。如果没有结果,它将在NULL值上运行它们,从而导致空行。尝试将其添加到查询的末尾,以消除其中没有有效数据的行:

HAVING VanityName IS NOT NULL

票数 2
EN

Stack Overflow用户

发布于 2011-10-15 06:49:37

代码语言:javascript
复制
$num = mysql_numrows($result);

把它改成

代码语言:javascript
复制
$num = mysql_num_rows($result);
票数 1
EN

Stack Overflow用户

发布于 2011-10-15 06:50:20

试试这个:

代码语言:javascript
复制
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 Shoppy ON (Vanity.VanityID = Shoppy.VanityID)
       INNER JOIN ShoppyVanity  ON (Shoppy.ID = ShoppyVanity.ID)
       INNER JOIN ShoppyVanity  ON (ShoppyVanity.MethodID=Vanity.MethodID) 
       INNER JOIN UAC           ON (Shoppy.VanityID = UAC.VanityID AND Vanity.VanityID =UAC.VanityID) 
       WHERE Shoppy.ID=5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7776167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档