提问人:SKisby 提问时间:7/15/2020 最后编辑:SKisby 更新时间:7/15/2020 访问量:212
带有 bind_result() / fetch() 的 JSON 类型字段 mysqli 准备好的语句不起作用
JSON type field with bind_result() / fetch() mysqli prepared statements not working
问:
如何使用使用 / 的 mysqli 预准备语句从 JSON 类型字段中获取数据?或者在表中,我是否必须将该 JSON 类型字段更改为文本类型字段?bind_result()
fetch()
如果字段类型是 JSON,那么我从下面的准备好的语句中得到的只是 NULL。其他一切正常。
mysql版本为5.7.30,PHP版本为5.6.40。
我的主机没有安装 mysqlnd,所以我无法使用 和 .get_result()
fetch_assoc()
这是我想开始工作的代码:
<?php
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query = 'SELECT id, text, json FROM test WHERE id = 1';
$stmt = $db->prepare($query);
$stmt->execute();
$data = [];
$stmt->bind_result($data["id"], $data["text"], $data["json"]);
while ($stmt->fetch()) {
$row = [];
foreach ($data as $key => $val) {
$row[$key] = $val;
}
// $array[] = $row;
}
var_dump( $row ); // Array of first row
/* Output
array(3) {
["id"]=>
int(1)
["text"]=>
string(7) "Chart 1"
["json"]=>
NULL
}
*/
$stmt -> close();
使用不太安全/访问相同$query的方式,我能够毫无问题地从 JSON 类型文件中获取数据:query()
mysqli_fetch_assoc()
<?php
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query = 'SELECT id, text, json FROM test WHERE id = 1';
$result = $db->query($query);
$row = mysqli_fetch_assoc($result);
var_dump( $row ); // Array of first row
/* Output
array(3) {
["id"]=>
string(1) "1"
["text"]=>
string(7) "Chart 1"
["json"]=>
string(21) "{"a": 0, "p": "asdf"}"
}
*/
下面是为上述内容创建表“test”的代码:
<?php
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if ($db->connect_errno)
echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
if (!$db->query("DROP TABLE IF EXISTS test") ||
!$db->query("CREATE TABLE test(id INT, text TEXT, json JSON)") ||
!$db->query("INSERT INTO test(id, text, json) VALUES (1, 'Chart 1', '{\"p\":\"asdf\",\"a\":0}')")) {
echo "Table creation failed: (" . $db->errno . ") " . $db->error . "\r";
}
我在将 mysqli / 代码转换为更具 SQL 注入阻力的预处理语句时遇到了这个问题。除了这个 json-field-returns-null 问题之外,我已经设法让它一切正常。我只能找到与使用mysqli prepared 语句相关的 JSON 字段的提及: 命令不同步; 您现在无法运行此命令query()
mysqli_fetch_assoc()
答: 暂无答案
评论
$stmt->bind_result($id, $text, $json); $stmt->fetch(); var_dump($id, $text, $json);