Как избежать одиночной кавычки (апостроф) в строке, используя php

У меня есть 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.