代码:
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
/* ^^^ taken from http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html */
$time=(string) time();
$ip=getRealIpAddr();
$username=mysqli_real_escape_string($connect, $_POST['Username']);
//$pwcde is defined as a hashed password from a form
$iptme=mysqli_prepare($connect, "UPDATE users SET ip_last=?, time_last=? WHERE username=? AND password=?");
mysqli_stmt_bind_param($iptme, "ssss", $ip, $time, $username, $pwcde);
mysqli_stmt_execute($iptme);
当这段代码运行时,我得到:
警告:mysqli_stmt_bind_param()期望参数1为 mysqli_stmt,在......中给出的布尔值。
警告:mysqli_stmt_execute()期望参数1为mysqli_stmt, 布尔值在......中给出。
这显然意味着mysqli_prepare
失败(返回false)。我知道连接是好的,因为它之前的其他语句运行良好。但这是唯一一个带有2个SET
字段的UPDATE语句。我无法找到问题的解决方案。
导致函数失败的语法错误或问题是什么?
答案 0 :(得分:1)
如果$iptme
获取值false,则您知道查询失败,这很好。但是,您是否知道在收到致命错误或警告尝试使用false作为语句资源之前,您可以对此进行测试?你知道你可以查询MySQL错误信息吗?
每当您prepare()
或execute()
查询时,请使用API获取错误消息:
if (!($iptme=mysqli_prepare($connect, ...))) {
die($connect->error);
}
...
if (!mysqli_stmt_execute($iptme)) {
die($iptme->error);
}
错误可能在准备或执行期间发生,因此您必须在两种情况下测试返回值。
或者,您可以启用mysqli在准备或执行时发生错误时抛出异常,因此您不必编写重复代码来检查返回值。见http://php.net/manual/en/mysqli-driver.report-mode.php
PS:如果你使用绑定参数,不要使用mysqli_real_escape_string()。您将在SQL查询中添加文字\
个字符。