Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

php/mysql : probleme pour gerer la sortie d'une boucle

7 réponses
Avatar
christophe Raverdy
Bonjour.

J'ai "développé" une fonction qui est une abstraction de la fonction
mysql_fetch_assoc. En théorie elle permet de retourner une structure
(l'enregistrement) ou le booléen FALSE.

-------------------------------------------------------------------------
function extraire_ligne($identifiant)
{
[initialisation des fragments pour $message]
$message = concatene2_5($contexte_0,$contexte_1,$contexte_2,$contexte_3
$contexte_4);
// cf http://fr.php.net/manual/fr/function.mysql-fetch-array.php
$ligne = mysql_fetch_assoc($identifiant) or die($message);
// on retourne par contre FALSE si rien n'est trouvé : il faut l'exploiter
return($ligne);
}
-------------------------------------------------------------------------


J'utilise cette fonction pour générer un champ select :

----------------------------------------------------------------
echo '<select name="Marche" onChange ="resubmit();" >';
$aaffiche = "<option value='0'> Choisissez une Procédure d'Achat
</option>";
echo $aaffiche;
while ($ligne=extraire_ligne($id_requete))
{
$complement = (( $ligne['Code_Procedure'] == $value) ? ' selected ' : '');
$aaffiche = "<option value=" . $ligne['Code_Procedure'] . $complement . ">
" . $ligne['Nom_Procedure'] . "</option>";
echo $aaffiche;
}

echo "</select>\n";
----------------------------------------------------------------

J'ai fait des tests divers, la requête fonctionne correctement, par contre
on ne sort jamais de la boucle : la zone de liste s'affiche correctement,
mais en voyant le code je me rends compte qu'il manque la balise de
terminaison.

Par contre, avec un compteur sur le nombre d'enregistrements comme présenté
ci-dessous, il n'y a plus de problème.

----------------------------------------------------------------
for( $compteur=nombre_enregistrements($id_requete);$compteur>0;$compteur--)
{
$ligne=extraire_ligne($id_requete);
$complement = (( $ligne['Code_Procedure'] == $value) ? ' selected ' : '');
$aaffiche = "<option value=" . $ligne['Code_Procedure'] . $complement . ">
" . $ligne['Nom_Procedure'] . "</option>";
echo $aaffiche;
}

----------------------------------------------------------------

Avez-vous une idée de la raison pour laquelle mysql_fetch_assoc ne
fonctionne pas comme prévu (modulo l'interface chaise-clavier) ?


D'avance, merci.

--
christophe

7 réponses

Avatar
Lionel
while ($ligne=extraire_ligne($id_requete))
normal, cette condition est toujours vraie.


Avatar
Olivier Miakinen

J'ai "développé" une fonction qui est une abstraction de la fonction
mysql_fetch_assoc. En théorie elle permet de retourner une structure
(l'enregistrement) ou le booléen FALSE.

-------------------------------------------------------------------------
function extraire_ligne($identifiant)
{
[initialisation des fragments pour $message]
$message = concatene2_5($contexte_0,$contexte_1,$contexte_2,$contexte_3
$contexte_4);
// cf http://fr.php.net/manual/fr/function.mysql-fetch-array.php
$ligne = mysql_fetch_assoc($identifiant) or die($message);


Ok.

// on retourne par contre FALSE si rien n'est trouvé : il faut l'exploiter
return($ligne);


Ben non : si c'était FALSE tu as quitté le script par die($message).

}
-------------------------------------------------------------------------



J'ai fait des tests divers, la requête fonctionne correctement, par contre
on ne sort jamais de la boucle : la zone de liste s'affiche correctement,
mais en voyant le code je me rends compte qu'il manque la balise de
terminaison.


Plus exactement, il y a un moment où tu sors de la boucle, mais tu sors
du script par la même occasion, ce qui fait que la ligne de code suivant
la boucle ne s'exécute jamais.

Par contre, avec un compteur sur le nombre d'enregistrements comme présenté
ci-dessous, il n'y a plus de problème.


Normal : tu ne passes plus par le die()

Avatar
machour
christophe Raverdy wrote in message news:...
Bonjour.
Bonjour,


J'ai "développé" une fonction qui est une abstraction de la fonction
mysql_fetch_assoc. En théorie elle permet de retourner une structure
(l'enregistrement) ou le booléen FALSE.

-------------------------------------------------------------------------
function extraire_ligne($identifiant)
{
[initialisation des fragments pour $message]
$message = concatene2_5($contexte_0,$contexte_1,$contexte_2,$contexte_3
$contexte_4);
// cf http://fr.php.net/manual/fr/function.mysql-fetch-array.php
$ligne = mysql_fetch_assoc($identifiant) or die($message);
// on retourne par contre FALSE si rien n'est trouvé : il faut l'exploiter
return($ligne);
}
-------------------------------------------------------------------------


Ta fonction stoppe l'exécution du script PHP dès que
mysql_fetch_assoc() retourne false. Normal que le </select> ne
s'affiche pas dans le premier cas.
D'ailleur, à quoi te sers cette fonction ? ôÖ

--
Mehdi

Avatar
christophe Raverdy
Mehdi Achour a écrit:

christophe Raverdy wrote in message
news:...
Bonjour.
Bonjour,


J'ai "développé" une fonction qui est une abstraction de la fonction
mysql_fetch_assoc. En théorie elle permet de retourner une structure
(l'enregistrement) ou le booléen FALSE.

-------------------------------------------------------------------------
function extraire_ligne($identifiant)
{
[initialisation des fragments pour $message]
$message = concatene2_5($contexte_0,$contexte_1,$contexte_2,$contexte_3
$contexte_4);
// cf http://fr.php.net/manual/fr/function.mysql-fetch-array.php
$ligne = mysql_fetch_assoc($identifiant) or die($message);
// on retourne par contre FALSE si rien n'est trouvé : il faut
l'exploiter
return($ligne);
}
-------------------------------------------------------------------------


Ta fonction stoppe l'exécution du script PHP dès que
mysql_fetch_assoc() retourne false. Normal que le </select> ne
s'affiche pas dans le premier cas.


???
http://www.nexen.net/docs/php/annotee/function.return.php

Il me semblait que quel que soit le langage, le return permettait de revenir
à l'instruction qui suit l'appel de fonction, avec empilement d'une valeur
de retour si elle est fournie.

Je m'étais planté dans le lien donc je reprends précisément :
http://fr.php.net/manual/fr/function.mysql-fetch-assoc.php :
mysql_fetch_assoc() retourne un tableau associatif qui contient la ligne lue
dans le résultat result, ou bien FALSE, s'il ne reste plus de lignes à
lire.

Dans ma sous-fonction je fais un appel à mysql_fetch_assoc() et c'est son
résultat (tableau ou FALSE) qui est retourné et affecté à la variable
$ligne.

Tel que je ne comprends pas pourquoi le *script* se retrouve impacté.


D'ailleur, à quoi te sers cette fonction ? ôÖ


abstraction de façon à ce que la personne en charge de la maintenance
ultérieure de l'application ne soit pas dépendante du SGBD.

--
christophe

P.S. je n'ai pas encore lu les deux réponses précédentes.


Avatar
christophe Raverdy
Olivier Miakinen a écrit:

-------------------------------------------------------------------------
function extraire_ligne($identifiant)
{
[initialisation des fragments pour $message]
$message = concatene2_5($contexte_0,$contexte_1,$contexte_2,$contexte_3
$contexte_4);
// cf http://fr.php.net/manual/fr/function.mysql-fetch-array.php
$ligne = mysql_fetch_assoc($identifiant) or die($message);


Ok.


J'ai une question subsidiaire qui m'est apparue ultérieurement;
C'est lié notamment à la priorité des opérateurs.

Donc, dans mon esprit je prévois qu'une API retournera soit une valeur soit
une "exception". Je découvre à l'instant que die est l'équivalent de la
fonction exit qui termine le script.

En fait je prévoyais 3 cas selon 2 types :

- anormal (par exemple mauvais $identifiant) dans ce cas déclenchement
d'une erreur;
- normal qu'il y ait comme réponse FALSE (pas d'enregistrement) ou
enregistrement;

Dois-je comprendre (c'est ce que je pense percevoir maintenant) qu'il n'y
a en fait que de cas possible :
- Enregistrement
- FALSE (quelle qu'en soit la raison) ?


// on retourne par contre FALSE si rien n'est trouvé : il faut
l'exploiter
return($ligne);


Ben non : si c'était FALSE tu as quitté le script par die($message).


Je hais l'algèbre booléenne. En fait je le voyais le 'or' comme un
gestionnaire d'erreurs. Tout devient plus simple quand on RTFM.


Normal : tu ne passes plus par le die()


Mauvaise ICC, changer ICC

P.S. désolé pour Mehdi : le contexte n'était pas clair mais ma réponse a été
incorrecte.

--
christophe

<bruit> merci encore </bruit> et désolé pour Me


Avatar
christophe Raverdy
Lionel a écrit:

while ($ligne=extraire_ligne($id_requete))
normal, cette condition est toujours vraie.



Ok, je commence à comprendre.

--
christophe


Avatar
John GALLET
Bonjour,

abstraction de façon à ce que la personne en charge de la maintenance
ultérieure de l'application ne soit pas dépendante du SGBD.


Alors ne réinvente pas la roue octogonale, et utilise une vraie couche
d'abstraction SGBDR. Par exemple http://adodb.sourceforge.net/ qui est
disponible en 100% php ou en extension C. On peut aussi citer pear-db.

a++;
JG