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