2016-09-08 5 views
-3

の内部検索配列値Iは、MySQLのJSON型カラムで、次のデータを得た:PHP PDO:MySQLのJSONオブジェクト

{"2": [2, 3], "3": [29], "71": "test"} 

を私は属性の内部で配列値を検索する必要があり、「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; 

は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; 
} 

は、私がここに逃したかを把握することはできません。 助けてください。ありがとう。

+1

Hey Alex。あなたが答えを得るにつれてあなたの質問を修正しないでください。それは答えが無意味に見えるようにし、あなたの質問を見つけることができ、似たような答えを探している人には役に立たない。 – RiggsFolly

答えて

0

PDOの例外を有効にした後:

$dbh = new PDO($dsn, $dsn_user, $dsn_password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

Iのみ値が2番目のパラメータとして受け入れることができるという明確なエラーメッセージを得た:

Query failed: SQLSTATE[22032]: <>: 3141 Invalid JSON text in argument 2 to function json_contains: "The document root must not follow by other values." at position 8. https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-contains

しかし、第三のオプション[パス]パラメータが存在します利用可能:私がまさに必要であるJSON_CONTAINS(json_doc, val[, path])

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

Marc B.に感謝します。

3

あなたのプレースホルダを引用:

$query = "SELECT id FROM notes WHERE JSON_CONTAINS(data, '?')"; 
                 ^-^-- 

それは、それは疑問符を含む文字列のプレースホルダーですありませんを意味しています。

これらの引用符を削除します。

+0

まだ動作しません。私はすでに引用符なしでそれを試しました。 –

+0

PDOで例外を有効にしましたか?そうでなければ、try/catchは役に立たない。 PDOのデフォルトは、 "boolean falseを返すことによって失敗する"です。 –

+0

私は1時間前にあなたに非常に似た質問に答えたと誓っています。それはどこかで現在の授業科目でなければなりません – RiggsFolly

関連する問題