pb de serveur SQL avec instruction ORDER BY RAND??

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : pb de serveur SQL avec instruction ORDER BY RAND??

par speccy666 » 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+

par iclo » 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.

par Sékiltoyai » 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...

par speccy666 » 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.

par Sékiltoyai » 01 juil. 2008, 21:47

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

pb de serveur SQL avec instruction ORDER BY RAND??

par speccy666 » 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();
	}

}

?>