2016-09-22 3 views
0

У меня есть SQL запрос следующим образом: -Как избежать одиночные кавычки (апостроф) в строку с помощью PHP

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

Я не знаю, что будет значение в $ product_type переменной в . Но теперь, я получаю Мужская рубашка в $ product_type переменная, которая вызывает синтаксическую ошибку в моем SQL-запросе. Я уверен, что эта ошибка связана с одной цитатой в Мужская рубашка значение. Как я избегаю этого значения в соответствии с моим запросом? И как проверить, есть ли одинарная кавычка в моей $ product_type переменной, а затем избежать ее в соответствии с моим запросом. Заранее спасибо.

+0

Назначьте ** Мужскую рубашку ** в PHP 'Variable' и используйте ее. Как '$ prod =" Men's Shirt ";' –

+1

Используйте привязку параметров, и у вас не будет этой проблемы :) – Neat

+2

Кажется, вы пропустили весь смысл [подготовленных операторов SQL] (http://php.net/manual/en/ pdo.prepare.php). Одна из его целей - избегать генерации SQL-запросов путем конкатенации строк. – axiac

ответ

6

Ответ заключается в том, что вам не нужно. Правильный способ использования подготовки PDO заключается в следующем:

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

В этом весь смысл использования подготовленного заявления. Тогда вы bind параметр следующим образом:

$stmt->bindParam(1, $product_type) 

Proof,

Схема:

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

Browser:

enter image description here

+0

Как использовать это в подобной статье с помощью шаблона? –

+0

просто используйте 'where product_type like?' – e4c5

+0

как насчет %% ?? –

2

Я бы на самом деле предлагают делать это следующим образом:

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

Таким образом, вам не нужно бежать ничего и ваш запрос является безопасным.

+0

Как использовать это в подобной статье с шаблоном? –

+0

$ res = $ stmt-> execute (array (': product_type' => $ product_type. '%')); и в строке запроса заменить «equals character» на «LIKE» –

+0

. Можете ли вы, пожалуйста, дать мне разрешение на уход? –

0

Вы продолжаете просить решения, чтобы избежать апострофа. Я согласен с другими комментариями и ответами, которые вы должны использовать для использования параметров запроса. Это чище и проще.

Но PDO действительно имеет функцию для экранирования. Это называется PDO::quote():

$product_type_quoted = $pdo->quote($product_type); 

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

Обратите внимание, что кавычки() экранирует строку в случае необходимости, а также добавляет одинарные кавычки вокруг него, так что вам не нужно делать, что при использовании этой переменной в вашем SQL строки.

Прочтите документацию для получения дополнительной информации: http://php.net/manual/en/pdo.quote.php На самом деле вы могли бы сами ответить на этот вопрос, потратив несколько минут на чтение документации PDO.

+1

«Всегда читать документы» всегда стоит повторять. –

1

Чтобы вставить цитату в инструкцию PDO, просто используйте функцию addslashes.Например:

function insert($tagName) 
{ 
    $tagName = addslashes($tagName); 
    $rs = $this->db->prepare("INSERT INTO tags (tagName) VALUES ('$tagName')"); 
    $rs->execute(); 
} 
Смежные вопросы