2014-03-07 2 views
0

Я разрабатываю социальную сеть, и ключевой функцией является возможность публикации в профилях других пользователей. Однако мой текущий код будет показывать только одно сообщение. Кроме того, это, кажется, первое сообщение, которое показано. Я проверил это, создав новые учетные записи и написание тестового сообщения. Код действительно показывает этот первый пост, но если я попробую его снова, будет видно только первое сообщение. Код выглядит следующим образом: код для отправки сообщения в базу данных:Почему мой код показывает только одно сообщение?

$person = "profile.php?id={$id}"; 
$post = $_POST['post']; 
if($post != "") 
{ 
    $data_added = date("Y-m-d"); 
    $added_by = $session_username; 
    $user_posted_to = $id; 
    $post = preg_replace("#[^0-9a-z]#i", "", $post); 
    $sqlCommand = "INSERT INTO posts VALUES ('', 
              '$post', 
              '$data_added', 
              '$added_by', 
              '$user_posted_to')"; 
    $commandQuery = mysql_query($sqlCommand) or die ("Couldn't send post"); 
} 
else 
{ 
    echo "You have to fill in the post form..."; 
} 

код для извлечения его (и отобразить его):

$getPosts = mysql_query("SELECT * 
          FROM posts 
          WHERE user_posted_to='$id' 
         ORDER BY id DESC LIMIT 15") or die("Couldn't find any posts"); 
while($row = mysql_fetch_array($getPosts)) 
{ 
    $id = $row['id']; 
    $body = $row['body']; 
    $date_added = $row['date_added']; 
    $added_by = $row['added_by']; 
    $user_posted_to = $row['user_posted_to']; 
    $querya = mysql_query("SELECT * 
          FROM members 
          WHERE username='$added_by' LIMIT 1"); 
    while($row = mysql_fetch_array($querya)) 
    { 
     $user_added = $row['id'];       
    } 
    $user_added = "profile.php?id={$user_added}"; 
} 

echo " 
    <div> 
    <h3><a href='$user_added'>$added_by</a> - $date_added </h3> 
    <p> $body</p> 
    </div><br /> 
    "; 

Если кому-то нужен еще немного кода, как мое подключение к базе данных, просто комментарий.

+0

Использование 'в то время как()' цикл, чтобы принести одну строку из '1' LIMIT запроса является довольно большой симптом грузов культового программирования. Вы действительно должны переписать свои два вложенных запроса в один запрос JOIN. Кроме того, вы уязвимы для SQL-инъекций ... –

+0

Вы можете избежать двойного запроса с помощью 'SELECT p.id, p.body, p.date_added, p.added_by, p.user_posted_to, m.id FROM posts p JOIN members m ON p.added_by = m.username WHERE p.user_posted_to = '$ id' ORDER BY p.id DESC LIMIT 15'. Также у вас серьезные проблемы с SQL Injection **. – Prix

+0

....... Удачи вам в этой социальной сети! –

ответ

1

В своем цикле вы заполняете некоторые переменные, но не используете их. Вы используете echo только за пределами цикла, поэтому только один раз, и таким образом вы печатаете только значения последнего значения цикла while.

Попробуйте

$getPosts = mysql_query("SELECT * FROM posts WHERE user_posted_to='$id' ORDER BY id DESC LIMIT 15") or die("Couldn't find any posts"); 
       while($row = mysql_fetch_array($getPosts)){ 
        $id = $row['id']; 
        $body = $row['body']; 
        $date_added = $row['date_added']; 
        $added_by = $row['added_by']; 
        $user_posted_to = $row['user_posted_to']; 

        $querya = mysql_query("SELECT * FROM members WHERE username='$added_by' LIMIT 1"); 
        while($row = mysql_fetch_array($querya)){ 
         $user_added = $row['id'];       
         } 
         $user_added = "profile.php?id={$user_added}"; 
        echo " 
        <div><h3><a href='$user_added'>$added_by</a> - $date_added </h3><p> $body</p></div><br />"; 
               } 
+0

Кстати, я согласен с комментарием, что вам нужно какое-то серьезное улучшение. Функции mysql устарели, и вы склонны к инъекции. Подготовленные заявления в PDO могли бы решить обе проблемы. – dirluca

+1

Имеет смысл, если бы вы сказали, что он использует 'echo' для печати сообщений за пределами цикла, поэтому он только печатает его один раз. – Prix

+0

@Prix спасибо за комментарий, я отредактировал ответ, чтобы сделать его понятным – dirluca