[RESOLU] ORDER BY Rand()

Eléphant du PHP | 58 Messages

03 juil. 2013, 12:10

Bonjour.

Sur ma page d'accueil, je souhaites donner un aperçu de mon site web. Pour cela je choisis une entré au hasard dans la base de données et j'affiche.
$req_rand = 	mysql_query("SELECT star_name FROM etoile ORDER BY rand() LIMIT 1");
while ($row = mysql_fetch_array($req_rand))
	{ extract($row);
echo"Un système extrasolaire au hasard: $star_name";
Seulement voila, hier j'ai fait migrer mon site chez un nouvel hébergeur. J'en ai profité pour changer quelques trucs (comme le nom des tables) dans la base de données. J'ai modifié en conséquence mon code PHP/MySQL partout sur le site, et ça marche très bien, sauf sur ce petit module de la page d'accueil, qui ne montre rien! Voici mon code, en commentaire l'ancien code.
$req_rand = 	mysql_query("SELECT star_name FROM primary ORDER BY rand() LIMIT 1");
// $req_rand = 	mysql_query("SELECT star_name FROM etoile ORDER BY rand() LIMIT 1");
while ($row = mysql_fetch_array($req_rand))
	{ extract($row);
echo"Un système extrasolaire au hasard: $star_name";
Je vais sur PHPmyadmin pour vérifier la requête. (SELECT star_name FROM primary ORDER BY rand() LIMIT 1)

Ce la me donne l'erreur suivante:
#1064 - 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 'primary ORDER BY rand_ind LIMIT 1' at line 1
J'ai beau chercher, je ne trouve pas ce qui coince et pourquoi ça ne coince pas sur l'ancien hébergeur. Pouvez vous m'aider?

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 juil. 2013, 23:39

Salut,

C'est pourtant simple primary est un mot clef SQL du coup il ne comprend pas ce qu'il fait après le from.

C'est toujours une très mauvais idée que d'utiliser des mots clefs comme nom de champs, table, schéma etc.
La preuve est faire par ton code.

Un bon moyen pour l'éviter ?
Utiliser des mots français de France et tu ne devrais pas avoir se problème (primaire n'étant pas un mot clef XD).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 58 Messages

04 juil. 2013, 08:04

Ha bien je ne l'avais pas vu sous cet angle là... Ca m'étonne quand même que toutes les autres requetes dans la table "primary" marchent à merveille, mais bon, je vais tenter de modifier ça

ViPHP
ViPHP | 2577 Messages

04 juil. 2013, 08:32

Bonjour,

`primary` comme ca, marche surement. Ca peut expliquer que les autres accès marche.
Reste qu'utiliser des mots réservés n'est généralement pas une bonne idée à cause des problèmes potentiel.

Mammouth du PHP | 2278 Messages

04 juil. 2013, 10:14

Mazarini,
Moi je ne peux même pas utiliser :
create table primary (id int, mot text);
sans avoir une erreur de syntaxe qui disparait avec:
create table primari (id int, mot text);
Peut-être qu'en renommant brutalement les tables....
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 juil. 2013, 10:41

comme tu le vois dans le code coloré primary est un mot clef et c'est normale que tu ne puisse pas (essai de dire qu'un chien est une voiture et personne ne va te comprendre :) ).
mais ça tu le sais déja.

Le truc c'est que la plus part des éditeur de SGBD ont prévue une syntaxe pour "échapper" les noms de tables / champs histoire d'éviter les erreurs.
c'est la syntaxe qu'indique Mazarini avec les "back quote" => ` (alt Gr + 7 sur un clavier "normal en france :mrgreen: ")

tu coup
CREATE TABLE `primary` (id int, mot text);
doit passer pour la création, et s'il a utiliser un outil pour générer le code SQL (genre modélisation de la base merise / uml et le soft génère le code) il y a de grande chance que le code généré utilise les back quote ;)


@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

04 juil. 2013, 10:53

J'ai parlé de ca uniquement pour expliquer pour expliquer que certaines requêtes pouvaient encore fonctionner.

Personnellement, je ne prends pas de risque, j'évite les mots réservés (quand je les connais), les blancs, lettres accentuées... Je n'ai jamais utilisé les back quote. J'ai assez de problème pour me compliquer la vie #-o

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 juil. 2013, 21:20

:mrgreen: :mrgreen:
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

05 juil. 2013, 08:34

Je croyais que les backquotes servaient aussi à protéger les requêtes.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD