prepare() 输出 bool false,语句对我来说看起来是正确的
prepare() outputs bool false, statement looks correct to me
我有一个函数可以执行准备好的语句。我已经通过用异常捕获器包装 prepare()
行来将问题定位到 SQL 代码,但我无法弄清楚它有什么问题。
这是函数
function update_table($column, $value, $conn, $email) {
require "config.php";
$stmtupdate = $conn->prepare("UPDATE $table SET ? = ? WHERE email = ?");
$stmtupdate->bind_param("sis", $column, $value, $email);
$stmtupdate->execute();
$stmtupdate->close();
}
这是函数调用之一
update_table("failedCount", 0, $conn, $email);
页面打印错误
Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in /var/www/html/usenergy/login.php:125 Stack trace: #0 /var/www/html/usenergy/login.php(218): update_table('failedCount', 0, Object(mysqli), 'testmail@test...') #1 {main} thrown in /var/www/html/usenergy/login.php on line 125
column
是一个字符串,它定义了 $value 将被设置为的列名称($value 是整数)。
prepare()
方法可能 return 错误,您应该检查一下。至于为什么 return 是假的,也许 table 名称或列名称(在 SET 或 WHERE 子句中)不正确?
尝试更多这样的:
$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);
此外,考虑使用 $conn->error_list
之类的东西来检查解析 SQL 时发生的错误。 (我偶尔会回显实际的 SQL 语句字符串并粘贴到 phpMyAdmin 中进行测试,但肯定有什么地方失败了。)
你有这个:
$stmtupdate = $conn->prepare("UPDATE $table SET ? = ? WHERE email = ?");
$stmtupdate->bind_param("sis", $column, $value, $email);
这导致 SQL:
UPDATE $table
SET @var1 = @var2 WHERE email = @var3
例如替换为
UPDATE $table
SET 'column' = 123 WHERE email = 'something'
但是你想要
UPDATE mytable
SET mycolumn = 123 WHERE email = 'something'
所以有两个错误:你想要一个 table 名字,而不是 $table。你想要一个列名,而不是一个字符串绑定变量值。
使用字符串连接:
$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);
(希望我没记错。我已经有一段时间没把 PHP 和 SQL 一起使用了。)
我有一个函数可以执行准备好的语句。我已经通过用异常捕获器包装 prepare()
行来将问题定位到 SQL 代码,但我无法弄清楚它有什么问题。
这是函数
function update_table($column, $value, $conn, $email) {
require "config.php";
$stmtupdate = $conn->prepare("UPDATE $table SET ? = ? WHERE email = ?");
$stmtupdate->bind_param("sis", $column, $value, $email);
$stmtupdate->execute();
$stmtupdate->close();
}
这是函数调用之一
update_table("failedCount", 0, $conn, $email);
页面打印错误
Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in /var/www/html/usenergy/login.php:125 Stack trace: #0 /var/www/html/usenergy/login.php(218): update_table('failedCount', 0, Object(mysqli), 'testmail@test...') #1 {main} thrown in /var/www/html/usenergy/login.php on line 125
column
是一个字符串,它定义了 $value 将被设置为的列名称($value 是整数)。
prepare()
方法可能 return 错误,您应该检查一下。至于为什么 return 是假的,也许 table 名称或列名称(在 SET 或 WHERE 子句中)不正确?
尝试更多这样的:
$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);
此外,考虑使用 $conn->error_list
之类的东西来检查解析 SQL 时发生的错误。 (我偶尔会回显实际的 SQL 语句字符串并粘贴到 phpMyAdmin 中进行测试,但肯定有什么地方失败了。)
你有这个:
$stmtupdate = $conn->prepare("UPDATE $table SET ? = ? WHERE email = ?");
$stmtupdate->bind_param("sis", $column, $value, $email);
这导致 SQL:
UPDATE $table
SET @var1 = @var2 WHERE email = @var3
例如替换为
UPDATE $table
SET 'column' = 123 WHERE email = 'something'
但是你想要
UPDATE mytable
SET mycolumn = 123 WHERE email = 'something'
所以有两个错误:你想要一个 table 名字,而不是 $table。你想要一个列名,而不是一个字符串绑定变量值。
使用字符串连接:
$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);
(希望我没记错。我已经有一段时间没把 PHP 和 SQL 一起使用了。)