prepare()输出bool false,语句对我来说是正确的[重复]

问题描述 投票:1回答:2

我有一个执行预准备语句的函数。我已经通过将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是一个字符串,它定义了$ name将被设置为的列名($ value是整数)。

php mysql sql mysqli prepared-statement
2个回答
0
投票

你有这个:

$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。并且您需要列名称,而不是字符串绑定变量值。

使用字符串连接:

$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);

(我希望我没有记错。自从我将PHP与SQL一起使用以来已经有一段时间了。)


0
投票

prepare()方法可以返回false,你应该检查它。至于为什么它返回false,表名或列名(在SET或WHERE子句中)可能不正确?

尝试更像这样:

$stmtupdate = $conn->prepare("UPDATE ".$table." SET ".$column." = ? WHERE email = ?");
$stmtupdate->bind_param("is", $value, $email);

另外,考虑使用类似$conn->error_list的东西来检查解析SQL时发生的错误。 (我偶尔会回复实际的SQL语句字符串并粘贴到phpMyAdmin进行测试,但肯定会有一些失败。)

© www.soinside.com 2019 - 2024. All rights reserved.