2014-07-11 4 views
1

J'ai donc une base de données de téléchargements sur mon site qui me permet de suivre le nombre de téléchargements, et j'essaye de mettre en place une interface pour moi et mes compatriotes pour insérer de nouveaux téléchargements dans la base de données. Je configure le front-end avec principalement PHP. La façon dont ma pagination est configurée élimine la possibilité que mes formulaires soient simplement affichés, donc j'ai JS sérialisant les données et rechargeant la page, puis je désérialise les données en PHP, je place les valeurs dans une requête mysql, et essayez de l'exécuter.Quel est le problème avec ma syntaxe SQL/PHP ici?

Voici ce que mon code SQL ressemble à l'intérieur de PHP:

$sql = "INSERT INTO dl (id, file, desc) VALUES ('$idd', '$file', '$desc')"; 

qui se transforme en cette chaîne:

INSERT INTO dl (id, file, desc) VALUES ('a56', 'test.zip', 'cake') 

Mais quand la page essaie de l'exécuter, je reçois cette 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 'desc) VALUES ('a56', 'test.zip', 'cake')' at line 1

Et l'étrangeté de cela est aggravée par le fait que la ligne de code exécutant la requête n'est pas sur la ligne 1. Il est sur la ligne 28.

Toute aide est appréciée :)

+2

essayer de changer les noms des colonnes, le fichier et desc peuvent être réservés –

+1

Oui Desc est un mot-clé prédéfini mysql. Nous utilisons comme paramètre de tri –

Répondre

6

desc est un reserved keyword dans MySQL.

La solution de contournement recommandée consiste à utiliser des retours arrière. De MySQL manual:

If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it.

Si renommer la table ou la colonne n'est pas possible, envelopper l'identifiant de la criminalité dans les apostrophes inverses (`):

$sql = "INSERT INTO dl (id, `file`, `desc`) VALUES ('$idd', '$file', '$desc')"; 

Jetez un oeil à cette question aussi: When to use single quotes, double quotes, and backticks in MySQL

+2

Vous pourriez faire le mile supplémentaire et backtick tous les noms de champ et de table. –

+0

Est-ce que cela me profiterait du tout, ou simplement fournir une protection contre cela à l'avenir? – Zbee

+0

Il est obligatoire que vous n'utilisiez pas de mots-clés réservés mais si vous insistez pour l'utiliser avec des guillemets simples – Tushar

1

desc est un mot réservé dans SQL.

Il est (avec ASC) utilisé pour déterminer l'ordre de tri des résultats.

+1

'fichier' est également réservé: https://www.drupal.org/node/141051 –

+0

Y at-il une solution de rechange que je peux utiliser dans ce cas? EDIT: Nevermind, la réponse de Tushar a fonctionné :) – Zbee

+1

@Zbee vous devez utiliser les guillemets à droite autour des noms de colonnes. – Jens

1

S'il vous plaît essayer.

$sql = "INSERT INTO dl (`id`, `file`, `desc`) VALUES ('".$idd."', '".$file."', '".$desc."')"; 

espérons que c'est utile.

Questions connexes