【问题标题】:How to escape single-quote (apostrophe) in string using php如何使用php转义字符串中的单引号(撇号)
【发布时间】:2017-01-30 18:59:05
【问题描述】:

我有一个这样的 SQL 查询:-

$stmt = $pdo->prepare(
   "SELECT * FROM `products_keywords` WHERE `product_type` = '" . $product_type . "' ");

我不知道 $product_type 变量中的值是什么。但是现在,我在 $product_type 变量中得到了 Men's Shirt,这导致了我的 SQL 查询中的语法错误。我确信这个错误是由于 Men's Shirt 值中的单引号引起的。我如何根据我的查询转义这个值?以及如何检查我的 $product_type 变量中是否有 单引号,然后根据我的查询对其进行转义。提前致谢。

【问题讨论】:

  • 男士衬衫 分配给 PHP Variable 并使用它。喜欢$prod = "Men's Shirt";
  • 使用参数绑定不会有这个问题:)
  • 您似乎错过了prepared SQL statements 的全部要点。其目的之一是避免通过字符串连接生成 SQL 查询。
  • @RakeshSojitra 感谢您的回复。你能详细点吗?并根据问题编辑我的查询。谢谢。
  • $query = $link->prepare('SELECT * FROM products_keywords WHERE product_type = :product_type'); $query->execute([':product_type' => $product_type]); # 无需逃避!

标签: php mysql pdo


【解决方案1】:

要在 PDO 语句中插入引号,只需使用 addslashes 函数。例如:

function insert($tagName)
{
    $tagName = addslashes($tagName);
    $rs = $this->db->prepare("INSERT INTO tags (tagName) VALUES ('$tagName')");
    $rs->execute();
}

【讨论】:

    【解决方案2】:

    你一直在寻求一个解决方案来逃避撇号。我同意您应该习惯使用查询参数的其他 cmets 和答案。它更干净、更容易。

    但 PDO 确实有转义功能。它叫PDO::quote()

    $product_type_quoted = $pdo->quote($product_type);
    
    $stmt = $pdo->prepare(
       "SELECT * FROM `products_keywords` 
        WHERE `product_type` = $product_type_quoted");
    

    请注意,quote() 会根据需要对字符串进行转义,并在其周围添加单引号,因此当您在 SQL 字符串中使用该变量时无需这样做。

    阅读文档以获取更多信息:http://php.net/manual/en/pdo.quote.php 事实上,您可以花几分钟阅读 PDO 文档自己回答这个问题。

    【讨论】:

      【解决方案3】:

      答案是你不需要。使用 PDO 的 prepare 的正确方法是这样的:

      $stmt = $pdo->prepare(
         "SELECT * FROM `products_keywords` WHERE `product_type` = ?");
      

      这就是使用准备好的语句的重点。那么你bind参数如下:

      $stmt->bindParam(1, $product_type)
      

      证明,

      架构:

      create table `products_keywords`
      (   `id` int not null,
          `products_keywords` varchar(1000) not null,
          `product_type` varchar(100) not null
      );
      insert `products_keywords` (`id`,`products_keywords`,`product_type`) values  
      (1,'zoom lawn cut mower',"Lawn Mower"),
      (2,'stylish torso Polo','Men\'s Shirt');
      

      查看数据:

      select * from `products_keywords`;
      +----+---------------------+--------------+
      | id | products_keywords   | product_type |
      +----+---------------------+--------------+
      |  1 | zoom lawn cut mower | Lawn Mower   |
      |  2 | stylish torso Polo  | Men's Shirt  |
      +----+---------------------+--------------+
      

      PHP:

      <?php
          // turn on error reporting, or wonder why nothing is happening at times
          error_reporting(E_ALL);
          ini_set("display_errors", 1);    
      
          $servername="localhost";
          $dbname="so_gibberish";
          $username="nate123";
          $password="openSesame1";
      
          try {
              $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
              $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      
              $product_type="Men's Shirt";
              $stmt = $pdo->prepare("SELECT * FROM `products_keywords` WHERE `product_type` = ?");
              $stmt->bindParam(1, $product_type);
              $stmt->execute();
              while($row = $stmt->fetch()) {
                  echo $row['id'].", ".$row['products_keywords'].", ".$row['product_type']."<br/>";
              }
          } catch (PDOException $e) {
              echo 'pdo problemo: ' . $e->getMessage();   // dev not production code
              exit();
          }
      ?>
      

      浏览器:

      【讨论】:

      • 如何在like子句中使用通配符?
      • 只需使用where product_type like ?
      • 你为什么不试试??
      • 请给我转义字符解决方案好吗?
      • 不,我不会,因为那不是使用 PDO 的正确方法。那么你可能已经开始使用 mysql_* 函数了
      【解决方案4】:

      我实际上建议这样做:

      $stmt = $pdo->prepare(
         'SELECT * FROM `products_keywords` WHERE `product_type` = :product_type');
      $res = $stmt->execute(array(':product_type' => $product_type));
      

      这样你就不需要转义任何东西并且你的查询是安全的。

      【讨论】:

      • 如何在like子句中使用通配符?
      • $res = $stmt->execute(array(':product_type' => $product_type.'%'));并在查询字符串中用“LIKE”替换“等于字符”
      • 请给我转义字符解决方案好吗?
      猜你喜欢
      • 2011-02-08
      • 2020-01-02
      • 2016-07-27
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多