1

我通过 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(),引用者:

4

1 回答 1

4

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

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

始终在开发和测试代码时,启用 PHP 的display_errorsini 指令会有所帮助,该指令会将错误和警告打印到屏幕上,而不是要求您深入查看错误日志(也推荐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

很明显,您的 MySQLi 连接对象在$conn开始时要么已关闭,要么从未正确连接。查看之前的代码以验证$conn->close()尚未调用。

于 2016-01-12T19:38:00.183 回答