2017-03-28 5 views
4

Ok, je suppose que le titre n'est pas le meilleur titre, mais permettez-moi d'expliquer mon problème: Je crée un site Web qui doit afficher des messages de personnes (de toute façon), et je doivent montrer leur photo du profil de gravatar, donc ce que je faisais:Exécuter une requête SQL à l'intérieur d'une autre requête SQL

<?php 
      function get_gravatar($email, $s = 80, $d = 'mm', $r = 'g', $img = false, $atts = array()) { 
       $url = 'https://www.gravatar.com/avatar/'; 
       $url .= md5(strtolower(trim($email))); 
       $url .= "?s=$s&d=$d&r=$r"; 
       if ($img) { 
        $url = '<img src="' . $url . '"'; 
        foreach ($atts as $key => $val) 
         $url .= ' ' . $key . '="' . $val . '"'; 
        $url .= ' />'; 
       } 
       return $url; 
      } 
      require("db.php"); 
      $sql = "SELECT * FROM posts ORDER BY date DESC"; 
      foreach ($db->query($sql) as $row) { 
       // var_dump($row); 
       $user = $row['user_id']; 
       $sql_user = "SELECT email FROM users WHERE id = $user"; 
       foreach ($db->$sql_user as $row_user) { 
        var_dump($row_user); 
        echo "<img src=\"".get_gravatar($row_user['email'])."\"/>"; 
       } 
       echo "<h2>".$row['title']."</h2><br/>"; 
       echo "<p>".$row['content']."</p><br/>"; 
      } 

mais, cela ne fonctionne pas (bien, cela fonctionne, mais il ne me montre pas la photo du profil de l'utilisateur, seul le poster). Donc, je pense que le problème est que je ne peux pas appeler 2 fois la variable $db en même temps, mais je ne suis pas sûr, c'est pourquoi m = pourquoi je demande s'il y a un moyen de résoudre mon problème ou pour sélectionner 2 tables en même temps.

+0

voir votre deuxième foreach vous manquez de mettre la fonction de requête –

Répondre

2

vous pouvez court votre logique

$sql="SELECT u.email " 
        . "FROM posts AS p " 
        . "LEFT JOIN users AS u " 
        . "ON u.id=p.user_id " 
        . "ORDER BY p.date DESC"; 
+0

Pourriez-vous développer? Je veux dire, pourriez-vous expliquer comment je peux l'utiliser? –

+0

Cela vaut mieux, car vous ne lancerez pas plusieurs requêtes dans votre boucle interne, ce qui ajoute un surcoût. Aussi je pense qu'il devrait être "SELECT p.user_id, u.email" dans la première partie. u et p mélangés. – waltron

+0

il suffit d'appeler la colonne que vous voulez, dans votre cas, '$ row ['email']', ceci est déjà lié aux données des utilisateurs.also vous pouvez obtenir '$ row ['user_id']' en single 'result set' –

1

utilisation join

SELECT * FROM users join posts on users.id =Posts.user_id ORDER BY date DESC 
1

Vous pouvez simplement utiliser JOIN

clause JOIN est utilisé pour combiner les lignes de deux ou plusieurs tables, sur la base une colonne liée entre eux.

+0

join et Union sont très différents – Jens

+0

@Jens Oui, ils sont différents ... UNION est utilisé pour combiner le résultat de plusieurs instructions SELECT dans un ensemble de résultats unique. tandis que la clause JOIN est utilisée pour combiner des lignes de deux tables ou plus, en fonction d'une colonne connexe entre elles ... il pourrait utiliser tout ceci pour obtenir son résultat ... il voulait sélectionner 2 tables en même temps .. – NID

+0

Non il ne peut pas. Vous ne pouvez pas résoudre un problème avec des fonctions très différentes – Jens

1

vous n'appliquez pas la requête à chaîne sql deuxième foreach

foreach ($db->query($sql_user) as $row_user) { 
+0

Votre solution fonctionne, mais je préfère la rejoindre, merci: –

+0

vous préférez une solution qui est une suggestion mais pas la solution pour votre question ..? .. normalement la soution est acceppeted .. et la suggestion sont marqués comme utiles .. – scaisEdge

1

voir votre deuxième foreach vous oubliez de mettre la fonction de requête

foreach ($db->query($sql) as $row) { 



foreach ($db->query($sql_user) as $row_user) { 
+0

Votre solution fonctionne, mais je préfère la rejoindre, merci :) –