<?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
}
?>
它只在部分时间内起作用,而且我无法以某种方式确定错误。我可以确认$ numrows = $ results-&gt; num_rows上弹出错误;线,但至于为什么,我迷失了。偶尔它会按预期工作,所以我可以做的任何和所有建议,或者至少帮助我更好地理解它,非常感谢。谢谢!
答案 0 :(得分:1)
使用Double Quotation进行查询,并使用单引号传递varchar / string
$sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'";
$results = $link->query($sql);
$numrows = $results->num_rows();
答案 1 :(得分:0)
您致num_rows
生成错误的原因是您的查询出错,query()
返回 false 而不是有效的结果资源。因为尝试在假值上调用方法是一个致命错误,所以在使用它之前应始终检查query()
的返回值。例如:
if (!($result = $link->query($sql))) {
die($link->error);
}
查询问题:
您创建一个名为users
的数据库并将其设为默认数据库,然后从名为users
的表运行SELECT查询。您刚刚创建的数据库中没有表。在SQL中,我们对表而不是数据库使用SELECT(这是两个不同的东西,类似于文件系统上的目录中包含的文件)。
您不引用SQL语句中的字符串参数。例如,这个SQL将是一个错误:
SELECT id FROM users WHERE email = bill@example.com AND username = bill
应该是这样:
SELECT id FROM users WHERE email = 'bill@example.com' AND username = 'bill'
我知道引号会让人感到困惑,因为你有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}'";
我不确定您是否已正确保护PHP变量。您必须永远将PHP变量插入到SQL字符串中,除非您已经转义了变量的内容。
$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="SELECT id FROM users WHERE email = ? AND username = ?";
$stmt = $link->prepare($sql);
$stmt->bind_param("ss", $useremail, $username);
$stmt->execute();
$result = $stmt->get_result();
请注意,在使用参数时不使用转义,并且不在?
占位符周围放置SQL引号。