Affichage par l'initiale

Eléphant du PHP | 440 Messages

06 avr. 2009, 22:20

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.
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 661 Messages

07 avr. 2009, 01:00

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 ? @+

Eléphant du PHP | 440 Messages

07 avr. 2009, 15:41

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 ?
Débutant complet en php/mysql. Merci pour votre aide.

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

07 avr. 2009, 15:59

Il faudrait essayer en respectant la position du ORDER BY dans la requête, ça pourrait peut être aider ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

07 avr. 2009, 19:33

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 !
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 661 Messages

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()

@+

Eléphant du PHP | 440 Messages

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
Débutant complet en php/mysql. Merci pour votre aide.

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

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

08 avr. 2009, 11:43

C'est tout mon problème les règles de syntaxe ! Quel est le problème avec mon code ?
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 661 Messages

08 avr. 2009, 13:22

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

Eléphant du PHP | 440 Messages

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"; 
?>
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 661 Messages

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 ;)
Modifié en dernier par Nours312 le 08 avr. 2009, 15:10, modifié 1 fois.

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

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

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 !
Débutant complet en php/mysql. Merci pour votre aide.

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

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 ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...