У меня есть SQL-запрос:
$stmt = $pdo->prepare( "SELECT * FROM `products_keywords` WHERE `product_type` = '" . $product_type . "' ");
Я не знаю, что будет значением в переменной $ product_type . Но теперь я получаю мужскую рубашку в переменной $ product_type, которая вызывает синтаксическую ошибку в моем SQL-запросе. Я уверен, что эта ошибка связана с одной цитатой в Men's Shirt . Как я избегаю этого значения в соответствии с моим запросом? И как проверить, есть ли одиночная кавычка в моей переменной $ product_type, а затем избежать ее в соответствии с моим запросом. Заранее спасибо.
Ответ в том, что вам не нужно. Правильный способ использования подготовки PDO заключается в следующем:
$stmt = $pdo->prepare( "SELECT * FROM `products_keywords` WHERE `product_type` = ?");
В этом весь смысл использования подготовленного заявления. Затем вы привязываете параметр следующим образом:
$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(); } ?>
Браузер:
Я бы предложил сделать это следующим образом:
$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(); }
Вы продолжаете просить разрешения избежать апострофа. Я согласен с другими комментариями и ответами, которые вы должны использовать для использования параметров запроса. Это чище и проще.
Но 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.