Échapper à une seule citation en PHP lors de L'insertion dans MySQL [dupliquer]

cette question a déjà une réponse ici:

j'ai un problème complexe que je ne semble pas pouvoir comprendre... J'espère que quelqu'un ici pourra me guider dans la bonne direction...

I avoir deux énoncés SQL: - la première entre les informations d'un formulaire dans la base de données. - le second prend des données de la base de données Entrée ci-dessus, envoie un e-mail et enregistre ensuite les détails de la transaction

le problème est qu'il apparaît qu'une seule citation déclenche une erreur MySQL sur la deuxième entrée seulement!!! La première instance fonctionne sans problème mais la seconde instance déclenche le mysql_error() .

les données à partir d'un formulaire doit être géré contrairement aux données saisies dans un formulaire?

requête#1 - cela fonctionne sans problème (et sans échapper à la seule citation)

$result = mysql_query("INSERT INTO job_log 
(order_id, supplier_id, category_id, service_id, qty_ordered, customer_id, user_id, salesperson_ref, booking_ref, booking_name, address, suburb, postcode, state_id, region_id, email, phone, phone2, mobile, delivery_date, stock_taken, special_instructions, cost_price, cost_price_gst, sell_price, sell_price_gst, ext_sell_price, retail_customer, created, modified, log_status_id) 
VALUES 
('$order_id', '$supplier_id', '$category_id', '{$value['id']}', '{$value['qty']}', '$customer_id', '$user_id', '$salesperson_ref', '$booking_ref', '$booking_name', '$address', '$suburb', '$postcode', '$state_id', '$region_id', '$email', '$phone', '$phone2', '$mobile', STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', '$special_instructions', '$cost_price', '$cost_price_gst', '$sell_price', '$sell_price_gst', '$ext_sell_price', '$retail_customer', '".date('Y-m-d H:i:s', time())."', '".date('Y-m-d H:i:s', time())."', '1')");

requête#2 - ceci échoue en entrant un nom avec une seule citation (c.-à-d. O'Brien)

$query = mysql_query("INSERT INTO message_log 
(order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status) 
VALUES 
('$order_id', '".date('Y-m-d H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')");
147
demandé sur LuFFy 2010-04-22 06:25:33

8 réponses

vous devriez échapper à chacune de ces chaînes (dans les deux extraits) avec mysql_real_escape_string() .

http://us3.php.net/mysql-real-escape-string

la raison pour laquelle vos deux requêtes se comportent différemment est probable parce que vous avez magic_quotes_gpc allumé (ce que vous devriez savoir est une mauvaise idée). Cela signifie que les chaînes recueillies à partir de $_GET, $_POST et $_COOKIES sont échappées pour vous (i.e., "O'Brien" -> "O\'Brien" ).

une fois que vous stockez les données, et les récupérez ensuite à nouveau, la chaîne de caractères que vous récupérez à partir de la base de données et non sera automatiquement échappée pour vous. Vous récupérerez "O'Brien" . Donc, vous aurez besoin de passer par mysql_real_escape_string() .

102
répondu awgy 2010-04-22 03:11:53

pour toute personne trouvant cette solution en 2015 et allant de l'avant...

la fonction mysql_real_escape_string() est dépréciée à partir de PHP 5.5.0.

voir: php.net

Avertissement

cette extension est dépréciée à partir de PHP 5.5.0, et sera supprimée à l'avenir. À la place, L'extension MySQLi ou PDO_MySQL doit être utilisée. Voir Aussi MySQL: choisir un guide D'API et FAQ connexe pour plus d'information. Les solutions de rechange à cette fonction sont les suivantes:

mysqli_real_escape_string()

PDO::quote()

38
répondu Amy McCrobie 2015-03-12 12:36:32

Vous devriez faire quelque chose de ce genre pour vous aider à déboguer

$sql = "insert into blah blah....";
echo $sql;

vous trouverez probablement que la citation simple est échappée avec un antislash dans la requête de travail. Cela peut avoir été fait automatiquement par php via le paramètre magic_quotes_gpc, ou peut-être que vous l'avez fait vous-même dans une autre partie du code(addslashes et stripslashes peuvent être des fonctions à rechercher).

voir http://php.net/manual/en/security.magicquotes.php

10
répondu goat 2010-04-22 03:10:59

vous avez un couple de choses qui se battent dans vos cordes.

  • absence de citation MySQL correcte ( mysql_real_escape_string() )
  • "151940920 potentiels" automatique "magic quote' -- vérifier votre gpc_magic_quotes paramètre
  • variables de chaîne intégrées, ce qui signifie que vous devez savoir comment PHP trouve correctement les variables

il est également possible que la valeur simple-citée n'est pas présente dans les paramètres à la première requête. Votre exemple est un nom propre, après tout, et seule la seconde requête semble traiter de noms.

10
répondu staticsan 2010-04-22 03:18:38

vous pouvez faire ce qui suit qui échappe à la fois PHP et MySQL.

<?
$text = '<a href="javascript:window.open(\\'http://www.google.com\\');"></a>';
?> 

cela reflétera MySQL comme

<a href="javascript:window.open('http://www.google.com');"></a>

comment ça marche?

nous savons que les apostrophes PHP et MySQL peuvent être échappées avec backslash puis apostrophe.

\'

parce que nous utilisons PHP pour insérer dans MySQL, nous avons besoin de PHP pour écrire encore le backslash à MySQL donc il trop peut y échapper. Nous utilisons donc le caractère d'échappement PHP de backslash-backslash avec backslash-apostrophe pour y parvenir.

\\'
10
répondu Error404 2014-09-29 09:52:34

vous devez simplement passer la variable ou les données à l'intérieur de "mysql_real_escape_string (trim ($val)) "

où $val = les données qui vous tourmente.

7
répondu user3272729 2017-08-28 21:00:54

j'ai eu le même problème et je l'ai résolu comme ceci:

$text=str_replace("'","\'",$YourContent);

il y a probablement une meilleure façon de le faire, mais ça a marché pour moi et ça devrait marcher pour vous aussi.

-2
répondu user2521037 2013-07-26 12:20:53

mysql_real_escape_string() ou str_replace() fonction vous aidera à résoudre votre problème.

http://phptutorial.co.in/php-echo-print /

-2
répondu user3255636 2014-01-31 01:45:44