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 包含的值周围使用双引号时,我实际上得到了结果,因此我重新格式化了 characteridid,但仍然没有结果。

在 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