带有 bind_result() / fetch() 的 JSON 类型字段 mysqli 准备好的语句不起作用

JSON type field with bind_result() / fetch() mysqli prepared statements not working

提问人:SKisby 提问时间:7/15/2020 最后编辑:SKisby 更新时间:7/15/2020 访问量:212

问:

如何使用使用 / 的 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()

php json mysqli 预备语句

评论

0赞 Phil 7/15/2020
幽默我并尝试$stmt->bind_result($id, $text, $json); $stmt->fetch(); var_dump($id, $text, $json);
1赞 Dharman 7/15/2020
如果您仍在使用 PHP 5,我强烈建议您尽快升级。此版本不再受支持。让拉斯穆斯·勒多夫(Rasmus Lerdorf)向您解释
2赞 Dharman 7/15/2020
如果您正在转换代码,那么如果您直接转换为 PDO 而不是必须处理 mysqli,那会容易得多。PDO要容易得多。如果您的主机没有为您提供现代PHP版本,那么是时候更换主机了!

答: 暂无答案