2013-01-17 4 views
-1

Je tire vraiment mes cheveux sur celui-ci. J'ai une section de commentaire simple sur mon application PHP auto-construite et je veux simplement ajouter une nouvelle ligne si j'attrape un paramètre $ _GET. Mais peu importe comment je construis la requête d'insertion de MySQL, j'obtiens une erreur.PHP MySQL erreur sur INSERT

C'est ce que j'ai jusqu'à présent:

if(isset($_GET['r'])){ 
    $replyid = mysql_real_escape_string($_GET['r']); 
    $sentnow = date("Y-m-d H:i:s"); 
    mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."'") or die(mysql_error()); 
    echo '<meta http-equiv="refresh" content="0;/messages">'; 
} 

Mes champs MySQL DB sont appelés exactement les mêmes: messageid (auto_increment), Toid (INT11), de (varchar255), contact (varchar255), vu (int3), message (texte) et date (timestamp/CURRENT_TIMESTAMP).

L'exécution de la page ci-dessus avec, disons « index.php r = 777? » Devrait, comme je le vois, peupler mon MySQL avec une nouvelle ligne en tant que tel:

messageid = (AUTO_INCREMENT) 
toid = 777 
from = TESTUSER 
contact = CONTACTINFO 
seen = 0 
message = MESSAGE 
date = 2013-01-17 11:50:01 

Au lieu de cela, je reçois le texte suivant erreur:

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 'from, contact, seen, message, date) VALUES (NULL, '1', 'TESTUSER', 'CONTACTINFO'' at line 1 

Même erreur affichée avec "error_reporting (E_ALL)". J'ai regardé ceci pendant plusieurs jours maintenant, et je ne peux juste pas trouver l'erreur ... Peut-être que je suis aveugle et manque une virgule ou une balise fermante ou quelque chose. Des idées?

+3

S'il vous plaît, ne pas utiliser les fonctions mysql_ * dans le nouveau code. Ils ne sont plus entretenus et sont officiellement désapprouvés. En savoir plus sur les instructions préparées à la place, utilisez PDO ou MySQLi – Afsar

+0

Je ne suis pas sûr que $ replyid est un int dans votre base de données, mais si c'est le cas, vous ne devriez pas utiliser les symboles '' autour de lui. (uniquement pour les chaînes) –

+0

Assurez-vous que le type de données pour le champ vu, soit varchar, ou supprimez le '' autour de la valeur pour cela. – Kao

Répondre

1

Il y a quelques erreurs de syntaxe ici:

  • Il y a une parenthèse manquante à la fin de votre requête générée.
  • from et date sont des mots-clés réservés, les entourer de `.
  • seen et toid ne sont pas varchar champs, et donc leurs valeurs ne doivent pas être inclus dans '.

Essayez:

mysql_query("INSERT INTO eis_inbox (messageid, toid, `from`, contact, seen, message, `date`) 
VALUES (NULL, ".$replyid.", 'TESTUSER', 'CONTACTINFO', 0, 'MESSAGE', '".$sentnow."')"); 

Attention: ceci est vulnérable aux injections SQL. N'utilisez pas les commandes mysql_*, essayez plutôt PDO ou mysqli. Les instructions préparées aideront à les éviter.

+0

Cela a fait l'affaire totalement! MERCI UN BUNCH! Va accepter cela comme une réponse! – uberconversion

+0

Le dernier est horrible. Alors que leur code actuel est invulnérable à l'injection, votre version le rend vulnérable. -1 –

+0

Comment ça? $ _GET n'est pas correctement échappé? – uberconversion

5

C'est parce que vous utilisez des mots réservés (de et date) comme noms de colonne.

Enveloppez autour de ``

-à-dire:

INSERT INTO eis_inbox (`messageid`, `toid`, `from`, `contact`, `seen`, `message`, `date`) 
0

Votre manque une balise de fermeture pour les valeurs, et à partir est préservée, vous devriez donc échapper ... (utilisez des guillemets autour d'elle devrait faire l'affaire, ...:

mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."'") or die(mysql_error()); 

devrait être

mysql_query("INSERT INTO eis_inbox (messageid, toid, 'from', contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')") or die(mysql_error()); 

Aussi comme zan mentionné, don utilise les fonctions mysql_ *, mais mysqli_ * ou PDO ...

2

Date est mot-clé de mysql vous devez l'entourer dans `signe. Here est la liste complète des mots réservés dans MySQL de la documentation officielle pour une utilisation future. En dehors de cela, la parenthèse pour les valeurs n'est pas fermée.

Utilisez ceci. J'espère que cela fonctionnera bien.

INSERT INTO eis_inbox (`messageid`, `toid`, `from`, `contact`, `seen`, `message`, `date`) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')" 

Merci.

1

vous ne pouvez pas utiliser le mot réservé dans une base MySQL directe

de mot est réservé

court exemple

INSERT INTO eis_inbox (messageid, from) VALUES (1,2); 

- est mauvaise requête

INSERT INTO eis_inbox (messageid, `from`) VALUES (1,2); 

- est recherche correcte

mais mieux vaut éviter une telle situation. Here est la liste complète des mots réservés dans MySQL de la documentation officielle pour une utilisation future.

0

Il vous manque un support

mysql_query("INSERT INTO eis_inbox (messageid, toid, from, contact, seen, message, date) VALUES (NULL, '".$replyid."', 'TESTUSER', 'CONTACTINFO', '0', 'MESSAGE', '".$sentnow."')") or die(mysql_error());