如何在string中使用php转义单引号(撇号)

我有这样的SQL查询:

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

我不知道$ product_typevariables中的值是什么。 但现在,我得到男装衬衫 $ product_typevariables这是导致我的SQL查询语法错误。 我相信这个错误是由于男士衬衫价值的单引号。 我如何根据我的查询逃避这个值? 以及如何检查我的$ product_typevariables是否有单引号 ,然后根据我的查询转义它。 提前致谢。

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

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

这是使用预先准备的陈述的重点。 然后你绑定参数如下:

 $stmt->bindParam(1, $product_type) 

certificate,

架构:

 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(); } ?> 

浏览器:

在这里输入图像描述

我实际上build议这样做的方式如下:

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

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

为了在PDO语句中插入一个引用,只需使用addslashes函数。 例如:

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

你不断要求解决scheme逃离撇号。 我同意你应该习惯使用查询参数的其他评论和答案。 它更干净,更容易。

但是PDO确实有一个转义的function。 它叫做PDO :: quote() :

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

请注意,quote()会根据需要转义string,并在其周围添加单引号,所以当您在SQLstring中使用该variables时,不需要这样做。

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