Problème MySql

PsykotropyK
Invité n'ayant pas de compte PHPfrance

08 avr. 2006, 10:09

Bonjour,

J'ai utilisé un tuto pour (essayer de) comprendre le sql. Le tuto de base servait a 'lié' des liste déroulantes (c'était celui sur es départements/régions).

Grâce a celui ci, j'ai fait un genre d'afficheur de news. L'idée est d'afficher toutes les news (seulement le début) et d'ajouter un bouton a cliquer pour voir la suite, voila ce que donne mon code :
<?php if ($code==-1){
		$connexion = mysql_pconnect($serveur, $admin, $mdp);
		$sql = "SELECT *".
		" FROM `news`".
		" ORDER BY `Date` DESC";
		if($connexion != false)
		{
			$rech_news = mysql_query($sql, $connexion);
			$nd = 0;
			$titre = array();
			$contenu = array();
			$date = array();
			$code = array();
			while($ligne_news = mysql_fetch_assoc($rech_news))
			{
				array_push($titre, $ligne_news['Titre_News']);
				array_push($contenu, $ligne_news['Contenu']);
				array_push($date, $ligne_news['Date']);
				array_push($code, $ligne_news['Code_News']);
				$nd++;
			}
			for($d = 0; $d<$nd; $d++)
			{
				?>
				<table width="641" border="0" cellspacing="0" cellpadding="0">
					<tr>
						<td width="201" height="24"><span class="Style1"><?php echo($titre[$d]) ?></span></td>
						<td width="440">
						<form id="histo" name="histo" method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
						<span class="Style1"><?php echo(substr($contenu[$d],0,30).'...'); ?>
				        <input type="submit" name="Submit" value="Lire la suite" />
					    </span>
						<input name="menu" type="hidden" id="menu" value="1" />
						<input name="ssmenu1" type="hidden" id="ssmenu1" value="1" />
						<input name="code" type="hidden" id="news" value="<?php echo($code[$d]) ?>" />					  
						</form>
						</td>
					</tr>
					<tr>
					  <td colspan="2"><hr /></td>
				    </tr>
				</table>
				<?php
			}
		}
		mysql_free_result($rech_news);
	}elseif ($code>=0){
		$connexion = mysql_pconnect($serveur, $admin, $mdp);
		$sql = "SELECT *".
		" FROM `news`".
		" ORDER BY `Date` DESC".
		" WHERE `Code_News` = ". $code ."";
		if($connexion != false)
		{
			$rech_news = mysql_query($sql, $connexion);
			$nd = 0;
			$titre = array();
			$contenu = array();
			$date = array();
			$code = array();
		        while($ligne_news = mysql_fetch_assoc($rech_news))
			{
				array_push($titre, $ligne_news['Titre_News']);
				array_push($contenu, $ligne_news['Contenu']);
				array_push($date, $ligne_news['Date']);
				array_push($code, $ligne_news['Code_News']);
				$nd++;
			}
			for($d = 0; $d<$nd; $d++)
			{
				?>
				<table width="641" border="0" cellspacing="0" cellpadding="0">
					<tr>
						<td width="201" height="24"><span class="Style1"><?php echo($titre[$d]) ?></span></td>
						<td width="440"><?php echo($date[$d]) ?></td>
					</tr>
					<tr>
					  <td colspan="2"><span class="Style1"><?php echo($contenu[$d]); ?></span></td>
				    </tr>
				</table>
				<?php
			}
		}
		mysql_free_result($rech_news);
	}
?>
Désolé si c'est un peu long...

Le problème c'est que quand je clique sur le bouton, voila ce qui s'affiche :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\News\Index.php on line 124

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\News\Index.php on line 147
La ligne 124 c'est : while($ligne_news = mysql_fetch_assoc($rech_news))
la ligne 147 c'est : mysql_free_result($rech_news);

Ce problème je l'ai aussi sur d'autre page qui utilise exactement le meme code (seulement les nom de table SQL ou les variable changent) et pour que cela s'affiche convenablement je suis obligé de recliquer sur le bouton qui m'affiche la page (encore c'est pas trop génant, mais la je n'ai plus le bouton, donc impossible de recliquer, et la fonction actualiser ne regle pas le problème)

Si quelqu'un a une idée, merci d'avance...

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

08 avr. 2006, 11:28

Ta deuxième requête est mal constituée, la clause ORDER BY doit être la toute dernière instruction dans une commande SQL.

La syntaxe doit être
SELECT le ou les champs
FROM la ou les tables
[ WHERE la ou les conditions ] // éventuel
[ ORDER BY le ou les champs ] // éventuel
A noter également que tu n'as pas besoin des " ` " autour de tes colonnes, ça alourdit la requête pour rien, et c'est plus lisible sans, surtour lorsque tes valeurs sont des chaines de caractères entourés d'apostrophes " ' " ca évite les confusions :)

Eléphant du PHP | 451 Messages

08 avr. 2006, 13:22

Un petit conseil si tu essayes de comprendre SQL. En faisant du SQL à partir de PHP, tu as 2 sources de problèmes potentiels, PHP et SQL (enfin MySql).
Pour vérifier, le SQL seul, tu peux utiliser phpMyAdmin qui permet de tester les requêtes Sql (voir même de donner des syntaxes).
Peut être que tu l'utilises déjà mais si ce n'est pas le cas je te le recommande fortement, moi aujourd'hui encore, cet outil m'est indispensable.
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

PsykotropyK
Invité n'ayant pas de compte PHPfrance

08 avr. 2006, 16:04

Merci Ryle, maintenant j'affiche correctement la news demandais. par contre j'ai toujours des problème des fois, sans savoir pourquoi vu que un coup ca marche, un coup ca marche pas...

Avant le code que j'ai mit au dessus j'ai ca aussi :


<style type="text/css">
<!--
.Style1 {font-family: Arial, Helvetica, sans-serif}
-->
</style>

<?php
	$code = isset($_POST['code'])?$_POST['code']:-2;
	if ($mmilieu=="nh" && $code==-2){
		$code=-1;
	}
	echo ($code);
	if ($code==-2){
		$connexion = mysql_pconnect($serveur, $admin, $mdp);
		$sql = "SELECT *".
		" FROM `news`".
		" ORDER BY `Date` DESC";
		if($connexion != false)
		{
			$rech_news = mysql_query($sql, $connexion);
			$nd = 0;
			$titre = array();
			$contenu = array();
			$date = array();
			$code = array();
			while($ligne_news = mysql_fetch_assoc($rech_news))
			{
				array_push($titre, $ligne_news['Titre_News']);
				array_push($contenu, $ligne_news['Contenu']);
				array_push($date, $ligne_news['Date']);
				array_push($code, $ligne_news['Code_News']);
				$nd++;
			}
			if ($nd >= 5){
				$nd=5;
			}
			for($d = 0; $d<$nd; $d++)
			{
				?>
				<table width="641" border="0" cellspacing="0" cellpadding="0">
					<tr>
						<td width="470"><span class="Style1"><?php echo($titre[$d]) ?></span></td>
						<td width="171"><span class="Style1"><?php echo($date[$d]) ?></span></td>
					</tr>
					<tr>
					  <td colspan="2"><hr /></td>
				  </tr>
					<tr>
						<td colspan="2"><form id="form1" name="form1" method="post" action="">
						  <span class="Style1"><?php echo(substr($contenu[$d],0,150).'...'); ?>
						  <br />
						  <input type="submit" name="Submit" value="Lire la suite" />
						  </span>
						  <input name="menu" type="hidden" id="menu" value="1" />
						  <input name="ssmenu1" type="hidden" id="ssmenu1" value="1" />
						  <input name="code" type="hidden" id="news" value="<?php echo($code[$d]) ?>" />
						</form>					  </td>
					</tr>
				</table>
				<?php
			}
		}
		mysql_free_result($rech_news);
	}
Ca c'est pour afficher les 5 premieres news...

Le problème c'est qu'a la connexion au site, c'est cette page quis ert de page d'accueil, hors a chaque fois j'ai cette erreur :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\News\Index.php on line 26

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\News\Index.php on line 63
ligne 26 : while($ligne_news = mysql_fetch_assoc($rech_news))
ligne 63 : mysql_free_result($rech_news);

Donc j'aimerais savoir pourquoi des fois j'ai ca... Car bon, en faisant quelque F5, la page finit par s'afficher correctement, donc j'ai du mal a comprendre ce qu'il se passe...

Eléphanteau du PHP | 11 Messages

08 avr. 2006, 16:49

je croi que le probleme est dans la var $sql le syntaxe de requet MySQL est incorrect il faut enlever les guaimets du nom de table et du nom de colonne et mettre une ; à la fin donc il devient comme suit
$sql = "SELECT * FROM news ORDER BY Date DESC;" ;

PsykotropyK
Invité n'ayant pas de compte PHPfrance

08 avr. 2006, 17:10

Bon peut-être ca simplifie le code mais en tout cas ca règle pas le problème... D'ailleurs, voila pour un autre bout de code qui chie (et avec les changement ed guillement) :
<form id="form1" name="form1" method="post" action="">
<?php
$connexion = mysql_pconnect($serveur, $admin, $mdp);
$sql = "SELECT *".
" FROM client".
" ORDER BY Code_Cli";
if($connexion != false)
{
	$rech_cli = mysql_query($sql, $connexion);
	$nd = 0;
	$code = array();
	$nom = array();
	$adr = array();
	while($ligne_cli = mysql_fetch_assoc($rech_cli))
	{
		array_push($nom, $ligne_cli['Nom_Cli']);
		array_push($adr, $ligne_cli['Adr_Cli']);
		array_push($code, $ligne_cli['Code_Cli']);
		$nd++;
	}
	if ($nd >= 5){
		$nd=5;
	}
	?>
	<select name="model" id="model" onchange="document.forms['chgfinition'].submit();">
    <option value="-1">- - - Choisissez un client - - -</option>	
	<?php
	for($d = 0; $d<$nd; $d++)
	{
		?>
		<option value="<?php echo($code[$d]); ?>"<?php echo((isset($client) && $client == $code[$d])?" selected=\"selected\"":null); ?>><?php echo($nom[$d]); ?> - <?php echo($adr[$d]); ?></option>
		<?php
	}
	?>
	</select>
	<?php
}
mysql_free_result($rech_cli);

?>
  <p><br />
    <input name="menu" type="hidden" id="menu" value="6" />
    <input name="ssmenu6" type="hidden" id="ssmenu6" value="1" />
  </p>
</form>
Et comme d'hab, en faisant quelques rafraichissement, ou en recliquant sur le bouton et bien tout marche comme il faut... voila le message d'erreur, qui est le même que d'habitude mais bon...
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\Proposition\Client.php on line 14

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in d:\apps\easyphp1-8\www\audi - phase 2\Proposition\Client.php on line 38
Sinon, il semble qu'en mettant un $rech_cli = NULL; au début, cela règle le problème mais bon vu que ca marchait quand même un pêu avant je préfere pas m'avancer...

PsykotropyK
Invité n'ayant pas de compte PHPfrance

08 avr. 2006, 17:15

A non ca regle pas le problème

Eléphant du PHP | 254 Messages

08 avr. 2006, 17:34

Bonjour as tu essayé de changer la requête SQL ?
$sql = "SELECT *". 
" FROM client". 
" ORDER BY Code_Cli"; 
par
$sql = "SELECT * FROM client ORDER BY Code_Cli ASC"; 

PsykotropyK
Invité n'ayant pas de compte PHPfrance

08 avr. 2006, 18:31

non ca a rien a voir, la tu ne fais que changer la facon de trier, et si ca devait venir de la ca planterais a chaque fois, hors des fois ca plante, mais bon des fois non (en général non)...

En fait les ligne qui plante c'est au niveau de mysql_fetch_assoc et de mysql_free_result. Donc j'aimerais comprendre pourquoi...

Enfin je vais quand meme rajouter ASC ca fera toujours ca de plus 'léché' dans mon code lol...

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

08 avr. 2006, 22:24

Pour ta 2ème erreur (mysql_free_result()), c'est parceque tu fais celui-ci en dehors du if dans lequel la requête est exécuté.. du coup s'il ne rentre pas dans le if(), il va essayer de liberer la ressource alors qu'elle n'est pas utilisée, et donc générer une erreur.

Un test que tu peux faire est de vérifier s'il y a un resultat avant le while :
if($rech_cli) {
  while($ligne_cli = mysql_fetch_assoc($rech_cli)) {
    ...
  }
  mysql_free_result($rech_cli);
}
tu peux aussi ajouter un or die(mysql_error()) lors de l'execution voir s'il n'y a pas d'erreur :)

Eléphanteau du PHP | 11 Messages

09 avr. 2006, 18:09

puisque tu veus envoie ta requette à la base essaie d'utiliser cet function
$result = mysql_query($query);

$query est la requette à envoier

Invité
Invité n'ayant pas de compte PHPfrance

09 avr. 2006, 21:40

Bon la solution fournit par Ryle marche, maintenant la grande question, c'est pourquoi des fois il attribue quelquechose pour $rech_client et pourquoi des fois non...

Vu que bon ça a l'air totalement aléatoire...

PsykotropyK
Invité n'ayant pas de compte PHPfrance

10 avr. 2006, 02:07

Au fait, je pensais comme ca (sisi je penses je vous jures ^^)

Viola comment est mon script désormais :
if($rech_cli) {
  while($ligne_cli = mysql_fetch_assoc($rech_cli)) {
    ...
  }
  mysql_free_result($rech_cli);
}else{
  include("erreur.php");
}
Donc il m'affiche un joli message invitant mon utilisateur a rafraichir sa page internet... Mais n'y aurait-il pas une commande pour la raffraichir automatiquement...???

PsykotropyK
Invité n'ayant pas de compte PHPfrance

10 avr. 2006, 02:17

J'entends par la un vrai rafraichissement pas juste une redirection vers la meme page si erreur (ca pourrait marcher pour certaines pages mais pas pour d'autre, me faut vraiment ce qui se rapproche le plus du rafraichissement)

PsykotropyK
Invité n'ayant pas de compte PHPfrance

10 avr. 2006, 10:07

J'ai (re) étudié le code source d'ou j'avais tiré mes infos pour faire mon script, et je voulais savoir si mon erreur ne viendrait pas de la:

Dans le code d'origine, la première requete envoyé à la table avait un code dans ce genre :
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $sql1 = "SELECT *".
    " FROM `model`";
    $rech_model = mysql_query($sql1);
    $code_model = array();
.....................
Puis ensuite un code comme ca
$sql2 = "SELECT *".
" FROM `finition`".
" WHERE `Code_Mod` = ". $modnum ."";
if($connexion != false)
{
	$rech_finition = mysql_query($sql2, $connexion);
.....................
toujours intégrer à la premier boucle if($connexion != false)

En gros la différence avac mon code c'est que j n'ai pas de $choix_base = mysql_select_db(...) et que tout n'est pas inclus dans cette première boucle if($connexion != false)

Si quelqu'un pense que ca peut venir de la merci de me faire signe (dsl j'ai pas spécialement envie de teste j'ai trop de modif a faire, si ca doit être inutile ....)