Как получить и отобразить массив с объектами из php-ячейки, используя цикл? - PullRequest
1 голос
/ 30 июня 2011

В проекте Flex у меня есть массив с объектами в нем.Я хочу сохранить этот массив в ячейке таблицы MySQL вместе с другой базовой информацией, такой как заголовок и идентификатор.

РЕДАКТИРОВАТЬ: просто уточняю, поскольку я, кажется, получаю ответы, объясняющие, как отобразить все строки ... Я пытаюсь отобразить содержимое массива, который был сериализован и помещен в одну ячейку.В этом массиве есть объекты.

Итак, у меня есть этот код для сериализации массива и вставки его вместе с другой информацией в мою БД:

function submitLogDbObj($array,$id,$title)
{
$title=mysql_real_escape_string($title);

return mysql_query("INSERT INTO logs (text,id,title) VALUES ('".serialize($array)."','$id','$title')");

}

Затем для тестая пытаюсь сделать цикл, который будет отображать журнал таким образом, что выглядит как разговор ...

объект в моем массиве будет выглядеть примерно так:

[1] 
  icon = ""
  msg = "this is a test"
  name = "Them: "
  systemMsg = 0
[2]
  icon = ""
  msg = "yep it sure is"
  name = "You: "
  systemMsg = 0

Таквот что у меня так далеко, но не работает!Как я могу сделать цикл, который будет принимать этот массив из БД, десериализовать его и затем выводить конво в виде, похожем на журнал чата?

Спасибо!

<?php

include_once("dbinfo.php");

$id= $_GET['id'];

$result = mysql_query("SELECT text,title FROM logs WHERE id='$id'")
or die(mysql_error()); 

$row = mysql_fetch_array($result);

if($result)
{

$log = unserialize($row['text']);

echo 'starting loop!';

echo "<ul>";

/* im not sure how to represent the length of an array in php thats why i just have $log.length */

for ($i = 1; $i <=$log.length; $i++)
{
    echo "<div id='logbox'>";
    echo "<li>";
    $name=$log[$i]['name'];
    $msg=$log[$i]['msg'];
    echo "$name - $msg";
    echo "</li>";
    echo "</div>";
    echo "<br />";
}
echo "</ul>";


echo 'finished loop!';

} 
else 
{
echo "Looks like this chat log has been deleted. Sorry!";
}

Ответы [ 3 ]

1 голос
/ 30 июня 2011

Ну, есть несколько вещей, которые могли бы быть лучше:

  1. Длина массива определяется через count( $array ) или sizeof( $array )
  2. $ value . $ otherValue означает объединение этих двух значений.Поскольку length не определено в этом контексте, $ log.length означает «$ log.length».
  3. Лучший способ перебрать массив - это foreach( $set as $val) или foreach( $set as $key => $val )
  4. Предпочтительным методом итерации результата SQL является цикл while: while($row = mysql_fetch_array($result)){ или do... while (см. Ниже).Если вы конкретно и осознанно не захотите только одного, тогда было бы лучше использовать это.А если вам нужен только один, то укажите в запросе ограничение.
  5. Сериализированные массивы в базах данных имеют избыточный вид.Вы уверены, что это именно то, что вам нужно?
  6. Ваш сериализованный массив, прежде чем он будет вставлен, также должен быть запущен через mysql_real_escape_string.
  7. br действительно не требуется, есливы окружаете что-то своим собственным div.
  8. Сделайте отступ правильно или за вами придет котенок смерти .

Улучшенный код:

$row = mysql_fetch_array($result);

// row could be empty if there were no results
if($row) 
{
    // we've already grabbed the first value, so we need 
    // to invert while into do... while.
    do
    {
        $log = unserialize($row['text']);

        echo "<ul>";

        foreach( $log as $line )
        {
            // Are you sure this should be outside of the li?
            echo "<div id='logbox'>"; 
            echo "<li>";
            $name=$line['name'];
            $msg=$line['msg'];
            echo "$name - $msg";
            echo "</li>";
            echo "</div>";
        }
        echo "</ul>";
    }
    while( $row = mysql_fetch_array($result) );

    echo 'finished loop!';

} 
else 
{
    echo "Looks like this chat log has been deleted. Sorry!";
}
0 голосов
/ 30 июня 2011
$result = mysql_query("SELECT text,title FROM logs WHERE id='$id'")
echo "<ul>";
while ($row = mysql_fetch_assoc($results)) {
 $name = $row['name'];
 $msg = $row['msg'];

 //display data how ever you want 

}
echo "</ul>"; 
0 голосов
/ 30 июня 2011

Во-первых, привычка правильно делать отступы в коде , это избавит вас от многих разочарований при поиске ошибок.

Вам не нужно знать длину массива, вы можете просто использовать цикл while: (кодирование с хипа здесь, поэтому дайте мне знать, если вы получите ошибки)

$result = mysql_query("......") or die("Query failed");

//Keep going while $row isn't FALSE 
//mysql_fetch_array returns false when there are no more rows
while($row = mysql_fetch_array($result)){
    //You can close PHP tags here and insert the 
    //variables in the HTML, it often looks neater
    //and your editor can colour code HTML, helping
    //you to find problems
    ?>
    <div>
        <li><?php echo $row['name'] ?></li>
        <li><?php echo $row['msg'] ?></li>
    </div>
    <?php
}

См. "Fetch array while loop" из этого учебного пособия для получения дополнительных примеров.

...