pb de serveur SQL avec instruction ORDER BY RAND??

Eléphant du PHP | 58 Messages

01 juil. 2008, 21:24

Je viens de transférer mon site chez INFOMANIAK...(service sympa et interface sympa pour l'instant)
Tout baigne à part une erreur en appelant ma page prepaquestions.php qui m'annonce :
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 'order by rand() limit 3' at line 1

Pourtant tout mon code marche très bien chez FREE et je n'ai pas changé la syntaxe de mon ORDER BY RAND...

J'ai un serveur INFOMANIAK qui annonce :
# Version du serveur: 5.0.45-log
# Version du protocole: 10
# Serveur: mysql.questarquiz.fr via TCP/IP
# Utilisateur: xxxxx.infomaniak.ch


Et un serveur FREE qui annonce :
# Version du serveur: 5.0.45
# Version du protocole: 10
# Serveur: ludiquest.sql.free.fr via TCP/IP
# Utilisateur: xxxxx@ip_adress


D'où vient le pb d'après vous? C'est quoi la version 5.0.45-log avec le log?? Merci d'avance.
<?php
/*******************************PREPAQUESTIONS
Passer dans l'URL : ?nomqcm=art1 par exemple
Ce fichier attend de recevoir l'id du fichier QCM choisi par le joueur.
Il génére alors un tirage de 20 questions à partir de la table QCM et les enregistre dans le fichier Question du joueur actif.
Le numéro de la question active est mis à jour dans la table du joueur.
http://localhost/Projet%20SITE%20LUDIQUEST/Sources%20PHP/QuestarOnline/prepaquestions.php?pseudo=speccy&id=5
*****************************************************/
session_start();
//recupère le nom du qcm choisi par le joueur
$idqcm=$_GET["id"];
$pseudo=$HTTP_GET_VARS["pseudo"];
//ouvre la base de données
include("donneesconnection.php");	
//on vérifie s'il faut un VISA et si le joueur en a un 
$rq="SELECT VISAACTIF, NBPASS,modedejeu FROM membres where pseudo='$pseudo'";
$resultat=mysql_query($rq) or die(mysql_error());
$donneesjoueur = mysql_fetch_array($resultat);
$modedejeu=$donneesjoueur['modedejeu'];
// ouvre la table de liste des QCM et vérifie si un PASS est nécessaire pour jouer
$rq="SELECT PASSNEEDED,nomtableqcm FROM listeqcm where idqcm='$idqcm'";
$resultat=mysql_query($rq) or die(mysql_error());
$donneesqcm = mysql_fetch_array($resultat);
//s'il faut un pass et que le nombre de pass du joueur est égal à zéro alors lui indique que c'est impossible
$nomqcm=$donneesqcm['nomtableqcm'];
if ($donneesqcm['PASSNEEDED']>0 and $donneesjoueur['NBPASS']==0)
{
	echo("impossible de jouer ; ce QCM nécessite un PASS.");
}
else
{
	//si le mode de jeu est Questar GALAXIE	et qu'il n'a pas au moins un VISA pour le mois alors on affiche le message
	if ($modedejeu=="1" and $donneesjoueur['VISAACTIF']<0) 
	{
		echo("le joueur ".$pseudo." n'a pas de VISA actif pour ce mois");
	}
	else
	{
		// sinon on continue à préparer le QCM
		//on récupère le nombre de questions à poser dans la table CONFIG
		$rq="SELECT nbquestionsposees FROM config";
		$resultat=mysql_query($rq) or die(mysql_error());
		$donneesconfig = mysql_fetch_array($resultat);
		$nbq=$donneesconfig['nbquestionsposees'];
		//choisit X enregistrements au hasard dans la table choisie
		$rq="SELECT * FROM ".$nomqcm." order by rand() limit ".$nbq;
		$resultat=mysql_query($rq) or die(mysql_error());
		//on génére la table du joueur pour ce QCM si la table n'existe pas
		$nomtable=$pseudo.'qcm';
		$requete ="CREATE  TABLE IF NOT EXISTS ".$nomtable."
		 (
		  `idquest` mediumint(9) NOT NULL,
		  `question` char(200) collate latin1_general_ci default NULL,
		  `rep1` char(125) collate latin1_general_ci default NULL,
		  `rep2` char(125) collate latin1_general_ci default NULL,
		  `rep3` char(125) collate latin1_general_ci default NULL,
		  `numreponse` tinyint(4) default NULL,
		  `commentaire` char(200) collate latin1_general_ci default NULL,
		  `mediafile` char(12) collate latin1_general_ci default NULL,
		  `typemediafile` tinyint(4) default NULL,
		  `auteur` char(13) collate latin1_general_ci default NULL,
		  `tempsreponse` mediumint(9) default NULL,
		  `scorereponse` mediumint(9) default NULL,			  
		PRIMARY KEY  (`idquest`)
			) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;";
		$resultat=mysql_query($requete) or die(mysql_error());
		//on efface les enregistrements de la table dans lecas où elle serait pleine
		$requete ="TRUNCATE TABLE `$nomtable`"; 
		$resultat=mysql_query($requete) or die(mysql_error());
		//on rempli la table du joueur avec les XX questions choisies au hasard
		$requete="INSERT INTO ".$nomtable." (idquest,question,rep1,rep2,rep3,numreponse,commentaire,mediafile,auteur) SELECT idquest,question,rep1,rep2,rep3,numreponse,commentaire,mediafile,auteur FROM ".$nomqcm." order by rand() limit ".$nbq;
		echo($requete);
		$resultat=mysql_query($requete) or die(mysql_error());
		//on initialise le FLAG questionactive à 0 pour ce joueur eton mémorise le nom de la table du QCM qui va etre joué
		$requete="UPDATE membres SET questionactive=0,nomqcmjoue='$nomqcm' WHERE pseudo='$pseudo'";
		$resultat=mysql_query($requete) or die(mysql_error());
		//on retourne à FLASH avec la variable PHPFINI à OK et on lance QCM.swf
		$phpfini="ok";
		//$url='http://localhost/Projet%20SITE%20LUDIQUEST/Sources%20PHP/QuestarOnline/QCM4.swf?nomjoueur='.$pseudo.'&nomqcm='.$nomqcm;
		$url='http://xxxxx.fr/QCM4.swf?nomjoueur='.$pseudo.'&nomqcm='.$nomqcm;
		//$url='QCM4.swf?nomjoueur='.$pseudo.'&nomqcm='.$nomqcm;
		//$url='QCM4.swf?nomjoueur='.$pseudo.'&nomqcm='.$nomqcm;
		//header("location:".$url);
		echo"<META http-equiv=\"refresh\" content=\"0; URL=".$url."\">"; 
		mysql_close();
	}

}

?>

ViPHP
ViPHP | 5924 Messages

01 juil. 2008, 21:47

Montre nous la requète, pas le code...

Eléphant du PHP | 58 Messages

01 juil. 2008, 21:58

pas de souci mais je montrais le code car le pb me dépasse et me parait plus général sachant que ce même code fonctionne chez FREE...
$requete="INSERT INTO ".$nomtable." (idquest,question,rep1,rep2,rep3,numreponse,commentaire,mediafile,auteur) 
SELECT idquest,question,rep1,rep2,rep3,numreponse,commentaire,mediafile,auteur FROM ".$nomqcm." 
order by rand() limit ".$nbq;
$resultat=mysql_query($requete) or die(mysql_error());
Mais il est clair que si je passe cette ligne en commentaire, aucune erreur n'est détectée.

ViPHP
ViPHP | 5924 Messages

01 juil. 2008, 23:41

Quand je disais la requète c'est la requète qui est effectivement exécutée, pas le code qui l'exécute. Donc en gros dans ton code tu dois afficher la requète avant de l'exécuter...

ViPHP
ViPHP | 2144 Messages

02 juil. 2008, 00:41

Petite remarque en passant: créer une table par joueur, ce n'est vraiment pas une très bonne idée, tu as plus que probablement un problème de modélisation de ta base de donnée.

Eléphant du PHP | 58 Messages

02 juil. 2008, 12:58

Ok ! vos remarques m'ont permis de trouver la solution; c'est la variable du nom du QCM qui était vide suite à un pb facile à résoudre.... donc pas de version de SQL en jeu....... désolé pour le dérangement!

Ok pour ma modélisation lourde mais je découvre sql sur un très gros projet que je suis en passe de terminer....donc efficacité avant tout; j'ai déjà assez de questions diverses à me poser....

Merci quand même....je me pencherais sur le pb plus tard sur un autre projet... on verra si c'est viable ici.

a+