deux requêtes/deux foreach sont-ils nécessaires ?

Eléphant du PHP | 58 Messages

21 nov. 2009, 19:25

Bonsoir,

pour afficher deux valeurs de champ (ID et NOM) de ma base de données, je répète deux fois la même chose (2 requêtes / 2 foreach), comme dans le code ci-dessous. Est-ce qu'il y a mieux ?
$requete1 = "SELECT ID 
FROM visiteurs 
WHERE ID = '$n'
";

$resultat1 = mysql_query($requete1);

while ($ligne1 = mysql_fetch_array($resultat1, MYSQL_ASSOC))
{
if (mysql_errno())
{
die("<br>".mysql_errno()." : ".mysql_error()."<br>");
}

foreach ($ligne1 as $nom1=>$colonne1)
{
{print("<tr><td>$colonne1.  ");}
}
} // fin du while RESULTAT1

$requete1 = "SELECT NOM 
FROM visiteur 
WHERE ID = '$n'
";

$resultat1 = mysql_query($requete1);

while ($ligne1 = mysql_fetch_array($resultat1, MYSQL_ASSOC))
{
if (mysql_errno())
{
die("<br>".mysql_errno()." : ".mysql_error()."<br>");
}

foreach ($ligne1 as $nom1=>$colonne1)
{
{print("$colonne1 : </td>");}
}
} // fin du while RESULTAT1
Merci de m'instruire.

Mammouth du PHP | 2937 Messages

22 nov. 2009, 13:11

Avec PDO, tu peux utiliser la méthode fetchAll (), qui renvoie dans un tableau toutes les lignes retournées.
<?php
// On essaie la requête
try
{
  // Instanciation de l'objet PDO (nom du serveur MySQL, nom de la base, identifiant, mot de passe)
  $pdo = new PDO ('mysql:host=localhost;dbname=tabase', 'root', 'mdp');
  // On rédige la requête…
  $sql = "SELECT id FROM visiteurs WHERE id = :id";
  // … qu'on prépare…
  $stmt = $pdo -> prepare ($sql);
  // … en associant au paramètre :id la valeur de $n, en vérifiant que $n correspond bien à un entier SQL
  $stmt -> bindParam (':id', $n, PDO::PARAM_INT);
  // Exécution de la requête
  $stmt -> execute ();

  // Résultat de la requête
  $resultat = $stmt -> fetchAll (PDO::FETCH_ASSOC);
  if (empty ($resultat)):
?>
  <p>Aucun résultat n'a été retourné</p>
<?php
  else:
?>
  <table>
    <thead>
      <tr>
        <th scope="col">Colonne</th>
      </tr>
    </thead>
    <tbody>
<?php
    foreach ($resultat as $valeur):
?>
      <tr>
        <td><?php echo $valeur['id']; ?></td>
      </tr>
<?php
    endforeach;
?>
    </tbody>
  </table>
<?php
  endif;

  // On détruit l'objet PDO
  $pdo = null;
}
// On lance une exception en cas de souci
catch (PDOException $e)
{
?>
  <p><?php echo $e -> getMessage (); ?></p>
<?php
  exit;
}
?>

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 nov. 2009, 17:05

Je vois pas bien le rapport avec la question, avant de passer par PDO, est-ce qu'il ne valait pas mieux dire qu'on pouvait effectivement faire une seule requête, en récupérant les deux colonnes et en les affichant les deux à la fois pour chaque ligne de résultat ? :)

Mammouth du PHP | 2937 Messages

22 nov. 2009, 17:17

Je vois pas bien le rapport avec la question, avant de passer par PDO, est-ce qu'il ne valait pas mieux dire qu'on pouvait effectivement faire une seule requête, en récupérant les deux colonnes et en les affichant les deux à la fois pour chaque ligne de résultat ? :)
Au temps pour moi : je n'avais pas remarqué du premier coup la seconde requête.

Donc, dimi3, il suffit d'effectuer un :
$requete = "SELECT ID, NOM FROM visiteur WHERE ID = '$n'";
Après, rien ne t'empêche de découvrir PDO. ;)

Eléphant du PHP | 58 Messages

22 nov. 2009, 18:54

Merci à tous.

Le "select", je sais faire. Ce qui me pose problème est le "foreach" . Comment coder pour récupérer les deux valeurs "id" et "nom" par exemple dans un seul "foreach" (si c'est possible) ?

Merci encore.

Mammouth du PHP | 2937 Messages

22 nov. 2009, 19:00

Comment coder pour récupérer les deux valeurs "id" et "nom" par exemple dans un seul "foreach" (si c'est possible) ?
Si tu pars de ton code existant, tu n'as besoin de boucle foreach. À l'intérieur de ta boucle while, tu peux accéder aux valeurs de tes deux colonnes pour la ligne actuellement parcourue comme suit :
$requete = "SELECT ID, NOM 
FROM visiteurs 
WHERE ID = '$n'";

$resultat = mysql_query ($requete);

while ($ligne = mysql_fetch_array ($resultat, MYSQL_ASSOC))
{
  if (mysql_errno ()) die (mysql_errno ().' : '.mysql_error ());
  else echo 'id = '.$ligne['ID'].'; nom = '$ligne['NOM'].';'."\n";
}

Eléphant du PHP | 58 Messages

22 nov. 2009, 21:51

Merci mille fois, c'est exactement ce que je voulais. C'est tellement plus simple que mes foreach... Je vais balancer mon bouquin plein de mauvaises solutions !
Merci encore et bon début de semaine.

Mammouth du PHP | 2937 Messages

22 nov. 2009, 22:16

Je vais balancer mon bouquin plein de mauvaises solutions !
Si tu veux le remplacer par un autre, je te conseille PHP 5 avancé. ;)

Eléphant du PHP | 58 Messages

23 nov. 2009, 07:58

Merci pour le conseil. J'irai faire les librairies un de ces 4.
Bonne journée.