PHP MySQL while - for

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 15:20

Bonjour,
lorsque j'inclue for dans while j'obtiens seulement le premier résultat
comment faire pour obtenir toute la table svp?

Code : Tout sélectionner

$posts = array(); $posts[] = array('status' => 'ok'); $seenbydata = array(); while ($row = $result->fetch_assoc()) { $msgid = $row['id']; $msgdate = $row['date']; $sendby = $row['sendby']; $sendto = $row['sendto']; $message = $row['message']; $sendername = $row['sendername']; $attach = $row['file']; $msgdateago = timeago($msgdate); $seenby = json_decode($row['seenby']); for ($i = 0; $i < count($seenby); $i++) { $seenid = $seenby[$i]; $sql = "SELECT CONCAT(users.prenom, ' ', users.nom) AS name FROM users WHERE identifiant = '$seenid'"; $result = $conn->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $seenbydata[] = array('seenby' => array( 'id' => $seenid, 'name' => $row['name'] )); } } } $posts[] = array( 'convdata' => array( 'msgid' => $msgid, 'msgdate' => $msgdate, 'msgdateago' => $msgdateago, 'seen' => $seenbydata, 'sendby' => $sendby, 'sendto' => $sendto, 'message' => $message, 'attach' => $attach, 'sendername' => $sendername ) ); }
si je retire for j'obtiens la table complete mais bon il me faut le contenu du for aussi
j'encode le tout en json

Mammouth du PHP | 2703 Messages

03 nov. 2020, 15:24

while ($row = $result->fetch_assoc()) {
while ($row = $result->fetch_assoc()) {

ne va pas sans poser un problème.

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 15:36

while ($row = $result->fetch_assoc()) {
while ($row = $result->fetch_assoc()) {

ne va pas sans poser un problème.
Merci de ta réponse

en faisant ceci j'ai une erreur

Code : Tout sélectionner

for ($i = 0; $i < count($seenby); $i++) { $seenid = $seenby[$i]; $sql2 = "SELECT CONCAT(users.prenom, ' ', users.nom) AS name FROM users WHERE identifiant = '$seenid'"; $result2 = $conn->query($sql2); if ($result2->num_rows > 0) { while ($row2 = $result2->fetch_assoc()) { $seenbydata[] = array('seenby' => array( 'id' => $seenid, 'name' => $row2['name'] )); } } }

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 15:41

j'ai réglé, le problem vient du coté de la BDD j'avais des valeur non trouvable pour for

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 15:58

effectivement j'ai un problem avec while, j'ai tout en double

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 16:33

J'ai enfin réussi, voici le code pour ceux qui en aurait besoin un jour

Code : Tout sélectionner

<?php include "config.php"; $sql = "SELECT * FROM messages "; $result = $conn->query($sql); if ($result->num_rows > 0) { $posts = array(); $posts[] = array('status' => 'ok'); while ($row = $result->fetch_assoc()) { $seenby = json_decode($row['seenby']); $msgid = $row['id']; $seenby2 = array(); foreach($seenby as $key => $value) { $sql = "SELECT CONCAT(users.prenom, ' ', users.nom) AS name FROM users WHERE identifiant = '$value'"; $result2 = $conn->query($sql); if ($result2->num_rows > 0) { while ($row2 = $result2->fetch_assoc()) { $seenby2[] = array('user' => array( 'id' => $value, 'name' => $row2['name'] )); } } } $posts[] = array( 'msgid' => $msgid, 'seenby' => $seenby2 ); } } header('Content-Type: application/json'); echo json_encode($posts, JSON_PRETTY_PRINT); $conn->close();

Mammouth du PHP | 2703 Messages

03 nov. 2020, 16:38

pourquoi les données présentes dans le json ne sont pas dans la base de données ?

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 18:15

pourquoi les données présentes dans le json ne sont pas dans la base de données ?
En fait c'est une partie du code d'une messagerie que j'essaye de créer
dans la base de donnés il y a une colonne json ou je stock les id des utilisateurs qui ont vu le message
Ensuite avec php je vais chercher dans la BDD le nom + prénom pour chaque id utilisateur du json.

Toujours en développement mais voici le code php pour voir les messages d'une conversation

Code : Tout sélectionner

<?php include "config.php"; function timeago($date) { $timestamp = strtotime($date); $strTime = array("secondes", "minutes", "heurs", "jours", "mois", "an"); $length = array("60", "60", "24", "30", "12", "10"); $currentTime = time(); if ($currentTime >= $timestamp) { $diff = time() - $timestamp; for ($i = 0; $diff >= $length[$i] && $i < count($length) - 1; $i++) { $diff = $diff / $length[$i]; } $diff = round($diff); return "Il y'a $diff $strTime[$i]"; } } session_start(); $userid = $_SESSION['identifiant']; $conversation = $_POST['conversation']; $sql = "SELECT messages.id, messages.date, sendby, message, sendto, seenby, CONCAT( users.prenom, ' ', users.nom) AS sendername, file FROM messages LEFT JOIN users ON sendby = users.identifiant LEFT JOIN (SELECT msgid, file FROM messages_attach WHERE convid = '$conversation') AS attach ON messages.id = attach.msgid WHERE conversation = '$conversation' AND NOT JSON_CONTAINS(deletedfor, '\"$userid\"') ORDER BY date ASC"; $result = $conn->query($sql); if ($result->num_rows > 0) { $posts = array(); $posts[] = array('status' => 'ok'); while ($row = $result->fetch_assoc()) { $msgid = $row['id']; $msgdate = $row['date']; $sendby = $row['sendby']; $sendto = $row['sendto']; $message = $row['message']; $sendername = $row['sendername']; $attach = $row['file']; $msgdateago = timeago($msgdate); $seenby = json_decode($row['seenby']); $seenby2 = array(); foreach ($seenby as $key => $value) { $sql = "SELECT CONCAT(users.prenom, ' ', users.nom) AS name FROM users WHERE identifiant = '$value'"; $result2 = $conn->query($sql); if ($result2->num_rows > 0) { while ($row2 = $result2->fetch_assoc()) { $seenby2[] = array('user' => array( 'id' => $value, 'name' => $row2['name'] )); } } } $posts[] = array( 'msgdata' => array( 'msgid' => $msgid, 'msgdate' => $msgdate, 'msgdateago' => $msgdateago, 'seen' => $seenby2, 'sendby' => $sendby, 'sendto' => $sendto, 'message' => $message, 'attach' => $attach, 'sendername' => $sendername ) ); } } header('Content-Type: application/json'); echo json_encode($posts, JSON_PRETTY_PRINT); $conn->close();
sil y a possibilité de faire ce que je veux faire directement en mysql je suis preneur,
c'est à dire faire JOIN pour trouver les noms prenom en utilisant la colonne json pour les id

Mammouth du PHP | 2703 Messages

03 nov. 2020, 18:30

avec une table de 2 champs, idmessage et iduser, pas besoin de json. et il sera possible de faire une seule requête pour tout avoir.

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 19:55

avec une table de 2 champs, idmessage et iduser, pas besoin de json. et il sera possible de faire une seule requête pour tout avoir.
c'est ce que j'avais fait au départ mais finalement j'ai opté pour du json pour ne pas avoir une base de données trop lourde. Je ne sais pas si c'est mieux

Mammouth du PHP | 2703 Messages

03 nov. 2020, 20:40

clairement pas. faire une seule requete sql par rapport à une requete puis une requete dans un while, cela n'a rien à voir en terme de charge du serveur.

Eléphanteau du PHP | 40 Messages

03 nov. 2020, 21:15

clairement pas. faire une seule requete sql par rapport à une requete puis une requete dans un while, cela n'a rien à voir en terme de charge du serveur.
d'accord merci
et pas possible de garder la colonne json avec les id et faire du JOIN pour aller chercher les noms + prénoms associé en requête SQL?