我正在编写一个子查询,以在显示字符时显示日记中的某些信息。这是我的功能。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
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消