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

我正在编写一个子查询,以在显示字符时显示日记中的某些信息。这是我的功能。


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。


翻过高山走不出你
浏览 108回答 1
1回答

犯罪嫌疑人X

问题最初$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
打开App,查看更多内容
随时随地看视频慕课网APP