Page 1 sur 2

J'ai un message d'erreur dans un tableau

Posté : 12 mai 2007, 10:29
par alaingpl
Bonjour à tous,

J'ai réalisé un livre d'or qui affiche par page les 5 derniers messages et le visiteur passe de page en page avec ce type de navigation :
1 | 2 | 3 et les messages s'affichent de 5 en 5.
http://www.qcmresto.fr/simone/index2.ph ... 1&debut=10

Malheureusement lorsque que le total des messages n'est pas un multiple de 5, à la dernière page j'ai un message d'erreur: Il ne peut pas passer à la ligne suivante.Dans l'exemple à la ligne 14.

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 13 on MySQL result index 9 in /home4/s/sitweb-chr/www/simone/livreor/livre_or.php on line 95

Est - ce que quelqu'un aurait une idée car là je "séche" ?
Merci d'avance de l'aide
<?
	$req3=mysql_query("SELECT * FROM message ORDER BY dater DESC");
	$nbr3=mysql_num_rows($req3);
	if ($nbr3=="0") 
			{ 
		echo "<FONT FACE=\"Arial\" SIZE=2 COLOR=#000000><b><center>Aucun message dans le forum</center></b>";
			}
	else
			{
		if ($debut+5<=$nbr3) { $fin=$debut+4; } else { $fin=$nbr3; }
		for ($i=$debut;$i<=$fin;$i++)
			{
			$nom = mysql_result($req3,$i+0,"nom");
			$message = mysql_result($req3,$i+0,"message");
			$dater = mysql_result($req3,$i+0,"dater");
			$dater2= substr($dater,8,2)."/".substr($dater,5,2)."/".substr($dater,0,4)." à ".substr($dater,11,8);	
			
			echo "<font size=2>$message</font><br>";
			echo "<div align=right><i>$nom, le $dater2</i>";
			echo "</div>";
			echo "<br>";
			echo "<font color=#808080>";
			for ($j=1;$j<=160;$j++) { echo "·"; }
			echo "</font><br>";
			
			}
			}
				
?>

<? 
			
		$nbrpage=ceil($nbr3/5);
		echo "<FONT FACE=\"Arial\" SIZE=2 COLOR=#000000><center>";
		for ($i=1;$i<=$nbrpage;$i++)
			{
			$debut2=5*($i-1)+0;
			if ($debut2!=$debut)
			{
					echo '<a href="index2.php?page=livreor/livre_or.php&Numero=1&debut='.$debut2.'">'.$i.'</a>';
			}
			else
			{
				echo "<b>$i</b>";
			}
			if ($i!=$nbrpage) { echo " | "; }
			}
		
?>		

Posté : 12 mai 2007, 10:33
par thehawk
regarde le tuto tres bien explique du site du zero
Tuto

Posté : 12 mai 2007, 10:57
par alaingpl
Merci pour l'aide mais ce qu'il est expliqué sur le site du zéro est déjà ce que je fais ici.

J'utilise déjà la fonction CEIL
Je demande : total de page ($nbrpage) doit être égal au nombre de message ($nbr3) divisé par 5. CEIL arrondi au chiffre supérieur si celui ci n'est donc pas un multiple de 5.
C'est pour cela que je ne comprends pas qu'il m'affiche un message d'erreur.
 $nbrpage=ceil($nbr3/5); 

Posté : 12 mai 2007, 11:11
par thehawk
Regarde precisement :
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
Puis tu regarde si la demande $_GET[debut] est superieur au total des message et si oui tu met a la place de 15 tu met ton total

Posté : 12 mai 2007, 12:34
par alaingpl
Si j'ai bien compris:

$_get[debut] est inférieur au total des message car la $debut est égal à 0 Elle fait référence au dernier message posté. Elle est donc égal à 0.
Pour passer de 5 en 5 j'effectue ça:
for ($i=1;$i<=$nbrpage;$i++)
			{
			$debut2=5*($i-1)+0;
			if ($debut2!=$debut)
			{
					echo '<a href="index2.php?page=livreor/livre_or.php&Numero=1&debut='.$debut2.'">'.$i.'</a>';

Posté : 12 mai 2007, 13:16
par jed
Bonjour, je souhaiterais faire la même chose mais je n'utilise pas de bdd, mon concept est le parcours des dossiers sur le serveur, pouvez vous m'aider svp?

Posté : 12 mai 2007, 13:20
par Truc
jed, tu ferais mieux d'ouvir ton propre sujet sinon ça va vite devenir fouilli :?

Des sujets traitant de parcours de dossiers exitent déjà.

Posté : 13 mai 2007, 10:57
par alaingpl
J'ai fait un test sur la variable $ndr3. Elle compte bien le nombre d'entrée dans la base de données.
Je ne comprends pas d'où peut venir le pbl.

Posté : 13 mai 2007, 11:17
par alaingpl
Le message d'erreur venait de ces 3 lignes.
                                        $nom = mysql_result($req3,$i+0,"nom");
			$message = mysql_result($req3,$i+0,"message");
			$dater = mysql_result($req3,$i+0,"dater");
			$dater2= substr($dater,8,2)."/".substr($dater,5,2)."/".substr($dater,0,4)." à ".substr($dater,11,8);	
Grâce à Albat qui dans un autre forum m'a donné cette bidouille : mettre une @ devant une fonction pour cacher les messages d'erreurs.
J'ai donc ré - écrit :
                                        $nom = @mysql_result($req3,$i+0,"nom");
			$message = @mysql_result($req3,$i+0,"message");
			$dater = @mysql_result($req3,$i+0,"dater");
			$dater2= substr($dater,8,2)."/".substr($dater,5,2)."/".substr($dater,0,4)." à ".substr($dater,11,8);	
Je précise que mon code fonctionnait très bien et que le message d'erreur n'influençait pas le résultat. Il "polluait" la page.

Posté : 13 mai 2007, 11:33
par jojolapine
bouh... pas beau ça :(
Il ne faut jamais cacher la misère, en dev comme ailleur...

Posté : 13 mai 2007, 11:39
par Ryle
Le "@" va en effet cacher les messages d'erreur ou d'alerte... il n'y a parfois pas d'autres solution (mais c'est assez rare) mais cela revient à dire que ton code contient des erreurs, que ton traitement a un problème, mais que comme le résultat aujourd'hui es bon, au lieu d'essayer de le comprendre et de le résoudre, tu vas juste le cacher en croisant les doigts pour espérer que le jour ou ca explosera, tu seras assez loin pour que ça ne soit pas pour ta pomme ;)

Faudrait voir combien de ligne sont retournées, que contient la ligne "13", qu'est ce qui peut bloquer php... (et accessoirement $i+0 ou $i tout court, ca revient au même :))

Et c'est albat qui t'a suggéré de faire ça ? il va m'entendre le bougre !!
il fait bien d'aller donner ce genre de conseils sur d'autres forum ;)

Posté : 13 mai 2007, 11:45
par jojolapine
Et c'est albat qui t'a suggéré de faire ça ? il va m'entendre le bougre !!
il fait bien d'aller donner ce genre de conseils sur d'autres forum ;)
Non non va pas le gronder, il a simplement parler de cacher la misère en comparant les développeurs de vista et les mauvais développeurs php
(cf http://www.phpfrance.com/forums/voir_re ... php#192131)
Il n'a jamais conseillé de le faire ;)

Posté : 13 mai 2007, 11:52
par Ryle
Arf, oki, je comprend mieux, c'est peut être l'ironie ou la phrase suivante qui a du échapper à alaingpl :
Peut-être le même philosophie qui prévaut chez les mauvais développeurs PHP
M'enfin je le gronderais quand même, je sais qu'il aime bien ça ;)

Posté : 13 mai 2007, 12:58
par alaingpl
Bon, bon , ça va. Moi non plus j'aime pas cacher les messages d'erreurs (c'est la premiere fois)mais comme mon code fonctionne c'était la meilleure solution car je suis dessus depuis vendredi soir et j'ai sauté dessus (l'@) bien sûr. Juré, craché, je ne recommencerai plus..

Merci à Ryle qui m'a mis sur une piste que j'avais complétement omise :
et accessoirement $i+0 ou $i tout court, ca revient au même
je l'ai ré-écrite da façon suivante :
for ($i=$debut;$i+1<=$fin;$i++)
Bien sûr j'ai enlevé les @.
Pour d'autres voici le code complet avec le formulaire et vous pouvez voir le résultat à l'adrese suivante : http://www.qcmresto.fr/simone/index2.ph ... =1&debut=0

Dans quelques semaines :
www.lameresimone.com " livre d'or"
Merci à tous de l'aide.
<HTML>
<HEAD>
	<TITLE>Restaurant La Mère Simone</TITLE>
<LINK rel=stylesheet type="text/css" href="../style.css">
<style type="text/css">
<!--
#menu a {
display:inline;
color:#0033FF;
text-decoration:none;
}
-->
</style>

</HEAD>

<BODY BGCOLOR="#FFFFFF">
<div id="menu">
<?
	require("admin/config.php");
	$mysql_link =  MYSQL_CONNECT("$localhost","$login","$mot") OR DIE("Unable to connect to database !!");
	@mysql_select_db($dbName ,$mysql_link ) or die( "Unable to select database ??");
	
	    if (isset($_POST['nom']) AND isset($_POST['message2']))
{
    
    $nom = htmlentities($_POST['nom'], ENT_QUOTES); 
        
    $message = htmlentities($_POST['message2'], ENT_QUOTES); 
    $message = nl2br($message2); 
    
		$dater=date("Y-m-d H:i:s");
		$req=mysql_query("INSERT INTO message (nom, message, dater) VALUES ('$nom','$message','$dater')");
		echo"<br><div align=\"center\">Nous vous remercions de l'intérêt que vous portez à notre établissement</div>";
		
?>
		
<?
	}
?>

		<TABLE CELLPADDING=0 CELLSPACING=0 WIDTH="500" BORDER=0>
		<TR>
			<TD width="500"><br>
			<p><center><b><em><h3>Notre livre d'or</h3></em></b></center></p><br>
			</TD>
		</TR>
		<TR>
			<TD COLSPAN=3>
				<TABLE CELLPADDING=10 CELLSPACING=0 WIDTH="500" BORDER=1 BORDERCOLOR=#808080 style="border-collapse: collapse" ALIGN=MIDDLE>
				<TR>
				  <TD ALIGN=LEFT VALIGN=MIDDLE WIDTH=400>
						<div align=justify>
						<font face="Arial" size=1 color=#000000>
<?
	$req3=mysql_query("SELECT * FROM message ORDER BY dater DESC");
	$nbr3=mysql_num_rows($req3);
	if ($nbr3=="0") 
			{ 
		echo "<FONT FACE=\"Arial\" SIZE=2 COLOR=#000000><b><center>Aucun message dans le forum</center></b>";
			}
	else
			{
		if ($debut+5<=$nbr3) { $fin=$debut+4; } else { $fin=$nbr3; }
		for ($i=$debut;$i+1<=$fin;$i++)
			{
			$nom = mysql_result($req3,$i+0,"nom");
			$message = mysql_result($req3,$i+0,"message");
			$dater = mysql_result($req3,$i+0,"dater");
			$dater2= substr($dater,8,2)."/".substr($dater,5,2)."/".substr($dater,0,4)." à ".substr($dater,11,8);	
			
			echo "<font size=2>$message</font><br>";
			echo "<div align=right><i>$nom, le $dater2</i>";
			echo "</div>";
			echo "<br>";
			echo "<font color=#808080>";
			for ($j=1;$j<=160;$j++) { echo "·"; }
			echo "</font><br>";
			
			}
			}
				
?>

<? 
			
		$nbrpage = ceil($nbr3 / 5);
		echo "<FONT FACE=\"Arial\" SIZE=2 COLOR=#000000><center>";  
		for ($i=1;$i<=$nbrpage;$i++)
			{
			$debut2=5*($i-1)+0;
			if ($debut2!=$debut)
			{
					echo '<a href="index2.php?page=livreor/livre_or.php&Numero=1&debut='.$debut2.'">'.$i.'</a>';
			}
			else
			{
				echo "<b>$i</b>";
			}
			if ($i!=$nbrpage) { echo " | ";}
			}

mysql_close();
?>					</TD>
				</TR>
				</TABLE><br>

				<TABLE CELLPADDING=10 CELLSPACING=0 WIDTH="500" BORDER=0 BORDERCOLOR=#808080 style="border-collapse: collapse" ALIGN=MIDDLE>
				<TR>
					<TD ALIGN=CENTER VALIGN=MIDDLE>

						<FORM id="formulaire_de_contact" METHOD="POST" ACTION="index2.php?page=livreor/livre_or.php" NAME="livre">
		</font><br>
						
						<div>
						<label for="nom">Nom ou Pseudo</label>
						<INPUT TYPE="TEXT" id="nom" NAME="nom" VALUE="">
						</div>
						 <div>
						 <label for="sujet">Message</label>
						<TEXTAREA NAME="message2" ROWS=5 COLS=50> </TEXTAREA>
						</div>
						<INPUT TYPE="HIDDEN" NAME="debut" VALUE="<? echo "$debut"; ?>">
						<div>
						<input type="reset" id="reset" name="Submit" value="Tout effacer">  
						<input type="submit" id="submit" name="Submit" value="Signer le livre d'or">
						</div>
											
	
		</TABLE>

	</TD>
</TR>
</TABLE>
</FORM>
</div>
</BODY>
</HTML>

Posté : 13 mai 2007, 13:30
par Ryle
Cool ! Ben ça, ça fait plaisir :)

Tiens, pis histoire d'alléger encore un peu :
for ($i=$debut;$i+1<=$fin;$i++) 
// revient au même que
for ($i=$debut;$i<$fin;$i++) 
Ca permet de moins se poser de question pour savoir quand il doit s'arrêter :)


Et par ailleurs ici :
<INPUT TYPE="HIDDEN" NAME="debut" VALUE="<? echo "$debut"; ?>">
il n'est pas nécessaire de mettre des guillemets autour d'une variable pour l'utiliser, tu peux l'afficher directement
<INPUT TYPE="HIDDEN" NAME="debut" VALUE="<? echo $debut; ?>" />
"Sortez vos mor.. euh.. vos variables..." ;)