PHP PDO:在 MySQL 的 JSON 对象内搜索数组值

Ale*_*x G -3 php mysql json pdo

我在MySQL的JSON类型列中得到以下数据:

{"2": [2, 3], "3": [29], "71": "test"}
Run Code Online (Sandbox Code Playgroud)

我需要搜索属性“2”内的数组值,当变量放置在查询中时效果很好,但在使用 PHP 的 PDO 数组时则不行。

$field_id = 2; 
$option_id = 2;
$query = "SELECT id FROM notes WHERE JSON_CONTAINS(data, '{\"$field_id\": $option_id }')";
try { 
    $stmt = $dbh->prepare($query); 
    $stmt->execute(); 
    $used_qty = $stmt->rowCount(); 
} catch(PDOException $ex) { 
    echo 'Query failed: ' . $e->getMessage(); 
    exit; 
}
// $used_qty returns 1 which is correct;
Run Code Online (Sandbox Code Playgroud)

通过数组绑定返回 0:

$query = "SELECT id FROM notes WHERE JSON_CONTAINS(data, '?')";
try { 
    $stmt = $dbh->prepare($query); 
    $stmt->execute(array('{"' . $field_id . '": ' . $option_id . '}"')); 
    $used_qty = $stmt->rowCount(); 
} catch(PDOException $ex) { 
    echo 'Query failed: ' . $e->getMessage(); 
    exit; 
}
Run Code Online (Sandbox Code Playgroud)

无法弄清楚我在这里错过了什么。请帮忙。谢谢。

Mar*_*c B 5

您引用了占位符:

$query = "SELECT id FROM notes WHERE JSON_CONTAINS(data, '?')";
                                                         ^-^--
Run Code Online (Sandbox Code Playgroud)

这意味着它不是占位符,而是包含问号的字符串。

删除那些引号。