2010-09-19 3 views
0

Je crée un forum simple avec php/mysql. Les utilisateurs entrent leur nom et un message, javascript affiche le message immédiatement, et php/mysql le stocke dans une base de données. Lorsque la page se charge, il doit afficher tous les messages dans la base de données dans une liste formatée.Mysql/PHP ne pas afficher toutes les lignes

Cependant, il semble que mon php n'affiche que certains messages arbitrairement. Ils sont dans l'ordre chronologique approprié mais certains sont manquants et il n'en affiche que 4. En regardant manuellement les entrées dans la base de données, je peux voir que les messages postés sont en effet stockés dans leur table. Ils ne sont tout simplement pas affichés. wierd.

Heres le code HTML/PHP qui affiche les messages:

<?php 
    $records = getMessages(); //see getMessages() function below 
    $names = $records["names"]; 
    $messages = $records["messages"]; 
    $dates = $records["dates"]; 

    for($i = count($records); $i > 0; $i--){ ?> 
    <div class="message"> 
     <p class="message_txt"><?php echo $messages[$i];?></p> 
     <div> 
      <div class="message_name"> 
       <?php echo $names[$i];?> 
      </div> 
      <div class="message_date"> 
       <small> 
      <?php 
       echo "Posted on "; 
       echo date("F j, Y",strtotime($dates[$i])); 
     ?> 
     </small> 
     </div> 
    </div> 
</div> 
<?php } ?> 

Heres la fonction de haut getMessages():

function getMessages(){ 
    $conn = connect("wedding"); 
    $ids; 
    $names; 
    $messages; 
    $dates; 
    $get_messages_query = "SELECT id, name, message, date 
       FROM messages;"; 
    $get_messages_result = mysql_query($get_messages_query,$conn) or die(mysql_error()); 
    $i = 0; 
    while($row = mysql_fetch_array($get_messages_result)){ 
    $ids[$i] = $row["id"]; 
    $names[$i] = $row["name"]; 
    $messages[$i] = $row["message"]; 
    $dates[$i] = $row["date"]; 
    $i++; 
    } 

    $entries = array("ids" => $ids, 
        "names" => $names, 
        "messages" => $messages, 
        "dates" => $dates 
       ); 
    return $entries; 
} 

Et voici la sortie:

<div class="message"> 
    <p class="message_txt">Yo this is a message</p> 
    <div> 
    <div class="message_name">Bob</div> 
    <div class="message_date"><small>Posted on September 18, 2010</small></div> 
    </div>     
</div> 
<div class="message"> 
    <p class="message_txt">This is a message another</p> 
    <div> 
    <div class="message_name">Andrew</div> 
    <div class="message_date"><small>Posted on September 6, 2010</small></div> 
    </div> 
</div> 
<div class="message"> 
    <p class="message_txt">And another message</p> 
    <div> 
    <div class="message_name">Andrew</div> 
    <div class="message_date"><small>Posted on September 6, 2010</small></div> 
    </div> 
</div> 
<div class="message"> 
    <p class="message_txt">This is a message</p> 
    <div> 
    <div class="message_name">Andrew</div> 
    <div class="message_date"><small>Posted on August 27, 2010</small></div> 
    </div> 
</div> 

Je ne suis pas sûr de ce qui se passe ici. Cela semble assez simple. Je suppose que ce pourrait être une petite erreur idiote que je ne peux pas voir ... mais je ne peux pas le voir.

Toute aide serait appréciée.

Répondre

0

La raison est que vous êtes seulement en boucle à 4 explicitement:

for($i = count($records); 

Records est la variable qui contient les 4 tableaux (ids, noms, messages, dates). Chaque tableau contient probablement le nombre correct de messages, mais vous délimitez votre boucle sur records.

Autres considérations pour la prochaine fois:

  • modifier votre instruction SQL pour commander ces documents de façon explicite. Vous pouvez les voir MAINTENANT dans l'ordre que vous attendez, mais ce n'est garanti par aucun SGBDR si vous n'indiquez pas explicitement la commande que vous souhaitez. Peut-être: SELECT ... FROM... ORDER BY date DESC? La boucle for commence à la partie inférieure. En collaboration avec un explicite ORDER BY, pensez à utiliser

    for($i = 0; i<=count($records); $i++) 
    
  • echo le nombre de chaque tableau (noms, messages, dates). Est-ce que jive avec ce que vous attendiez de votre requête DB?

+0

Brillant. Cela a fait l'affaire. Merci de prendre le temps. –

0

Je suggère d'ajouter la fonction 2 fonctions var_dump() (ou fb() si vous utilisez FirePHP) dans getMessages() pour voir ce qui se passe.

function getMessages(){ 
    $conn = connect("wedding"); 
    $ids; 
    $names; 
    $messages; 
    $dates; 
    $get_messages_query = "SELECT id, name, message, date 
       FROM messages;"; 
    $get_messages_result = mysql_query($get_messages_query,$conn) or die(mysql_error()); 
    $i = 0; 
    while($row = mysql_fetch_array($get_messages_result)){ 
    $ids[$i] = $row["id"]; 
    $names[$i] = $row["name"]; 
    $messages[$i] = $row["message"]; 
    $dates[$i] = $row["date"]; 
    $i++;var_dump($i); 
    } 

    $entries = array("ids" => $ids, 
        "names" => $names, 
        "messages" => $messages, 
        "dates" => $dates 
       ); var_dump($entries); 
    return $entries; 
} 
Questions connexes