PHP错误:对非对象调用成员函数bind_param()
我有一个php脚本,它应该连接到数据库,检查给定字段的行是否存在,如果存在,则更新同一行的另一个字段。然而,更新查询似乎失败了,我不明白为什么。我试图用谷歌搜索这个问题,但找不到有效的解决办法。我试图回显$mysqli->error,但它给了我一个空字符串 代码如下:PHP错误:对非对象调用成员函数bind_param(),php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我有一个php脚本,它应该连接到数据库,检查给定字段的行是否存在,如果存在,则更新同一行的另一个字段。然而,更新查询似乎失败了,我不明白为什么。我试图用谷歌搜索这个问题,但找不到有效的解决办法。我试图回显$mysqli->error,但它给了我一个空字符串 代码如下: <?php session_start(); include "../config.php"; if(isset($_GET['actionForgot']) && !empty($_GET['restor
<?php
session_start();
include "../config.php";
if(isset($_GET['actionForgot']) && !empty($_GET['restore'])) {
$piva=trim($_GET['restore']);
$mysqli = new mysqlc();
$stmt = $mysqli->prepare("SELECT username,email FROM login WHERE piva = ?");
$stmt->bind_param("s", $piva);
if (!$stmt->execute()) {
trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
}
$stmt->bind_result($username, $email);
if($stmt->fetch()) {
$password = generatePassword(10);
$crypPass = MD5($password);
$stmt = $mysqli->prepare("UPDATE login SET password = ? WHERE piva = ?"); //Here's the error!
if(!$stmt->bind_param("ss",$crypPass,$piva)){
echo "fail";
} else if (!$stmt->execute()) {
trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
echo "fail";
} else {
sendEmailRestore($username, $password, $email);
echo $email;
}
} else {
echo "nexists";
}
$stmt->close();
}else{
echo "false";
}
?>
另外,我确信问题不在config.php中,因为其他类似的php脚本工作得很好
编辑:这可能与我在两个查询中使用相同的变量$stmt有关吗?我发现了问题!这与$mysqli被用于两个不同的查询有关。我不知道为什么这会产生任何类型的问题,但我将代码更改为:
<?php
session_start();
include "../config.php";
if(isset($_GET['actionForgot']) && !empty($_GET['restore'])) {
$piva=trim($_GET['restore']);
$mysqli = new mysqlc();
$stmt = $mysqli->prepare("SELECT username,email FROM login WHERE piva = ?");
$stmt->bind_param("s", $piva);
if (!$stmt->execute()) {
trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
}
$stmt->bind_result($username, $email);
if($stmt->fetch()) {
$password = generatePassword(10);
$crypPass = MD5($password);
$mysqli2 = new mysqlc(); //NOTICE THIS LINE
$stmt = $mysqli2->prepare("UPDATE login SET password = ? WHERE piva = ?"); //AND THIS
if(!$stmt->bind_param("ss",$crypPass,$piva)){
echo "fail";
} else if (!$stmt->execute()) {
trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
echo "fail";
} else {
sendEmailRestore($username, $password, $email);
echo $email;
}
} else {
echo "nexists";
}
$stmt->close();
}else{
echo "false";
}
?>
而且效果很好。
我仍然想知道为什么我做得不对,但是…如果$stmt不是一个对象,正如错误消息所证明的,那么赋值失败,这意味着prepare方法无法准备语句。您应该尝试在与数据库服务器的交互会话中使用该语句,很可能会引发错误。@arkascha我试图通过phpmyadmin手动插入查询,如更新登录集password=test,其中piva=some_existing_值,其工作方式类似于charme。这就是为什么这让我发疯的原因!对prepare和bindings使用try-catch顺便问一下:什么是新的mysqlc;?$mysqli到底是一个对象吗?@Awlad Liton:这对我有什么帮助?这个错误意味着整个脚本都失败了:捕捉它毫无意义。准备好的语句提供了更有效的错误处理方法,但这种方法不应该发生。。。