为了账号安全,请及时绑定邮箱和手机立即绑定

JSON_CONTAINS 在准备好的语句中使用时不返回结果

JSON_CONTAINS 在准备好的语句中使用时不返回结果

PHP
翻过高山走不出你 2024-01-19 10:49:04
我正在编写一个子查询,以在显示字符时显示日记中的某些信息。这是我的功能。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);                            }                       } 代码本身是正确的,但返回空(没有任何错误)。当我在 phpmyadmin 的 sql 面板中使用数字运行此命令,并且我在 json contains 中的值周围使用双引号时,我实际上得到了结果,因此我将其重新格式化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}我做错了什么以及如何解决这个问题?顺便说一句,这是 MariaDB 10.2.27。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

问题

最初$characterid可能是一个整数,但你可以在这里更改它:

$id = '"'.$characterid.'"';

因此,这里可能无法成功绑定为整数:

mysqli_stmt_bind_param($stmt, 'i' , $id);

可能的解决方案

方法一

您可以考虑确保绑定为字符串,如下所示

mysqli_stmt_bind_param($stmt, 's' , $id);

最好确保$characterid确实是一个整数,例如。

$id = '"'.intval($characterid).'"';

方法2

或更新您的 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


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信