【问题标题】:Best way to replace single quotes to search against a database correctly?替换单引号以正确搜索数据库的最佳方法?
【发布时间】:2012-09-14 02:44:29
【问题描述】:

我正在开发一个应用程序,通过多个不同的条件搜索用户。可用条件之一是按名称搜索。名称存储在数据库中,去除了 HTML 字符,例如。 ' 存储为 '。这样做的问题是,如果用户通过输入常规英文名称的名称进行搜索,它会在数据库中查找英文名称而不是 HTML 剥离的名称。我尝试过使用 htmlspecialchars($string, ENT_QUOTES),但由于某种原因,它并不总是正确地替换单引号。谁能想到为什么会发生这种情况,或推荐更好的方法?谢谢!

【问题讨论】:

  • 引号应该使用数据库供应商特定的转义函数进行转义。
  • ENT_QUOTES 是一个常量,它不需要$ 前缀。也就是说,查看进行' -> ' 转换的代码,并在代码中重用相同的逻辑。并希望转换过去、现在和将来都是一致的。
  • 我仍然无法让它工作。 htmlentities_decode($string) 甚至无法将 ' 解码回单个撇号。字符编码会以任何方式影响这一点吗?

标签: php sql database web-applications validation


【解决方案1】:

您不需要替换单引号。您需要做的就是使用 PDOMySQLi 扩展名。 PDO 示例,

$stmt = $pdo->prepare('SELECT * FROM tableName WHERE name = :name');

$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) 
{
    // do something with $row
}

这样,即使值有单引号,它也允许您搜索。

【讨论】:

【解决方案2】:

尝试使用此html_entity_decode($string) 而不是htmlspecialchars($string, ENT_QUOTES);

【讨论】:

    【解决方案3】:

    两个都不错,但你也可以试试这个......

     function change_text($in, $out, $text){
    
    $input = array($in);
    $change = array($out) ;
    $result = @str_replace ($input ,$change, $text);
    return $result;
    }
    
    $change_text = change_text("'", '',$text);
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      在您的查询中,将您的 '(引号)替换为 ''。第一个引号将按原样使用此引号之后的字符。

      下面的示例代码:

      mysql> select * from activities where activity='aku''kamu';
      +----+----------+---------+
      | id | activity | user_id |
      +----+----------+---------+
      |  1 | aku'kamu |       3 |
      +----+----------+---------+
      1 row in set (0.00 sec)
      
      mysql> update activities set activity='aku''kamu' where id=2
      Query OK, 1 row affected (0.06 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      mysql> select * from activities where activity='aku''kamu';
      +----+----------+---------+
      | id | activity | user_id |
      +----+----------+---------+
      |  1 | aku'kamu |       3 |
      |  2 | aku'kamu |       3 |
      +----+----------+---------+
      2 rows in set (0.00 sec)
      
      mysql>
      

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 2010-11-14
        • 1970-01-01
        • 2011-09-08
        • 2017-07-27
        相关资源
        最近更新 更多