Mysqli 我的行数在哪里?

Mysqli 我的行数在哪里?,mysqli,mysql-num-rows,Mysqli,Mysql Num Rows,它只在部分时间起作用,我无法通过这种或那种方式确定错误。我可以确认$numrows=$results->num\u行上会弹出错误;线路,但至于为什么,我迷路了。偶尔它会像预期的那样工作,所以任何关于我能做些什么来修复它,或者至少帮助我更好地理解它的建议都是非常感谢的。谢谢 使用双引号进行查询,使用单引号传递varchar/string <?php $link = mysqli_connect('localhost','root','root'); $link->query('CREA

它只在部分时间起作用,我无法通过这种或那种方式确定错误。我可以确认$numrows=$results->num\u行上会弹出错误;线路,但至于为什么,我迷路了。偶尔它会像预期的那样工作,所以任何关于我能做些什么来修复它,或者至少帮助我更好地理解它的建议都是非常感谢的。谢谢

使用双引号进行查询,使用单引号传递varchar/string

<?php
$link = mysqli_connect('localhost','root','root');
$link->query('CREATE DATABASE IF NOT EXISTS users');
$link->Select_db('users');

$sql='SELECT id FROM users WHERE email = '.$useremail.' AND username = '.$username;
$results = $link->query($sql);
$numrows = $results->num_rows;

if ($numrows == 1) {
    #update user information
} else {
    #failed to update
}
?>

调用
num_rows
生成错误的原因是查询有错误,
query()
返回了false,而不是有效的结果资源。因为尝试对假值调用方法是一个致命错误,所以在使用它之前,应该始终检查
query()
的返回值。例如:

$sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'";
$results = $link->query($sql);
$numrows = $results->num_rows();
您的查询存在问题:

  • 创建名为
    users
    的数据库,并将其作为默认数据库,然后从名为
    users
    的表中运行SELECT查询。在您刚刚创建的数据库中不会有表。在SQL中,我们对表而不是数据库使用SELECT(这是两种不同的东西,类似于文件系统目录中包含的文件)

  • SQL语句中不引用字符串参数。例如,此SQL将是一个错误:

    if (!($result = $link->query($sql))) {
        die($link->error);
    }
    
    应该是这样的:

    SELECT id FROM users WHERE email = bill@example.com AND username = bill
    
    我知道引号会让人困惑,因为您有PHP字符串引号,然后是SQL字符串引号,但这里有几种实现方法:

    SELECT id FROM users WHERE email = 'bill@example.com' AND username = 'bill'
    
  • 我不确定您是否适当地保护了PHP变量。除非已转义变量的内容,否则决不能将PHP变量插入SQL字符串

    $sql='SELECT id FROM users WHERE email = \''.$useremail.'\' AND username = \''.$username.'\'';
    $sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'";
    $sql="SELECT id FROM users WHERE email = '{$useremail}' AND username = '{$username}'";
    
  • 但最好使用带有参数占位符的准备好的语句。这比转义变量更容易使用,而且更可靠。下面是一个例子:

    $useremail_esc = $link->real_escape_string($useremail);
    $username_esc = $link->real_escape_string($username);
    $sql="SELECT id FROM users WHERE email = '{$useremail_esc}' AND username = '{$username_esc}'";
    
    请注意,在使用参数时不使用转义,也不在
    占位符周围加SQL引号


也进行了测试,通过测试后没有任何明显问题。在原始代码中,我们确实使用了“.$var…等。问题在于num_行失败。在引发致命错误115后放置(如您的示例中)一个开/闭括号。虽然我非常感谢您的输入,但您的建议并没有改善num_行的情况,对不起。从这里开始,我只使用$result->num_行?(很抱歉引用了这些话,我是从内存中输入的,有些细节可能会漏掉。有问题的数据库已经完全充实,条目也在那里,但不管它返回了什么0。)很抱歉,我仍然遇到一些问题。$stmt->get_result()作为未定义的函数返回了一个错误。
get_result()
函数仅在您有mysqlnd时可用,在PHP5.4.0及更高版本中默认情况下应启用mysqlnd。请参阅
$sql="SELECT id FROM users WHERE email = ? AND username = ?";
$stmt = $link->prepare($sql);
$stmt->bind_param("ss", $useremail, $username);
$stmt->execute();
$result = $stmt->get_result();