首页 > 解决方案 > 将 MySQL JSON_OBJECT() 与参数化查询一起使用

问题描述

我试图使用以下查询向 MySQL 表中插入一个条目。如果我将 MySQL 参数化查询与 mysqli 一起使用,如下所示,它可以正常工作。

insert into notelist(checksum,details,status,location) values('$checksum',JSON_OBJECT('filename','$filename','checksum','$checksum'),0,'$path')

但是,如果我使用下面的 mysqli 参数化查询,则会将错误“无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值”放入调试文件中。请有人帮忙解决这个问题。

$stmt = $con->prepare("insert into notelist(checksum,details,status,location) values(?,?,?,?)");
$stmt->bind_param("sbis", $checksum, $a = "JSON_OBJECT('filename','$filename','checksum','$checksum')", $b = 0, $path);
    $result = $stmt->execute();
if (false === $result) {
     file_put_contents("db.txt", "connecterror" . $stmt->error);
}

标签: phpmysqlmysqliprepared-statementmysql-json

解决方案


绑定时,您只想绑定值,而不是 SQL 函数、列或表。绑定引用该值并转义所有其他引号。您的查询应该是:

insert into notelist(checksum,details,status,location) values(?,JSON_OBJECT('filename',?,'checksum',?),?,?)

然后您应该绑定将要绑定的 5 个值。

$stmt->bind_param("sssis", $checksum, $filename, $checksum, 0, $path);

如当前所写,您的查询将JSON_OBJECT作为字符串包含:

'JSON_OBJECT(\'filename\',\'filename_VALUE\',\'checksum\',\'$checksum_VALUE\')'

推荐阅读