Page 1 sur 2

Affichage par l'initiale

Posté : 06 avr. 2009, 22:20
par cmoi
Bonjour,

je souhaiterais que les données soient extraites en fonction du nom, mais en précisant de A à C, puis de D à F par exemple, etc ...

Pour la première partie, j'entre un code de ce type :
$sql = "SELECT * FROM " . $table." ORDER BY NOM";
Mais pour la 2e partie ... ?

Merci de m'aider à trouver l'info.

Posté : 07 avr. 2009, 01:00
par Nours312
salut, tu as plusieurs possibilité, tout dépend ce que tu souhaites vraiement, le plus simple serait de dire :

where UPPER(LEFT(`nom_champ`, "1")) IN ("A", "B", "C")

// le tableau utilisé par IN estant une chaine, il paut etre fabriqué en amont :

$tb = array(A, B, C);
$list = implode('", "', $tb);
'SELECT ... WHERE UPPER(LEFT(`nom_champ`, "1")) IN ("'.$list.'")';  

... voila ... Cela t'aides t il ? @+

Posté : 07 avr. 2009, 15:41
par cmoi
j'ai essayé cela, mais ça ne va pas
$sql = "SELECT * FROM " . $table." ORDER BY NOM where UPPER(LEFT(`NOM`, "1")) IN ("A", "B", "C") ;
$tb = array(A, B, C);
$list = implode('", "', $tb);
'SELECT  FROM " . $table." ORDER BY NOM WHERE UPPER(LEFT(`NOM`, "1")) IN ("'.$list.'")';
que faut-il faire d'autre ?

Posté : 07 avr. 2009, 15:59
par Ryle
Il faudrait essayer en respectant la position du ORDER BY dans la requête, ça pourrait peut être aider ;)

Posté : 07 avr. 2009, 19:33
par cmoi
j'ai inversé l'ordre ainsi
    $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";
Ca ne marche pas mieux !

Posté : 07 avr. 2009, 20:13
par Nours312
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()

@+

Posté : 08 avr. 2009, 09:17
par cmoi
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

Posté : 08 avr. 2009, 09:42
par Ryle
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 :)

Posté : 08 avr. 2009, 11:43
par cmoi
C'est tout mon problème les règles de syntaxe ! Quel est le problème avec mon code ?

Posté : 08 avr. 2009, 13:22
par Nours312
ben qu'y a t-il à la ligne 105 ? et précédemment ?

Posté : 08 avr. 2009, 14:09
par cmoi
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"; 
?>

Posté : 08 avr. 2009, 15:08
par Nours312
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 ;)

Posté : 08 avr. 2009, 15:08
par Ryle
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 :)

Posté : 08 avr. 2009, 15:55
par cmoi
    $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 !

Posté : 08 avr. 2009, 16:23
par Ryle
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 ;)