Affichage par l'initiale

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 : Affichage par l'initiale

par cmoi » 09 avr. 2009, 22:30

Merci pour cette dernière aide très précieuse. J'ai modifié le code ainsi
<?php  
    $table = "subscribers";  
	$i = 0;
    $sql = "SELECT * FROM " . $table." where UPPER(LEFT(NOM,1)) IN ('D') ORDER BY NOM" ;
    $res = mysql_query($sql);  
	$nbr_req = mysql_num_rows($res); // récupère le nombre de résultats de la requête 
	echo "      <table> 
        <tr width=\"70%\" valign=\"top\"> 
          <td width=\"25%\" bgcolor=\"#FF9900\"><i><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#666666\"></font></i></td> 
          <td width=\"28%\" bgcolor=\"#FF9900\" valign=\"top\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Ville </font></b></div> 
          </td> 
         <td width=\"27%\" bgcolor=\"#FF9900\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Secteur d'activité</font></b></div>
          </td>
        </tr> 
        <tr width=\"70%\" valign=\"top\">\n"; 
		while ($i < $nbr_req) {
        echo '<td valign="top"><a href="http://'.mysql_result($res,$i,"SITE").'" target="_blank"<b><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "NOM").' '.mysql_result($res, $i, "prenom").'</font></b></a></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "Ville").'<br /></font></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="left" >'.mysql_result($res, $i, "Activite").'<br /></font></td>';  
        echo "</tr>\n";  
		$i++; 
		}
    echo "      </table>\n"; 
?>

par Ryle » 09 avr. 2009, 15:03

Ta variable $nb contient, d'après le code que tu nous donnes, le nombre total d'enregistrement en base et non pas le nombre d'enregistrements retournés par ta requête... donc forcément, si tu 10 enregistrements en base, mais seulement 2 qui commencent par un A, quand dans ta boucle tu demandes de lire le 3ème, tu as ce message d'erreur puisque la requête n'a retourné que 2 lignes...

Par ailleurs, si tu vires le while(), tu enlèves le message d'erreur (du moins tant qu'il y a au moins un enregistrement qui commence par la lettre demandée), mais par contre, vu que tu ne boucles pas sur chaque ligne, tu n'as que la première...
$i = 0;
$sql = "SELECT * FROM " . $table." where UPPER(LEFT(NOM,1)) IN ('A') ORDER BY NOM" ; 
$res = mysql_query($sql); // exécute la requête
$nombreDEnregistrementTrouvesParLaRequete = mysql_num_rows($res); // récupère le nombre de résultats de la requête

while ($i < $nombreDEnregistrementTrouvesParLaRequete) { // pour $i allant de 0 jusq'au nombre de résultats trouvés
  echo mysql_result($res, $i, "NOM"); // affiche la colonne NOM, de la ligne $i, des enregistrements contenus dans $res.
}

par cmoi » 08 avr. 2009, 19:56

$nb = mysql_num_rows(mysql_query("SELECT id FROM $table"));
Cette variable renvoit le nombre d'enregistrements.

J'ai donc modifié l'ensemble du code ainsi :
<?php  
    $table = "subscribers";  
    $sql = "SELECT * FROM " . $table." where UPPER(LEFT(NOM,1)) IN ('A') ORDER BY NOM" ;
    $res = mysql_query($sql);  
	echo "      <table> 
        <tr width=\"70%\" valign=\"top\"> 
          <td width=\"25%\" bgcolor=\"#FF9900\"><i><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#666666\"></font></i></td> 
          <td width=\"28%\" bgcolor=\"#FF9900\" valign=\"top\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Ville </font></b></div> 
          </td> 
         <td width=\"27%\" bgcolor=\"#FF9900\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Secteur d'activité</font></b></div>
          </td>
        </tr> 
        <tr width=\"70%\" valign=\"top\">\n"; 
        echo '<td valign="top"><a href="http://'.mysql_result($res,"SITE").'" target="_blank"<b><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "NOM").' '.mysql_result($res, $i, "prenom").'</font></b></a></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "Ville").'<br /></font></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="left" >'.mysql_result($res, $i, "Activite").'<br /></font></td>';  
        echo "</tr>\n";  
    echo "      </table>\n"; 
?>
Il n'y a désormais plus de message d'erreur. Mais, il ne s'affiche qu'un seul nom : le dernier des A !

Bizarrerie : le lien sur le nom renvoit vers un numéro : 165 en l'occurrence ?? Cette partie du code n'a pourtant pas été touchée.

Autre bizarrerie : avec B au lieu de A, 1 nom aussi, pas le premier, pas le dernier. Avec C, rien : messages d'erreur. Avec D, un nom.

Je n'y comprends rien !!!

par Ryle » 08 avr. 2009, 18:54

php ne parvient pas à lire le 9 ème enregistrement retourné par ta requête.... sans doute parce qu'elle n'en retourne que 8 ?

Tu demandes à php de s'arrêter de parcourir les enregistrement quand $i est égal à $nb ... mais on ne sait ni d'où sort ce nb, ni ce qui te permet d'affirmer que ta requête a retourné très exactement $nb enregistrements ... :roll:

par cmoi » 08 avr. 2009, 17:29

en modifiant ainsi :
<?php  
    $table = "subscribers";  
    $sql = "SELECT * FROM " . $table." where UPPER(LEFT(NOM,1)) IN ('A') ORDER BY NOM" ;
    $res = mysql_query($sql);  
    $i = 0;  
	echo "      <table> 
        <tr width=\"70%\" valign=\"top\"> 
          <td width=\"25%\" bgcolor=\"#FF9900\"><i><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#666666\"></font></i></td> 
          <td width=\"28%\" bgcolor=\"#FF9900\" valign=\"top\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Ville </font></b></div> 
          </td> 
         <td width=\"27%\" bgcolor=\"#FF9900\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Secteur d'activité</font></b></div>
          </td>
        </tr> 
        <tr width=\"70%\" valign=\"top\">\n"; 

    while ($i < $nb) 
    {  
        echo '<td valign="top"><a href="http://'.mysql_result($res, $i, "SITE").'" target="_blank"<b><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "NOM").' '.mysql_result($res, $i, "prenom").'</font></b></a></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "Ville").'<br /></font></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="left" >'.mysql_result($res, $i, "Activite").'<br /></font></td>';  
        echo "</tr>\n";  
		$i++;  
    }  
    echo "      </table>\n"; 
?>
j'obtiens bien une liste de noms commençant par A dans le tableau initial. Mais j'ai aussi àa :

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 9 on MySQL result index 9 in /homez.14/businessr/www/membres3.php on line 122

qui se répète des dizaines de fois avant.

par Ryle » 08 avr. 2009, 16:23

Quand tu ouvres une balise <?php, tout le code qu'elle contient va être interprété par php. Il ne s'attend à trouver que des choses qu'il connait (des fonctions, des variables, etc.)

Si en plein milieu du code, tu lui mets un TOTO, il va s'intérroger quelques minutes sur ce que tu es en train de lui demander (un peu comme un chien à qui tu vas demander de donner la patte la première fois). Si en revanche, tu lui mets 'TOTO', il va se dire ok, c'est une chaine, le développeur sait ce qu'il fait, je ne m'en préoccupe pas ;)

En l'occurence, quand tu as l'instruction :
$tb = array(A, B, C); 
php va analyser : "je déclare la variable $tb, à laquelle j'affecte un tableau, ce tableau contient A... tiens ? c'est quoi A ? c'est une constante ? hmm.. non ça n'a pas l'air vu que le dev l'a pas définie... peut être une chaine de caractères ? supposons que oui et poursuivons... ensuite nous avons B... tiens ? c'est quoi B ? c'est une constante ? ...

Alors que comme ça :
$tb = array('A', 'B', 'C'); 
php va analyser : "je déclare la variable $tb, à laquelle j'affecte un tableau, ce tableau contient les chaines "A", "B" et "C". ... au final ca revient au même (tant que tu n'as pas de constante qui s'appelle A) mais c'est quand même plus propre ;)


Par ailleurs pour rendre ton code plus lisible, n'hésite pas à utiliser des apostrophes dans tes guillemets et inversement, et surtout, n'en mets pas autour des éléments qui ne sont pas des chaines :
$sql = "SELECT * FROM ". $table ." WHERE UPPER(LEFT(nom, 1)) IN ('A', 'B', 'C') ORDER BY nom" ; 
Si tu en mets autour de "nom", la fonction LEFT va te retourner la première lettre de la chaine "NOM", c'est à dire "N" et pas la première de la valeur contenue dans la colonne nom ;)

par cmoi » 08 avr. 2009, 15:55

    $sql = "SELECT * FROM " . $table." where UPPER(LEFT(\"NOM\", \"1\")) IN (\"A\", \"B\", \"C\")ORDER BY NOM" ;
$tb = array(A, B, C);
$list = implode('", "', $tb);
'SELECT  FROM " . $table." WHERE UPPER(LEFT(\"NOM\", \"1\")) IN ("'.$list.'")ORDER BY NOM';
J'ai modifié ainsi et il y a un début d'affichage. Par contre je ne comprends pas l'histoire des chaînes !

par Ryle » 08 avr. 2009, 15:08

Alors commençons par un petit rappel sur les chaines :)

Les chaines de caractères sont délimités soit par des guillemets ("), soit par des apostrophes ('). Elle ne peut pas commencer par une guillemet et se terminer par une apostrophe, ni inversement. Si on ouvre des guillemets, on ferme des guillemets :)

Une chaine délimitée par des guillemets peut contenir des apostrophes. Mais si celle-ci contient des guillemets, ces dernières doivent être protégées d'un antoslash (\) pour éviter que php ne pense avoir atteint la fin de la chaine :
$txt = "L'apostrophe"; // correct
$txt = "Les "guillemets""; // faux (cf. la coloration syntaxique)
$txt = "Les \"guillemets\""; // correct
De la même manière, une chaine délimitée par des apostrophes peut contenir des guillemets, mais doit protéger les apostrophes qu'elle contient.

A noter par ailleurs qu'à l'intérieur de guillemets les variables sont interprétées, mais ce n'est pas le cas avec les apostrophes. D'une manière générale, il vaut mieux sortir les variables des chaines et utiliser le point pour les concaténer.
$chaine1 = "chaine n°1"; 
echo "Ma chaine est : $chaine1"; // affiche : Ma chaine est : chaine n°1 
echo 'Ma chaine est : $chaine1'; // affiche : Ma chaine est : $chaine1 (la variable n'est pas interprétée) 
echo 'Ma chaine est : ' . $chaine1; // affiche : Ma chaine est : chaine n°1 



Sachant cela, tu peux déjà corriger les premières lignes de ton code :
$sql = "SELECT * FROM " . $table." where UPPER(LEFT(`NOM`, "1")) IN ("A", "B", "C") ORDER BY NOM" ; // tu as des guillemets entre guillemets

$tb = array(A, B, C); // A, B et C devraient être des chaines.

'SELECT  FROM " . $table." WHERE UPPER(LEFT(`NOM`, "1")) IN ("'.$list.'")'ORDER BY NOM"; // tu mélanges apostrophes et guillemets pour délimiter ta chaine...
A noter que cette dernière ligne ne sert pas à grand chose si tu ne stocke pas ta chaine quelque part... soit elle te sert et il te faut l'utiliser, soit elle ne te sert pas et dans ce cas, autant la supprimer :)

par Nours312 » 08 avr. 2009, 15:08

as tu constaté le confli entre tes " ... ?

$sql = "SELECT * FROM " . $table." where UPPER(LEFT(`NOM`, '1')) IN ('A', 'B', 'C') ORDER BY NOM" ;

alors ... ?

et au passage vires les lignes 4,5, et 6, qui n'ont pas lieux d'etre ici ... ct pour l'exemple ;)

par cmoi » 08 avr. 2009, 14:09

voici l'ensemble du code. La ligne 105 correspond à la ligne 3 ici ($sql = "SELECT * FROM ....)
<?php  
    $table = "subscribers";  
    $sql = "SELECT * FROM " . $table." where UPPER(LEFT(`NOM`, "1")) IN ("A", "B", "C") ORDER BY NOM" ;
$tb = array(A, B, C);
$list = implode('", "', $tb);
'SELECT  FROM " . $table." WHERE UPPER(LEFT(`NOM`, "1")) IN ("'.$list.'")'ORDER BY NOM";
    $res = mysql_query($sql);  
    $i = 0;  
    echo "      <table> 
        <tr width=\"70%\" valign=\"top\"> 
          <td width=\"25%\" bgcolor=\"#FF9900\"><i><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\" color=\"#666666\"></font></i></td> 
          <td width=\"28%\" bgcolor=\"#FF9900\" valign=\"top\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Ville </font></b></div> 
          </td> 
         <td width=\"27%\" bgcolor=\"#FF9900\"> 
            <div align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#666666\">Secteur d'activité</font></b></div>
          </td>
        </tr> 
        <tr width=\"70%\" valign=\"top\">\n"; 

    while ($i < $nb) 
    {  
        echo '<td valign="top"><a href="http://'.mysql_result($res, $i, "SITE").'" target="_blank"<b><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "NOM").' '.mysql_result($res, $i, "prenom").'</font></b></a></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="center" >'.mysql_result($res, $i, "Ville").'<br /></font></td>';  
        echo '<td valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#666666" align="left" >'.mysql_result($res, $i, "Activite").'<br /></font></td>';  
        echo "</tr>\n";  
		$i++;  
    }  
    echo "      </table>\n"; 
?>

par Nours312 » 08 avr. 2009, 13:22

ben qu'y a t-il à la ligne 105 ? et précédemment ?

par cmoi » 08 avr. 2009, 11:43

C'est tout mon problème les règles de syntaxe ! Quel est le problème avec mon code ?

par Ryle » 08 avr. 2009, 09:42

Ca, c'est une erreur php... tu as un problème de syntaxe à la ligne 105 de ton code (sachant que si le problème est détecté ligne 105, l'origine de celui-ci peut très bien être situé ligne 105 comme dans une des lignes précédentes..)

Respecte les règles de syntaxe de php (et de sql quand tu fais des requêtes) et tu devrais éviter ce genre de problème :)

par cmoi » 08 avr. 2009, 09:17

Voilà le message d'erreur que je reçois

Parse error: syntax error, unexpected T_LNUMBER in /homez.14/businessr/www/membres3.php on line 105

par Nours312 » 07 avr. 2009, 20:13

Ca ne marche pas mieux !
as tu constaté le confli entre tes " ... ?

$sql = "SELECT * FROM " . $table." where UPPER(LEFT(`NOM`, '1')) IN ('A', 'B', 'C') ORDER BY NOM" ;

mysql ne te retournais pas d'erreur ? mysql_error()

@+