如何在 MySQL 数据库中存储 JSON 字符串
Posted
技术标签:
【中文标题】如何在 MySQL 数据库中存储 JSON 字符串【英文标题】:How to store JSON string in MySQL db 【发布时间】:2012-02-17 22:21:34 【问题描述】:我使用下面的代码将 JSON 数据存储在 mysql 表中。如果 JSON 很短但会因较长的文本而中断,则它可以正常工作。 “field_json”是一个 LONGTEXT。
$sql = sprintf("UPDATE mytable
SET field_json = '$json_string'
WHERE id = $userid");
$result = mysql_query($sql);
我得到的错误是:
无效查询:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在'G附近使用 '","username":"C0WB0Y","lastName":"","id":31874363,"pathToPhoto":"22960/photo' 在第 2 行
【问题讨论】:
请,请,请考虑使用prepared statements。好吧,只有当您希望您的网站不受黑客攻击时... 作为一个侧节点,如果你将 JSON 存储在 mysql 表中,也许你应该考虑使用更适合存储此类数据的数据库,如 CouchDB、MongoDB 等 好点。这仅适用于我想保存 json 以防我必须再次处理它的导入作业 【参考方案1】:使用占位符,否则容易受到 SQL 注入:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
否则,这里有一个快速修复:http://php.net/manual/en/function.mysql-real-escape-string.php
$sql = sprintf(
"UPDATE mytable SET field_json = '%s' WHERE id = '%s'",
mysql_real_escape_string($json_string),
mysql_real_escape_string($userid)
);
$result = mysql_query($sql);
编辑
请使用 PDO (http://www.php.net/manual/en/book.pdo.php)。从 5.5 开始,mysql
扩展已被弃用
【讨论】:
$userid
可以进行 SQL 注入。您可以使用(int) $userid
代替 mysql_real_escape_string。
问题没有指定 id 字段的数据类型,但在我工作过的系统中,用户 id 是 uuid,而不是 int。【参考方案2】:
试试这个
$json_string = mysql_real_escape_string( $json_string );
$sql = sprintf("UPDATE mytable
SET field_json = '$json_string'
WHERE id = $userid");
$result = mysql_query($sql);
【讨论】:
可以使用 $userid 进行 SQL 注入【参考方案3】:转义 JSON 字符串:
$json_string = mysql_real_escape_string( $json_string);
$sql = sprintf("UPDATE mytable
SET field_json = '$json_string'
WHERE id = $userid");
$result = mysql_query($sql);
【讨论】:
在您的示例中,$userid 可能会导致 SQL 注入。 它可以,但我们不仅不知道$userid
来自哪里,它也不是 OPs 问题的根源。
虽然不是 OP 问题,但提供的示例默默地留下了潜在的安全问题。
谢谢。关于安全的好点。这是一项导入工作,因此安全不是问题。【参考方案4】:
您需要转义 JSON 字符串中的引号 - 否则它们会终止 SQL 查询,从而导致您遇到异常。
【讨论】:
以上是关于如何在 MySQL 数据库中存储 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何定义一个表来存储 MySQL 数据库中的 JSON 对象?