php - prepare() 输出 bool false,语句对我来说看起来是正确的

标签 php mysql sql mysqli prepared-statement

<分区>

我有一个函数可以执行准备好的语句。我已经通过用异常捕获器包装 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 是整数)。

最佳答案

你有这个:

$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。你想要一个列名,而不是一个字符串绑定(bind)变量值。

使用字符串连接:

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

(希望我没有弄错。我已经有一段时间没有使用 PHP 和 SQL 了。)

关于php - prepare() 输出 bool false,语句对我来说看起来是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55436889/

相关文章:

php - 从 MySQL 查询而不是表中获取

mysql - 从许多表返回计数结果的 SQL 查询

mysql - 何时/应该在 1 中存在两个实体 :1 Relationship become a Single Entity?

mysql - 选择mysql中重复的字段

Java Aes 类转换为 php

PHP 在字符串中查找多个单词并包装在 <span> 标签中

php - 我如何获得通过与 Laravel 5/Eloquent 的两个多对多关系关联的不同类别列表?

php - Swiftmailer:无法与主机 smtp.gmail.com 建立连接 [连接超时 #110]

java - Kotlin 数据库错误 CursorIndexOutOfBoundsException

c# - 从 C# 中的 LINQ 中提取 SQL 列扩展属性