PDO命名参数JSON

时间:2018-01-06 02:34:59

标签: php mysql json pdo prepared-statement

我有数据应该在JSON格式的字符串中进行转义,所以我使用PDO的命名参数和PDO :: Prepare绑定它们。 因为带有它的撇号的JSON会导致MySQL查询出错,所以我必须在它周围使用单引号 - 虽然这会导致PDO :: Prepare忽略JSON中的命名参数,所以它失败了{{1} }。

任何想法如何解决这个问题?

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

为了解释一下代码,function send($_data) { global $_SESSION; global $dbApi; #These are temporary debug variables: $_SESSION['room_id'] = 1; $id = 124; $json = '"' . $id . '": {"user_id": ":email","data": ":data"}'; $query = "UPDATE `room_index` " . "SET `data` = JSON_ARRAY_INSERT(`data`, '$[0]', '" . $json . "') " . "WHERE `id` = :room_id"; $dbApi->query($query, array(':email' => $_SESSION['email'], ':data' => $_data, ':room_id' => $_SESSION['room_id'])); } :email)不一定是一个参数,但这样更干净。主要问题是$_SESSION['email']:data) - 用户直接从$_data通过JS输入。

textarea是一个具有正确$dbApi功能的类,如下所示:

query

1 个答案:

答案 0 :(得分:3)

代码有两个问题。

1。 JSON_INSERT更合适。

当我将命名对象插入另一个对象(顶级文档)时,JSON_INSERT会立即提供这样的语法

2。使用JSON_OBJECT而不是手动编写JSON语法

由于我的主要问题是,PDO不能替换单引号或双引号参数,因此解决方案使用的是JSON_OBJECT,它不需要双引号,因为它们会在以后自动生成(我的假设) - 但是在PDO替换变量之后,还会在它们周围放置单引号。

新的测试代码输出有效的JSON:

#Temporary, to avoid other unrelated issues
$_SESSION['room_id'] = 1;
$_SESSION['email'] = 'email@email.com';
$id = 123;

$json  = 'JSON_OBJECT("user_id", :email, "data", :data)';
$query  = "UPDATE `room_index` " . 
          "SET `data` = JSON_INSERT(`data`, :id, $json) " .
          "WHERE `id` = :room_id";

$dbApi->query($query, [':id' => "$." . $id,
                       ':email' => $_SESSION['email'],
                       ':data' => $_data,
                       ':room_id' => $_SESSION['room_id']]);
相关问题