Je reçois une erreur dans MySQL:
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '''')' at line 2'.
Code HTML:
<form action="read_message.php" method="post">
<table class="form_table">
<tr>
<td style="font-weight:bold;">Subject:</td>
<td><input style=" width:300px" name="form_subject"/></td>
<td></td>
</tr>
<tr>
<td style="font-weight:bold;">Message:</td>
<td id="myWordCount"> (300 words left)</td>
<td></td>
</tr>
<tr>
<td><input type="hidden" name="sender_id" value="<?php echo $sender_id?>"></td>
<td><textarea cols="50" rows="4" name="form_message"></textarea></td>
<td valign="bottom"><input type="submit" name="submit_message" value="send"></td>
</tr>
</table>
</form>
Code à insérer dans une table mysql:
<?php
include_once"connect_to_mysql.php";
//submit new message
if($_POST['submit_message']){
if($_POST['form_subject']==""){
$submit_subject="(no subject)";
}else{
$submit_subject=$_POST['form_subject'];
}
$submit_message=$_POST['form_message'];
$sender_id = $_POST['sender_id'];
if($shortMessagesLeft<1){
$form_error_message='You have left with '.$shortMessagesLeft.' Short Message. Please purchase it from the <a href="membership.php?id='.$id.'">shop</a>.';
}
else if($submit_message==""){
$form_error_message = 'Please fill in the message before sending.';
}
else{
$message_left = $shortMessagesLeft-1;
$update_short_message = mysql_query("UPDATE message_count SET short_message = '$message_left' WHERE user_id = '$id'");
$sql = mysql_query("INSERT INTO private_messages (to_id, from_id, time_sent, subject, message)
VALUES('$sender_id', '$id', now(),'$submit_subject','$submit_message')") or die (mysql_error());
}
}
?>
Qu'est-ce que l'erreur signifie et qu'est-ce que je fais mal?
Il y a une citation unique dans $submitsubject
ou $submit_message
Pourquoi c'est un problème?
Le caractère guillemet simple termine la chaîne dans MySQL et tout ce qui est passé est traité comme une commande SQL. Vous VRAIMENT ne voulez pas écrire votre SQL comme ça. Au mieux, votre application sera interrompue de façon intermittente (comme vous le constatez) et au pire, vous venez d'introduire une énorme vulnérabilité de sécurité.
Imaginez si quelqu'un soumettait '); DROP TABLE private_messages;
dans le message d'envoi.
Votre commande SQL serait:
INSERT INTO private_messages (to_id, from_id, time_sent, subject, message)
VALUES('sender_id', 'id', now(),'subjet','');
DROP TABLE private_messages;
Au lieu de cela, vous devez assainir correctement vos valeurs.
EN MINIMUM, vous devez exécuter chaque valeur avec mysql_real_escape_string()
, mais vous devriez vraiment utiliser des instructions préparées.
Si vous utilisiez mysql_real_escape_string()
, votre code ressemblerait à ceci:
if($_POST['submit_message']){
if($_POST['form_subject']==""){
$submit_subject="(no subject)";
}else{
$submit_subject=mysql_real_escape_string($_POST['form_subject']);
}
$submit_message=mysql_real_escape_string($_POST['form_message']);
$sender_id = mysql_real_escape_string($_POST['sender_id']);
Voici un excellent article sur les déclarations préparées et les AOP.
Cela s'appelle SQL INJECTION. Le '
essaie d'ouvrir/fermer une chaîne dans votre requête mysql. Vous devriez toujours échapper à toute chaîne entrant dans vos requêtes.
par exemple,
au lieu de cela:
"VALUES ('$sender_id') "
faire ceci:
"VALUES ('". mysql_real_escape_string($sender_id) ."') "
(ou équivalent, bien sûr)
Cependant, il est préférable d'automatiser cela en utilisant PDO, des paramètres nommés, des instructions préparées ou bien d'autres moyens. Recherche à ce sujet et injection SQL ( ici vous avez quelques techniques).
J'espère que ça aide. À votre santé
J'avais la même erreur quand j'ai utilisé ce code pour mettre à jour l'enregistrement:
@mysqli_query($dbc,$query or die()))
Après avoir supprimé or die
, il a commencé à fonctionner correctement.
Assurez-vous que vous avez bien téléchargé le mysqldump, ce problème est très courant lorsque nous essayons d’importer mysqldump téléchargé à moitié/incomplet. Veuillez vérifier la taille de votre fichier sqldump.
J'avais ce problème auparavant et la raison est très simple: Vérifiez vos variables, s'il y avait des chaînes de caractères, mettez-les donc entre guillemets '$ your_string_variable_here' , s'il était numérique, conservez-le sans guillemets ..__ Par exemple, si j'avais ces données: $ name (ce sera une chaîne) $ numéro_phone (Ce sera numérique) Donc, ce sera comme ça:
$ query = "INSERT INTO users
(name
, phone
) VALUES ('$ name', $ phone)"; Juste comme ça et ça sera corrigé ^ _ ^