J'ai créé une relation entre une table et une autre table dont les champs sont répétés deux fois de suite et le résultat était nouveau lors de l'expérience sur phpMyAdmin mais lors de l'expérience sur PHP et imprimé en Gausson, les résultats n'étaient pas affichés comme requis, où il a imprimé un champ deux fois et n'a pas imprimé l'autre champ

<?php
  include_once("include/config.php");
  header('Content-Type:text/html; charset=utf-8');
  $sql = "
  SELECT po.post_id
       , po.title_post
       , po.user_id
       , po.admin_id 
       , us.id
       , us.fname
       , us.lname 
       , aus.id
       , aus.fname
       , aus.lname 
    FROM postmy po 
    JOIN dataUser us 
    JOIN dataUser aus 
      ON po.user_id = us.id 
     AND po.admin_id = aus.id 
   ORDER 
      BY po.post_id ASC
  ";
$r = mysqli_query($conn,$sql);
$result = array();
 while($row = mysqli_fetch_array($r)){
   array_push($result,array(
  "post_id"=>$row['post_id'],
  "title_post"=>$row['title_post'],
  "user_id"=>$row['user_id'],
  "admin_id"=>$row['admin_id'],
  "us.id"=>$row['id'],
  "us.fname"=>$row['fname'],
  "us.lname"=>$row['lname'],
  "aus.id"=>$row['id'],
  "aus.fname"=>$row['fname'],
  "aus.lname"=>$row['lname']        
 ));    
 }
 echo json_encode(array('result'=>$result));
 mysqli_close($conn);   
?>
1
salem715 27 janv. 2019 à 19:28

3 réponses

Meilleure réponse

Vous devez utiliser un alias pour les colonnes répétées

  $sql = "SELECT po.post_id
      , po.title_post
      , po.user_id
      , po.admin_id 
      , us.id
      , us.fname
      , us.lname 
      , aus.id ausid
      , aus.fname ausfname
      , aus.lname auslname 
    FROM postmy po 
    INNER JOIN dataUser us ON po.user_id = us.id  
    INNER  JOIN dataUser aus  ON po.admin_id = aus.id
   ORDER BY po.post_id ASC";

$r = mysqli_query($conn,$sql);
....


"post_id"=>$row['post_id'],
"title_post"=>$row['title_post'],
"user_id"=>$row['user_id'],
"admin_id"=>$row['admin_id'],
"us.id"=>$row['id'],
"us.fname"=>$row['fname'],
"us.lname"=>$row['lname'],
"aus.id"=>$row['iduas'],
"aus.fname"=>$row['fnameaus'],
"aus.lname"=>$row['lnameaus']   

(et appliquer le ON spécifique à chaque table)

1
scaisEdge 27 janv. 2019 à 16:34

Vous devez utiliser des alias de colonne ou votre PHP écrasera l'une de ces valeurs de colonnes car un index ne peut contenir qu'une seule valeur. Exemple https://3v4l.org/jnMvj

SELECT po.post_id
   , po.title_post
   , po.user_id
   , po.admin_id 
   , us.id
   , us.fname
   , us.lname 
   , aus.id as au_id
   , aus.fname as au_fname
   , aus.lname as au_lname
FROM postmy po 
JOIN dataUser us 
JOIN dataUser aus 
  ON po.user_id = us.id 
 AND po.admin_id = aus.id 
ORDER 
  BY po.post_id ASC

Accédez ensuite aux champs au_ de la récupération.

while($row = mysqli_fetch_array($r)){
   array_push($result,array(
  "post_id"=>$row['post_id'],
  "title_post"=>$row['title_post'],
  "user_id"=>$row['user_id'],
  "admin_id"=>$row['admin_id'],
  "us.id"=>$row['id'],
  "us.fname"=>$row['fname'],
  "us.lname"=>$row['lname'],
  "aus.id"=>$row['au_id'],
  "aus.fname"=>$row['au_fname'],
  "aus.lname"=>$row['au_lname']        
 ));

Sinon, vous pourriez utiliser le numeric indices mais c'est volatile à mon avis. Si vous supprimez / ajoutez une colonne, tous les index devront peut-être être modifiés.

0
user3783243 27 janv. 2019 à 16:36

Une remarque:

Cette...

FROM postmy po 
JOIN dataUser us 
JOIN dataUser aus 
  ON po.user_id = us.id 
 AND po.admin_id = aus.id 

... serait normalement écrit comme ceci ...

FROM postmy po 
JOIN dataUser us 
  ON us.id = po.user_id 
JOIN dataUser aus 
  ON aus.id = po.admin_id 
0
Strawberry 27 janv. 2019 à 16:32