我有数据应该在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
答案 0 :(得分:3)
代码有两个问题。
当我将命名对象插入另一个对象(顶级文档)时,JSON_INSERT会立即提供这样的语法
由于我的主要问题是,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']]);