【问题标题】:JSON_CONTAINS not returning result when used in prepared statementJSON_CONTAINS 在准备好的语句中使用时不返回结果
【发布时间】:2020-12-29 10:46:55
【问题描述】:

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

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() );
        
    }
    
}

本身的代码是正确的,但返回空(从来没有错误)。当我在 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。

【问题讨论】:

  • 1.在开发新代码时打开/打开error_reporting,这样您就可以实际看到错误消息。 2. 错误消息可能表明您需要转义该$,因为它位于双引号字符串中。
  • @Sammitch 错误报告已开启。在我的所有文件中,我打开了用于记录的 ini 命令,如果语句 sql 查询包含错误,我会以错误的形式返回结果。因此所有的检查。此外,错误日志是空的。
  • 你用的是Mysql还是MariaDB的哪个数据库?
  • @VishalSheth 10.2.27 MariaDB。查看主要信息

标签: php sql json mariadb prepared-statement


【解决方案1】:

问题

最初$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

【讨论】:

  • 今天晚些时候,当我可以访问我的代码时,我将通过这个解决方案。
  • Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement in .... Binding parameters failed: (0) 我也在绑定上添加了一个失败保存,你是对的,但是两个项目都失败了,要么我尝试两种方法。
  • 这是查询中的一个引用的东西,把它扔掉了,我选择了第一个解决方案,但我修改了它,但你把我引向了正确的方向,学分到期!
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多