Php mysql\u num\u rows()返回0

Php mysql\u num\u rows()返回0,php,mysql,Php,Mysql,当程序执行时,我的$result变量将等于资源id 4。 这显然意味着我的mysql\u查询已成功执行。 但是当我调用mysql\u num\u rows$result时,我总是返回0。虽然行确实存在,但我一直得到一个值0。为什么? if (isset($_POST["user"]) && isset($_POST["pass"])) { // prepare SQL $sql = sprintf("SELECT 1 FROM users WHERE userna

当程序执行时,我的$result变量将等于资源id 4。 这显然意味着我的mysql\u查询已成功执行。 但是当我调用mysql\u num\u rows$result时,我总是返回0。虽然行确实存在,但我一直得到一个值0。为什么?

if (isset($_POST["user"]) && isset($_POST["pass"]))
{
    // prepare SQL
    $sql = sprintf("SELECT 1 FROM users WHERE username='%s' AND password=PASSWORD('%s')",
                   mysql_real_escape_string($_POST["user"]),
                   mysql_real_escape_string($_POST["pass"]));

    // execute query
    $result = mysql_query($sql);


    if ($result === false)
        die("Could not query database");


    $numOfRows = mysql_num_rows($result);

你的代码没有明显的错误

最明显的解释是,提交到数据库的查询没有返回任何行

我建议您在将SQL文本$SQL提交到数据库之前添加一些基本调试:echo、vardump或printf

验证SQL文本是否是您希望提交到数据库的文本,以及此查询是否返回一行

作为调试的另一步,我建议您实际从resultset中获取行,并显示返回的行

我通常为选择列表中的文字指定一个别名,例如

SELECT 1 AS one FROM ...
但我不认为这会真正导致mysql_num_行出现问题

我相信早期版本的PHP默认为在字符串上运行addslashes函数时自动启用magic quotes功能;回显生成的SQL将显示双重转义是否有问题

附录


这里必须注意的是,mysql_uu接口已被弃用,新的开发应该使用一种经过改进的替代品:mysqli或PDO。

您是否尝试打印$sql并对其进行调试?可能您的user和pass值包含由mysql\u real\u escape\u string转义的代码。另外,尝试使用MySQLi或PDO而不是不推荐使用的MySQL库供参考。MySQL_*不推荐使用。1是指列名吗?这并不意味着获取一行,您希望从中检索值的列名列表应该在后面SELECT@ChrisBrown如果您不想从查询返回数据,而只想测试记录的存在性,则选择1是完全有效的语法。。。。对于找到的与WHERE子句匹配的每个记录,它将在名为1的列中返回一个数字1,并且结果集的计数(例如mysql_num_行)将给出一个1或多个或0表示找到或不找到found@ChrisBrown-没那么尴尬,没那么直观。。。。只有你以前遇到过它,你才可能知道它