JSON_CONTAINS 在准备语句中使用时不返回结果
JSON_CONTAINS not returning result when used in prepared statement
我正在编写一个子查询,以在显示字符时显示日志中的某些信息。这是我的功能。
function getcharacterstories($con, $characterid) {
$id = '"'.$characterid.'"';
$sql = "SELECT dtr_entries.entreetitle,
dtr_entries.entreeinternallink,
dtr_entries.entreetimestamp
FROM dtr_entries
WHERE JSON_CONTAINS(entreeattachments, ?, '$.character')
AND dtr_entries.entreetype = 3";
$stmt = mysqli_prepare($con, $sql);
if(!$con->connect_errno) {
$stmt = mysqli_prepare($con, $sql);
if ($stmt) {
if (!empty($characterid)) {
mysqli_stmt_bind_param($stmt, 'i' , $id);
}
// shoot it all to the database
if(!mysqli_stmt_execute($stmt)) {
echo "error in following query:". $sql;
echo 'stmt error: '.mysqli_stmt_error($stmt);
} else {
mysqli_stmt_bind_result($stmt, $title, $link, $timestamp);
while (mysqli_stmt_fetch($stmt)){
echo $title;
}
mysqli_stmt_close($stmt);
}
} else {
pre($con);
echo $sql;
die('mysqli error: '.mysqli_error($con));
}
} else {
die( 'connect error: '.mysqli_connect_error() );
}
}
代码本身是正确的,但是 returns 是空的(从来没有错误)。当我 运行 在 phpmyadmin 的 sql 面板中使用数字并且我在 json 包含的值周围使用双引号时,我实际上得到了结果,因此我重新格式化了 characterid
到 id
,但仍然没有结果。
在 phpmyadmin 中查询产生的结果如下。
SELECT dtr_entries.entreetitle, dtr_entries.entreeinternallink, dtr_entries.entreetimestamp FROM dtr_entries WHERE JSON_CONTAINS(entreeattachments, '"1"', '$.character') AND dtr_entries.entreetype = 3
存储在entreeattachments列中的数据如下
{"character":"1","updated-by":"Lazarus","update-time":1599124101}
我做错了什么,我该如何解决?
顺便说一句,这是 10.2.27 MariaDB。
问题
最初 $characterid
可能是一个整数,但您可以在此处更改它:
$id = '"'.$characterid.'"';
因此可能无法在此处成功绑定为整数:
mysqli_stmt_bind_param($stmt, 'i' , $id);
可能的解决方案
方法一
您可以考虑确保绑定为字符串,如下所示
mysqli_stmt_bind_param($stmt, 's' , $id);
最好确保$characterid
确实是一个整数,例如
$id = '"'.intval($characterid).'"';
方法二
或更新您的 sql 以按预期引用参数:
$sql = "SELECT dtr_entries.entreetitle,
dtr_entries.entreeinternallink,
dtr_entries.entreetimestamp
FROM dtr_entries
WHERE JSON_CONTAINS(entreeattachments, '\"?\"', '$.character')
AND dtr_entries.entreetype = 3";
并使用
$id = $characterid;
其他资源
正在判断绑定时是否有错误-https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
我正在编写一个子查询,以在显示字符时显示日志中的某些信息。这是我的功能。
function getcharacterstories($con, $characterid) {
$id = '"'.$characterid.'"';
$sql = "SELECT dtr_entries.entreetitle,
dtr_entries.entreeinternallink,
dtr_entries.entreetimestamp
FROM dtr_entries
WHERE JSON_CONTAINS(entreeattachments, ?, '$.character')
AND dtr_entries.entreetype = 3";
$stmt = mysqli_prepare($con, $sql);
if(!$con->connect_errno) {
$stmt = mysqli_prepare($con, $sql);
if ($stmt) {
if (!empty($characterid)) {
mysqli_stmt_bind_param($stmt, 'i' , $id);
}
// shoot it all to the database
if(!mysqli_stmt_execute($stmt)) {
echo "error in following query:". $sql;
echo 'stmt error: '.mysqli_stmt_error($stmt);
} else {
mysqli_stmt_bind_result($stmt, $title, $link, $timestamp);
while (mysqli_stmt_fetch($stmt)){
echo $title;
}
mysqli_stmt_close($stmt);
}
} else {
pre($con);
echo $sql;
die('mysqli error: '.mysqli_error($con));
}
} else {
die( 'connect error: '.mysqli_connect_error() );
}
}
代码本身是正确的,但是 returns 是空的(从来没有错误)。当我 运行 在 phpmyadmin 的 sql 面板中使用数字并且我在 json 包含的值周围使用双引号时,我实际上得到了结果,因此我重新格式化了 characterid
到 id
,但仍然没有结果。
在 phpmyadmin 中查询产生的结果如下。
SELECT dtr_entries.entreetitle, dtr_entries.entreeinternallink, dtr_entries.entreetimestamp FROM dtr_entries WHERE JSON_CONTAINS(entreeattachments, '"1"', '$.character') AND dtr_entries.entreetype = 3
存储在entreeattachments列中的数据如下
{"character":"1","updated-by":"Lazarus","update-time":1599124101}
我做错了什么,我该如何解决?
顺便说一句,这是 10.2.27 MariaDB。
问题
最初 $characterid
可能是一个整数,但您可以在此处更改它:
$id = '"'.$characterid.'"';
因此可能无法在此处成功绑定为整数:
mysqli_stmt_bind_param($stmt, 'i' , $id);
可能的解决方案
方法一
您可以考虑确保绑定为字符串,如下所示
mysqli_stmt_bind_param($stmt, 's' , $id);
最好确保$characterid
确实是一个整数,例如
$id = '"'.intval($characterid).'"';
方法二
或更新您的 sql 以按预期引用参数:
$sql = "SELECT dtr_entries.entreetitle,
dtr_entries.entreeinternallink,
dtr_entries.entreetimestamp
FROM dtr_entries
WHERE JSON_CONTAINS(entreeattachments, '\"?\"', '$.character')
AND dtr_entries.entreetype = 3";
并使用
$id = $characterid;
其他资源
正在判断绑定时是否有错误-https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php