bind_param错误500

时间:2016-01-12 19:20:26

标签: php mysqli bindparam

我通过javascript POST

调用了以下脚本
$target = $_POST['id'];
$sid = $_POST['sid'];

$sql = 'DELETE FROM `subusers` WHERE `subusers.uid`=?';
$stmt = $conn->prepare($sql);
if($stmt === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' . $conn->error, E_USER_ERROR);
}
echo $target;
$stmt->bind_param('i', $target);
$stmt->execute();

每当执行时,由于某种原因它会与POST http://xx.php 500 (Internal Server Error)崩溃。删除bind_param时,它可以正常工作。 PHP还与调用它的脚本进行通信,我尝试将$ target的值发送回脚本并提醒它,它显示了一个很好的值。我也尝试$target=1只是为了将它声明为一个整数,但它没有改变。查询中的整个混乱只是我试图修复它,以防某个地方有关键字。

错误代码:

  

PHP警告:mysqli :: prepare():无法在第12行的/var/www/html/delpar.php中获取mysqli,参考资料:

     

PHP致命错误:在第17行的/var/www/html/delpar.php中调用非对象的成员函数bind_param(),引用:

1 个答案:

答案 0 :(得分:3)

这里几乎没有问题导致prepare()/bind_param()/execute()失败。视觉上发现的第一件事是table.column语句的DELETE子句中包含的WHERE上的引用不正确。 MySQL的标识符引用要求如果引用,标识符的每个段都包含在它自己的一对反引号中。

// Correct quoting
$sql = 'DELETE FROM `subusers` WHERE `subusers`.`uid`=?';
//-----------------------------------^^^^^^^^^^^^^^^^^

总是在开发和测试代码时,它有助于启用PHP的display_errors ini directive,它会向屏幕输出错误和警告,而不是要求您深入了解错误日志(也建议error_reporting = E_ALL)。但无论如何,大多数默认设置都会将PHP错误记录到Web服务器的错误日志中,例如/var/log/apache2/error.log/var/log/httpd/error_log

基于第一条错误消息:

  

PHP警告:mysqli :: prepare():无法在第12行的/var/www/html/delpar.php中获取mysqli

很明显,$conn中的MySQLi连接对象已关闭或从未正确连接到开头。查看早期代码以验证尚未调用$conn->close()