【问题标题】:PHP PDO: Search array value inside of MySQL's JSON objectPHP PDO:在 MySQL 的 JSON 对象中搜索数组值
【发布时间】:2017-01-16 14:07:54
【问题描述】:

我在 MySQL 的 JSON-type 列中得到以下数据:

{"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; 
}

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

【问题讨论】:

  • 嗨,亚历克斯。当你得到答案时停止修改你的问题。它使答案看起来像一派胡言,对于可能找到您的问题并正在寻找类似答案的其他人来说毫无用处。

标签: php mysql json pdo


【解决方案1】:

您引用了占位符:

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

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

删除那些引号。

【讨论】:

  • 您是否在 PDO 中启用了异常?如果没有,try/catch 是没用的。 PDO 默认为“返回 boolean false 失败”。
  • 我发誓你在一小时前回答了一个非常相似的问题。一定是某处当前的课程作业
  • @RiggsFolly:嗯,现在是学年的开始。让其他人为您做作业/调试永远不会太早......
  • 我什至记得以与此相同的方式在另一个上解压脚本。哈哈
  • 好吧,那是因为你有PDOException $ex,但正在使用$e。但是,您仍然遇到异常,因此查询失败。但是您无法收到消息,因为您处理的异常错误。
【解决方案2】:

启用 PDO 例外后:

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

我收到明确的错误消息,说只能接受值作为第二个参数:

查询失败:SQLSTATE[22032]::3141 JSON 无效 函数 json_contains 的参数 2 中的文本:“文档根必须 不跟随其他值。”在第 8 位。 https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-contains

但是还有第三个可选的 [path] 参数可用: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; }

感谢马克 B。

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 2021-06-07
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2015-05-30
    • 2015-05-27
    相关资源
    最近更新 更多