Lecture Mysql via PHP

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 14:24

Bonjour à tous,

je suis débutant en php et je cherche depuis déjà qques jours la solution à mon problème mais sans succès.

Mon problème :

J'ai la requête sql suivante :
SELECT * FROM `fff_livres` WHERE `Prénom` LIKE 'S%'
pas de problème jusque là, quand je l'utilise sous mysql tout fonctionne bien

1ère question : Comment faire pour récupérer les résultats et les afficher dans une page PHP ?
2ème question : Il y'a des doublons aux résultats de ma requête, comment faire pour ne pas tous les afficher ? (par exemple j'ai comme résultat : Sophie, Sophie, Sandra, Séraphine..., je voudrais qu'il apparaisse : Sophie, Sandra, Séraphine)

d0m
Mammouth du PHP | 1141 Messages

02 août 2007, 14:29

1ère question : Comment faire pour récupérer les résultats et les afficher dans une page PHP ?
Cette partie du manuel répondra à ta question.
2ème question : Il y'a des doublons aux résultats de ma requête, comment faire pour ne pas tous les afficher ? (par exemple j'ai comme résultat : Sophie, Sophie, Sandra, Séraphine..., je voudrais qu'il apparaisse : Sophie, Sandra, Séraphine)
Tu peux les éliminer en ajoutant la close DISTINCT à ta requête :

Code : Tout sélectionner

SELECT DISTINCT * FROM `fff_livres` WHERE `Prénom` LIKE 'S%'

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 14:43

Merci bien, je vais essayer ca de suite.

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 14:49

Je viens d'essayer la close DISTINCT dans ma requête et pourtant les doublons sont encore là. Y'a t-il autre chose à modifier dans ma requête pour les eliminer ?

d0m
Mammouth du PHP | 1141 Messages

02 août 2007, 15:21

Je viens d'essayer la close DISTINCT dans ma requête et pourtant les doublons sont encore là. Y'a t-il autre chose à modifier dans ma requête pour les eliminer ?
En faisant un SELECT *, tu selectionnes tous tes champs donc le distinct va s'appliquer à tous les champs de ta table. C'est à dire que 2 lignes considéré comme pareille si TOUS les champs sont égaux.

Si tu utilises juste les prenoms de ta requete, alors tu peux selectionner juste le champ prenom :

Code : Tout sélectionner

SELECT DISTINCT `prénom` FROM `fff_livres` WHERE `Prénom` LIKE 'S%'
Sinon si tu dois utiliser des autres informations de la table fff_livres de cette requête,
tu traites en php par exemple en faisant un tablea associatif :
disons que les résultats de ta requête sont dans la variable $fff_livres contenant des tableaux associatif issues de la requête :
$tableau_prenom = array();
foreach($fff_livres as $fff_livre){
  $tableau_prenom[$fff_livre['prénom']] = $fff_livre['prénom'];
}
tu auras donc à la fin de la boucle un tableau associatif avec pour clés et valeurs les prénoms.
Comme dans un tableau, 2 clés ne peuvent pas être égales tu auras chaque prénom une seule fois dans le tableau.

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 15:37

Merci, la première solution à l'air d'être la bonne vu qu'elle fonctionne parfaitement.

Vu que je suis "tombé" sur qqun qui s'y connait mieux que moi pourrais tu me dire ce que tu penses de mon bout de code afin de l'améliorer :
<?php
// selection de la BDD
mysql_select_db($database,$protect) or die('Erreur de selection.'.mysqsl_error());

// création de la requête SQL
$sqlA = 'SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE \'A%\'';
$sqlB = 'SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE \'B%\'';

// envoie la requête
$reqA = mysql_query($sqlA) or die('Erreur SQL'.sql.'<br>'.mysql_error());
$reqB = mysql_query($sqlB) or die('Erreur SQL'.sql.'<br>'.mysql_error());

// récuperation du resultat
$resultA = mysql_fetch_array($reqA);
$resultB = mysql_fetch_array($reqB);

$serieA = $resultA['serie'];			
$serieB = $resultB['serie'];			
?>
J'utilise ensuite dans ma page la fonction echo pour afficher le résultat de mes requêtes, comme tu peux le voir je vais être obligé de créer 27 requêtes, ....

Y'a t-il une solution pour me permettre de remédier à ce problème ?

d0m
Mammouth du PHP | 1141 Messages

02 août 2007, 15:51

Déjà entourer les requetes sql de doubles quotes au lieu de simple evite de mettre des /'
$sqlA = "SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE 'A%';";
La seule chose qui change dans tes requêtes c'est la close LIKE.
Il suffit de passer en variable les caractères dans le LIKE et de boucler:
$dans_like = array('A','B','C',....,'Z');
$sql = array();
foreach($dans_like as $caractere){
  $sql[$caractere] = "SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE '".$caractere."%';";
}
le reste je te laisse le faire c'est toujours une histoire de boucle.

Sinon si de toutes façcon tu vas afficher toutes les séries, tu as autant faire 1 seule requête selectionnant toutes les series ordonnées par ordre alphabetique (close ORDER BY) et ensuite pour les classer par lettre en php vérifier la première lettre de chaque résultat par les fonctions de chaines de caractères.

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 16:09

Merci bien de toutes ces réponses, j'ai pas tout compris :? mais je vais essayer.

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 17:31

Bon, je pense m'apporcher de la solution :) , voici mon nouveau code :
$dans_like = array('A','B','C');

$sql = array();
$req = array();
$result = array();
$serie = array();
foreach($dans_like as $caractere)
	{ 
	$sql[$caractere] = "SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE '".$caractere."%';"; 
	$req[$caractere] = mysql_query($sql[$caractere]) or die('Erreur SQL'.sql.'<br>'.mysql_error()); 
	$result[$caractere] = mysql_fetch_array($req[$caractere]);
	$serie[$caractere] = $result[$caractere]['serie'];
	}

et plus loin sur ma page :
echo $serie['A'];
Donc cela m'affiche bien le premier résultat mais j'ai du oublier qqchose (ou mal comprendre le système de boucle :cry: ) car il ne m'affiche que le premier résultat des séries commencant par A.

Désolé pour toutes ces questions mais j'ai beaucoup de mal avec le php... :(
Encore merci de l'aide que tu m'apportes.

ViPHP
ViPHP | 5924 Messages

02 août 2007, 18:46

Non, sacrebleu, on ne met pas des requètes sql dans des boucles. S'il faut chercher plusieurs caractères, on le fait dans une même requète :

Code : Tout sélectionner

SELECT DISTINCT `serie` FROM `fff_livres` WHERE `serie` LIKE 'A%' OR `serie` LIKE 'B%' OR`serie` LIKE 'C%';
Faudrait arrêter de faire souffrir le serveur SQL des fois…

d0m
Mammouth du PHP | 1141 Messages

02 août 2007, 19:01

pour une requete il faut utiliser mysql_fetch_array dans une boucle qui va parcourir chaque ligne résultat de la requete. Regardes du coté de la documentation de la fonction, il y a des exemples.

Freu
Invité n'ayant pas de compte PHPfrance

02 août 2007, 19:33

Merci d0m pour ton aide je vais voir par moi-même.

Sékiltoyai c'est pas parcequ'on est doué dans un domaine qu'il faut se croire obliger d'être désagréable avec les gens qui débutent. Merci quand même.

ViPHP
ViPHP | 5924 Messages

02 août 2007, 19:52

Non, là je ne suis pas désagréable, crois moi. :)