Come sfuggire alla virgoletta singola (apostrofo) nella string usando php

Ho una query SQL come questa: –

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

Non so quale sarà il valore nella variabile $ product_type . Ma ora, sto ottenendo Men's Shirt nella variabile $ product_type che causa l'errore di syntax nella mia query SQL. Sono sicuro che questo errore è dovuto alla singola citazione nel valore di Men's Shirt . Come faccio a sfuggire questo valore in base alla mia domanda? E come verificare se c'è una citazione singola nella mia variabile $ product_type e poi scappare secondo la mia query. Grazie in anticipo.

La risposta è che non è necessario. Il modo corretto di usare la preparazione di PDO è come questo:

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

Questo è il punto centrale dell'uso di una dichiarazione preparata. Quindi si associa il parametro come segue:

 $stmt->bindParam(1, $product_type) 

Prova,

Schema:

 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'); 

Visualizza dati:

 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:

inserisci la descrizione dell'immagine qui

In realtà suggerirei di farlo nel seguente modo:

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

In questo modo non devi sfuggire a nulla e la tua richiesta è sicura.

Per inserire una citazione in un'istruzione PDO, basta usare la function addslashes . Per esempio:

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

Continui a chiedere una soluzione per sfuggire all'apostrofo. Sono d'accordo con gli altri commenti e le risposte che dovresti abituare all'utilizzo dei parametri di query. È più pulito e più facile.

Ma PDO ha in realtà una function per l'escape. Si chiama PDO :: quote () :

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

Si noti che quote () esegue l'escape della string in base alle necessità e aggiunge anche virgolette attorno ad esso, quindi non è necessario farlo quando si utilizza tale variabile nella string SQL.

Leggi la documentazione per maggiori informazioni: http://php.net/manual/en/pdo.quote.php In effetti, potresti aver risposto a questa domanda da solo passando qualche minuto a leggere la documentazione PDO.