我有这样的SQL查询: -
$stmt = $pdo->prepare(
"SELECT * FROM `products_keywords` WHERE `product_type` = '" . $product_type . "' ");
我不知道 $ product_type 变量中的值是多少。但是现在,我在 $ product_type 变量中获得男士衬衫,这导致我的SQL查询中出现语法错误。我确定这个错误是由男士衬衫值中的单引号引起的。我如何根据我的查询来逃避这个值?以及如何检查 $ product_type 变量中是否存在单引号,然后根据我的查询将其转义。提前致谢。
答案 0 :(得分:6)
答案是你不需要。使用PDO准备的正确方法是这样的:
$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();
}
?>
浏览器:
答案 1 :(得分:2)
我实际上建议按以下方式进行:
[
{
"description": "testcase1",
"assertions": [
{
"passed": true
}
],
"duration": 1246
},
{
"description": "testcase2",
"assertions": [
{
"passed": true
}
],
"duration": 4
}
]
这样您就不需要转义任何内容,并且您的查询是安全的。
答案 2 :(得分:1)
要在PDO语句中插入引号,只需使用addslashes
函数即可。例如:
function insert($tagName)
{
$tagName = addslashes($tagName);
$rs = $this->db->prepare("INSERT INTO tags (tagName) VALUES ('$tagName')");
$rs->execute();
}
答案 3 :(得分:0)
你一直在寻求逃避撇号的解决方案。我同意您应该习惯使用查询参数的其他注释和答案。它更干净,更容易。
但是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文档来自己回答这个问题。