<?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->num_rows;行,至于为什么,我不知道。偶尔它会按预期工作,所以任何和所有的建议,我可以做些什么来修复它,或者至少帮助我更好地理解它是非常感激的。谢谢!
查询使用双引号,varchar/string传递使用单引号
$sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'";
$results = $link->query($sql);
$numrows = $results->num_rows();
您对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引号。