【发布时间】:2018-07-15 12:37:12
【问题描述】:
我有一个基于 wordpress 的网站,它有一个 html 表单,通过 json 将数据保存在 mysql 数据库中。我是这样做的:
<?php
global $wpdb;
$db = $wpdb->prefix . 'db_table';
$json_query = $wpdb->get_row(
"
SELECT app, ts
FROM $db
WHERE user_id = $user_id
",
ARRAY_A
);
$json = json_decode($json_query[app], true);
?>
<label>Family Name</label>
<input type="text" name="json[family_name]" <?php echo ($json_ok[family_name] ? 'value="' . $json_ok[family_name] . '"' : ''); ?> />
<?php
$json_send = json_encode( $_POST['json'] );
if (isset($_POST['save'])) {
$wpdb->update(
$db,
array(
'app' => $json_send
),
array( 'user_id' => $user_id )
);
?>
它可以工作,但如果用户插入撇号字符,系统会保存撇号,前面有一个反斜杠。每次用户保存时,系统都会添加一个反斜杠。现在我的数据库中充满了这样的反斜杠:
{"family_name":"Rossi","indirizzo":"strada d\\\\\\\\\\\\\\\\\\\'oro","first_name":"Maurizio","country_birth":"Italy","city_birth":"Roma"}
我该如何解决这个问题? 谢谢
【问题讨论】:
-
您不应该将所有这些数据存储到单个列中,您应该将所有数据存储到它们自己的列中。
-
@GrumpyCrouton 他在哪里将所有这些存储在一个列中?他没有向您展示任何架构或数据库结构,所以这是一个假设。我相信这是一个 wordpress 网站,他使用 Wordpress 内置的 db 包装器来更新数据库中的项目,这会将数据与列匹配。更新函数很可能会在 php 代码中调用
addslashes()。解决方案是在从数据库中选择的任何地方去掉斜杠以避免递归。 -
@GrumpyCrouton 虽然这是使用 Wordpress,但不是普通的 php 函数。该函数很可能会解析 JSON 对象并将它们与定义的表匹配。
-
@JohnBell 我不是 WordPress 的忠实粉丝,我也不会使用它或它的任何功能 - 但如果 WordPress 函数旨在解析 JSON 字符串而不是内置数组然后有两件事要说;函数的设计者付出了比要求更多的努力,他们不应该那样做。
-
@FoscoVentura 当时可能更容易,但是遵循良好的做法,这样做绝不是一个好主意。它使以后更难使用数据或搜索表数据,并导致像您遇到的问题一样。我建议完全重做您的表结构以支持您需要的所有列,而不是将所有数据保存到单个列中。您以后可以随时添加更多列。