【问题标题】:String with an apostrophe not being updated in mysqli带撇号的字符串未在 mysqli 中更新
【发布时间】:2014-10-08 00:27:13
【问题描述】:

我正在使用准备好的语句来执行更新。但由于某种原因,包含撇号的字符串不会得到更新。有没有办法可以更新字符串并保留撇号??

以下是我的查询示例

$query = "UPDATE items SET item_name = ? , item_price = ? WHERE id = ? ";
    $stmt = $db->prepare($query);

    foreach($items_and_prices as $id => $item_and_price){
        $item = $item_and_price[0];
        $price = $item_and_price[1];
        $stmt->bind_param("sdi",$item, $price,$id);
        $stmt->execute();

    }

【问题讨论】:

  • 未更新”是什么意思?我建议您在创建 mysqli 连接之前添加以下内容 ~ mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  • 当我更新输入字段中的值然后刷新页面时,它不会显示带有撇号的字符串。例如,如果字符串最初是“Your”,而我将“Your”更新为“You're”。字符串将显示“Youre”,省略撇号。
  • 你如何显示记录?此外,您不应该在foreach 循环中使用bind_param()。您可以在调用prepare() 后立即绑定参数

标签: php mysqli prepared-statement


【解决方案1】:

您的字符串未正确插入的原因是撇号是特殊字符。将特殊字符插入 mysql 数据库的最佳方法是首先以某种方式转义它们。使用 PHP,您有很多不同的选择。

我将在这里解释其中的一些:

示例:$safestring = addslashes($orginalstring); 会导致所有特殊字符都用\ 转义,导致' 变为\',从而可以将特殊字符插入数据库。

你也可以使用stripslashes();在输出被addslashes();转义的代码时去掉\转义

【讨论】:

  • 没有。只是没有。 OP 正在使用准备好的语句,因此不需要转义。即使合适,他也应该使用可识别语言环境的mysqli_real_escape_string(),而不是粗暴且不可靠的addslashes()htmlentities()htmlspecialchars() 与它无关 - 它们用于在 输出 处编码数据,以便显示 HTML 特殊字符,而不是解释。
  • @MikeW htmlentities() 将允许撇号安全地输入数据库而不会引发错误,这正是 OP 正在寻找的。这些函数远非粗制滥造,它们在使特殊字符在 PHP 脚本和查询中安全使用方面做得很好
  • @pattyd 使用带有绑定参数的准备好的语句可以将撇号(以及其他可能不安全的字符)安全地输入数据库,而不会像 htmlentities() 那样破坏原始值。
【解决方案2】:

@MikeW @Phil htmlspecialchars 成功了。我需要使用 htmlspecialchars 包装值字符串。

例如

<input type=text name="category_name" value="<?php echo htmlspecialchars($category_name, ENT_QUOTES) ?>">

在 htmlspecialchars 之后指定 ENT_QUOTES 非常重要。没有它是行不通的。

感谢你们的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多