【问题标题】:Query for sanitized single quotes in MySQL database.在 MySQL 数据库中查询已清理的单引号。
【发布时间】:2016-08-30 12:49:55
【问题描述】:

将姓名插入客户数据库时,我使用 MySQLi 函数 real_escape_string 来清理数据。带有单引号的示例条目现在如下所示:

Baker\'s Pharmacy

但是,当我尝试使用以下查询查询名称时:

$search = "Baker's Pharmacy";
$searchName = $db->real_escape_string($search);
$query = "SELECT Name FROM Customers WHERE Name = '$searchName'";

我没有返回任何匹配项,搜索经过处理的单引号的正确方法是什么?

非常感谢任何帮助!

【问题讨论】:

  • 尝试$search = "Baker\\\'s Pharmacy";,不要使用real_escape_string
  • 正确的方法是存储实际数据而不是数据的修改版本,然后搜索您要查找的实际数据。您应该使用查询参数将输入视为值,而不是在将其作为代码执行之前手动清理输入。
  • 应该是Baker's Pharmacy,不带斜线。您似乎两次转义了数据。
  • @你的常识好点!
  • 只有一个 real_escape_string 可以在数据输入上运行,还有什么可以净化输入的吗?魔术引号肯定是关闭的。

标签: php mysql mysqli


【解决方案1】:

有两个错误的假设需要澄清。

  1. 无论*escape_string 函数不会清理任何内容。这只是一个令人讨厌的谣言,说 PHP 人最好最终摆脱它。
  2. 无论如何,通过使用此功能,您不是为数据库格式化数据,而是仅为 SQL 查询格式化数据。数据库会删除所有斜线,并按原样存储数据。

您必须对插入和选择查询使用 mysqli 准备语句,而不是“清理”,而且您不会看到与引号相关的单个问题(除非有 magic_quotes 或其自制的等价物存在)。

【讨论】:

  • 我同时使用准备好的查询和 esacpe_string 作为数据输入,这样可以解释数据库中出现的反斜杠,是否有一个查询可以运行以从数据库中删除现有的斜杠,因为有太多手动删除。
  • 嗯,就是这样。 esacpe_string 在这里是多余的,也是您问题的根源。不幸的是,我不知道一个现成的查询来清理您的数据。在这方面可能会问另一个问题
  • 我设法编写了一个小的 PHP 脚本来解决这个问题,感谢所有帮助!一个过于小心的案例。
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 2018-09-03
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多