【发布时间】:2018-01-06 02:34:59
【问题描述】:
我的数据应该在 JSON 格式的字符串中进行转义,因此我使用 PDO 的命名参数和 PDO::Prepare 来绑定它们。
因为带有撇号的 JSON 在 MySQL 查询中会导致错误,所以我必须在它周围使用单引号 - 尽管这会导致 PDO::Prepare 忽略 JSON 中的命名参数,所以它会因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 函数的类,如下所示:
function query($_query, $_params = array()) {
global $_DB; # <- Database connection object
$query = $_DB->prepare($_query);
if (! $query)
echo $_DB->errorInfo();
try {
$query->execute($_params);
} catch (PDOException $e) {
die( $e->getMessage() );
}
return $query;
}
【问题讨论】:
-
@LawrenceCherone 正如你所看到的,我正在使用 JSON_ARRAY_INSERT,它将这个 JSON 插入到
{}中,据我所知,它是有效的。而且我很确定为什么您认为我的:data参数不存在,它无效并且不会被替换,这就是整个问题,但是它就在那里,就像:email一样在那里。 -
你不能像这样使用 JSON_ARRAY_INSERT。编辑您的问题,询问如何做您需要的事情。老实说,我不知道它应该是什么。您是要覆盖整个数据还是什么?
-
@YourCommonSense 谢谢,你让我研究了不同的插入,显然 JSON_INSERT 更适合我的情况。我还设法使用 JSON_OBJECT 修复了代码,从而消除了对引号的需求。
-
请注意,这里的内容完全是一团糟。我只希望在您的新解决方案中正确使用参数
-
@YourCommonSense 我也希望如此:D 我会尽快发布答案 - 我的意思是,它可以正常工作并生成有效的 JSON,所以我可能做得对。直接来自 MySQL:
{"124": {"user_id": "email@email.com", "data": "asdfasdf"}, "125": {"user_id": "email@email.com", "data": "textofanothermessage"}, "126": {"user_id": "email@email.com", "data": "message3"}},这就是我想要做的。
标签: php mysql json pdo prepared-statement