Comprendre le problème
Lors de la tentative d'insertion de données dans MySQL à l'aide de PHP , un guillemet simple peut provoquer une erreur dans les requêtes ultérieures qui accèdent aux données insérées. Bien que la première requête semble fonctionner correctement, la deuxième requête génère une erreur MySQL si les données contiennent un guillemet simple.
Résoudre le problème
La solution est de échappez aux guillemets simples dans les chaînes insérées à l'aide de la fonction mysql_real_escape_string(). Cette fonction remplace les guillemets simples par leurs équivalents échappés ('), garantissant qu'ils sont interprétés comme des caractères littéraux plutôt que comme faisant partie de la syntaxe de la requête.
Raison de la disparité
La raison pour laquelle les deux requêtes se comportent différemment est probablement due au réglage du paramètre de configuration magic_quotes_gpc. Lorsque ce paramètre est activé, les chaînes obtenues à partir de $_GET, $_POST et $_COOKIES sont automatiquement échappées, y compris les guillemets simples.
Cependant, une fois les données stockées dans la base de données et récupérées à nouveau, elles ne seront plus s'est automatiquement échappé. Par conséquent, lorsque la deuxième requête tente d'accéder aux données, elle rencontre des guillemets simples qui ne sont pas échappés et déclenche une erreur.
Requêtes révisées
Pour résoudre le problème, échappez aux guillemets simples dans les deux requêtes en utilisant mysql_real_escape_string() :
$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', mysql_real_escape_string('$booking_name'), mysql_real_escape_string('$address'), mysql_real_escape_string('$suburb'), mysql_real_escape_string('$postcode'), '$state_id', '$region_id', mysql_real_escape_string('$email'), mysql_real_escape_string('$phone'), mysql_real_escape_string('$phone2'), mysql_real_escape_string('$mobile'), STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', mysql_real_escape_string('$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')");
$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', mysql_real_escape_string('$from'), '$row->supplier_id', mysql_real_escape_string('$row->primary_email') ,mysql_real_escape_string('$row->secondary_email'), mysql_real_escape_string('$subject'), mysql_real_escape_string('$message_content'), '1')");
By en échappant aux guillemets simples, les deux requêtes traiteront désormais correctement les données contenant des guillemets simples sans provoquer d'erreurs MySQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!