【问题标题】:Multiple slashes in database数据库中的多个斜杠
【发布时间】: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 当时可能更容易,但是遵循良好的做法,这样做绝不是一个好主意。它使以后更难使用数据或搜索表数据,并导致像您遇到的问题一样。我建议完全重做您的表结构以支持您需要的所有列,而不是将所有数据保存到单个列中。您以后可以随时添加更多列。

标签: php mysql wordpress forms


【解决方案1】:

在 wordpress 中保存和使用 json 编码的字符串时,我自己也处理过同样的问题。这就是为我解决的问题。

在输入中显示值时只需调用stripslashes();

像这样:

<input type="text" name="json[family_name]" <?php echo (stripslashes($json_ok[family_name]) ? 'value="' . stripslashes($json_ok[family_name]) . '"' : ''); ?> />

当它再次被保存时,它将停止添加那些额外的斜线。正如John Bell 的评论中提到的,当您调用更新函数时,它正在调用addlashes()。

【讨论】:

  • 所以基本上与我在您之前 12 分钟发布的答案几乎完全相同......
  • 你没有调用 stripslashes
  • @JohnBell 我会说这是一个稍微好一点的解决方案,因为 stripslashes 会比 str_replace 工作得更好。
  • xD 我调用了与 stripslashes 相同的 PHP。书呆子哈哈。
  • @JohnBell 好吧,纯粹从语法的角度来看,理解 stripslashes 的作用要容易得多(对于没有经验的程序员来说)。更不用说它更短了。
猜你喜欢
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2019-09-18
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多