Intereting Posts
Создание матрицы совпадения из базы данных mysql в MYSQL, PHP или R Как глубоко ссылаться на приложение Facebook (ни одна страница) Symfony2: «Запомнить меня» пытается аутентифицироваться по имени пользователя по электронной почте Наконец, альтернатива предложения для тайм-аута скрипта Какая лучшая передача функций – переменные или массивы / объекты? Максимальный предел файла PHP Шифровать данные с помощью открытого ключа в c # и расшифровать данные с помощью закрытого ключа в php Динамический модуль по умолчанию в Zend Framework Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом, PHP fsockopen ничего не возвращает Как сделать резервную копию базы данных в php? Стиль не отображается при вызове с использованием идентификатора страницы в wordpress PHP – расширенный __конструкция Строка прерывания Regex на основе и / или в концепции поиска PHP: Как установить расширение мыла?

Система комментариев PHP с ответом 1 уровня. Проблема с отображением запроса

Я пытаюсь создать систему комментариев PHP, похожую на стену facebooks, но с одним уровнем ответа для каждого сообщения.

Я бы хотел этот формат:

Post 1 Response 1 Response 2 Response 3 Add comment box ---------- Post 2 Response 1 Response 2 Response 3 Add comment box 

Однако мой код на данный момент производит этот результат:

 Post 1 Response 1 Add comment box Post 1 Response 2 Add comment box ---------------- Post 2 Response 1 Add comment box --------------- Post 2 Response 1 Add comment box --------------- 

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

Структура таблицы

сообщений

  • p_id = номер этого сообщения
  • user_id = пользователь, который они user_id
  • poster_user_id = человек, делающий сообщение
  • post

Комментарии

  • comment_id = номер этого комментария
  • post_id = номер комментария, связанного с
  • commenter_user_id = человек, который делает этот комментарий
  • comment

Код

 $query = "SELECT posts.p_id, comments.post_id, posts.poster_id, posts.user_id, message, `comments.commenter_user_id, comments.comment` FROM posts, comments WHERE posts.p_id = comments.post_id"; $query_run = mysql_query($query) or die(mysql_error()); while ($query_row = mysql_fetch_assoc($query_run)) { $pid = $query_row['p_id']; $post_id = $query_row['post_id']; $poster_id = $query_row['poster_id']; $user_id= $query_row['user_id']; $message = $query_row['message']; $commenter_user_id = $query_row['commenter_user_id']; $comment = $query_row['comment']; echo " <div id=\"post\"> Post $pid $post_id Poster: $poster_id Mentions: $user_id <br><br> $message <br><br> <ul class=\"comment\"> $commenter_user_id <li> $comment </li> </ul> <form name=\"message\" method=\"post\" action=\"sendmessage.php\"> <textarea name=\"message\"></textarea> <br> <input type=\"submit\" value=\"Send\" /></form> </div> <br>"; } 

Какие-либо советы о том, как я мог бы получить желаемый результат? Я знаю, что, вероятно, это легко исправить, просто изменив мою логику, но я только начал учиться. Ваша помощь в этом будет принята с благодарностью!

ОБНОВИТЬ

Спасибо всем за помощь. Я включил аспекты ваших примеров кода, и он отлично работает.

еще один вопрос:

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

 INSERT INTO `comments`SET `post_id` = $post_id 'commenter_user_id = $_SESSION['commenter_user_id'] " (I was thinking sessions?) 

Я думал о захвате данных, передавая переменные через URL-адрес на страницу сценария:

  while ($query_row = mysql_fetch_assoc($query_run)){ // more variable definitions $post_id = $query_row['post_id'] echo " <form method=\"post\" action=\"add_comment.php?post_id='.$post_id.'> <textarea name=\"comment\"></textarea> <br> <input type=\"submit\" value=\"Send\" /></form> " 

Но я попытался передать переменную на другую страницу так: action = \ "add_comment.php? Post_id = '. $ Post_id.' но я получаю неопределенный индекс: переменная, когда я пытаюсь это сделать.

Любые мысли о том, как я могу это сделать?

Проблема с вашим кодом заключается в том, что для каждого комментария, который вы читаете из базы данных, вы также получаете сообщение из соединения. Есть два возможных решения, о которых я могу сейчас подумать:

Первый вариант – сохранить ваш запрос таким, какой он есть, но всякий раз, когда вы печатаете строку, вы смотрите на сообщение, которое вы печатаете. Вы сохранили бы этот последний отпечатанный идентификатор сообщения, и если текущий идентификатор совпадает, вы просто не печатаете сообщение, а только комментарий. Для этого, очевидно, потребуется разделить разметку для сообщения и комментария (что в любом случае является хорошей идеей). В основном это было бы так:

 $lastPost = -1; while ($query_row = mysql_fetch_assoc($query_run)) { // ... if ($pid != $lastPost) { echo "<code for the post>"; $lastPost = $pid; } echo "<code for the comment>"; } 

Другая идея заключалась бы в том, чтобы разделить ваш запрос, загрузив все сообщения, а затем для каждого опубликованного вами сообщения загрузить комментарии и распечатать их все. Это, очевидно, требует n+1 SQL-запросов для n сообщений, но это уменьшает объем данных, поступающих из вашей базы данных (поскольку у вас больше нет дубликатов сообщения, следующего за каждым комментарием). Если у вас есть страница для отображения только одного сообщения, это позволит вам снова использовать код. Обычно это выглядит так:

 $query_run = // query only for posts, ignoring comments while ($query_row = mysql_fetch_assoc($query_run)) { // ... echo "<code for the post>"; $comment_query = // query only for comments with post_id = $pid while ($comment_row = mysql_fetch_assoc($comment_query)) { // .. echo "<code for the comment>"; } } 

Обновить

У вас есть несколько способов включить информацию в форму, которая затем передается на целевую страницу. Можно было бы включить их как параметры GET в URL-адрес, как вы сами пробовали. Другой будет включать скрытые элементы ввода, которые просто удерживают ваши статические данные. Независимо от того, что вы используете, вам нужно будет получить эти значения из $_GET или $_POST на целевой странице. После некоторой проверки ввода (которую вы должны сделать) вы можете использовать эти значения для вставки комментария так же, как обычно, с одной формой, за исключением того, что идентификатор сообщения также поступает из переменной запроса. Если вы не знаете, как правильно обращаться с вводом пользователя и создать комментарий, я предлагаю вам начать немного медленнее и просто создать одну форму комментариев, чтобы узнать, как это работает.

Ошибка «неопределенного индекса» означает, что вы пытаетесь получить доступ к индексу в массиве (возможно, $query_row ), которого не существует. Вы можете получить доступ только к тем значениям, которые вы действительно запросили в своем sql-запросе. Поэтому проверьте, действительно ли переменная, которую вы пытаетесь получить, в запросе.

Это то, что я ожидал бы, потому что ваш SQL-запрос является SELECT из двух таблиц, которые являются внутренним соединением, поэтому вы получите дублирование строк.

Попробуйте выполнить запрос непосредственно в окне запроса mysql чтобы узнать, что выйдет.

Я бы рекомендовал хранить значение текущего сообщения и выводить комментарии только тогда, когда сообщение не изменилось; что-то вроде следующего:

Также вы не записываете идентификатор сообщения в форме (либо в виде скрытой переменной, либо в URL-адрес), поэтому я добавил скрытую переменную, поскольку не подозреваю, что post_id станет вашей следующей ошибкой.

  $last_post_id = null; while ($query_row = mysql_fetch_assoc($query_run)){ $post_id = $query_row['post_id']; if ($last_post_id == $post_id) { ?> <ul class=\"comment\"> $commenter_user_id <li> $comment </li> </ul> <?php } else { if ($last_post_id !== null) { ?> <form name=\"message\" method=\"post\" action=\"sendmessage.php\"> <textarea name=\"message\"></textarea> <br> <input type=\"hidden\" name="\post_id\" value=\"$last_post_id\" /> </form> <input type=\"submit\" value=\"Send\" /></form> <?php $last_post_id = $post_id; } ?> <div id=\"post\"> Post $pid $post_id Poster: $poster_id Mentions: $user_id <br><br> $message <br><br> <ul class=\"comment\"> $commenter_user_id <li> $comment </li> </ul> </div> <?php } ?> 

Обновленный ответ

в sendmessage.php (используя мою форму выше с типом ввода = скрытый), см. ниже. Вы правы, что вам нужно будет использовать сеансы для получения текущего идентификатора пользователя для целей публикации.

Я бы рекомендовал использовать метод POST для отправки любой формы, которая приводит к изменению данных.

 <?php if (isset($_POST['post_id'])) { $post_id = mysql_real_escape_string($_POST['post_id']); $user_id = $_SESSION['current_user_id']; $sql = "INSERT INTO `comments`SET `post_id` = $post_id 'commenter_user_id = $user_id"; if (!mysql_query($sql)) echo "MySQL error during insert ". mysql_error(); } else { echo "Invalid form posting"; } 

Как насчет рекурсии? Соответствует ли это вашим потребностям? Если да, то все, что вам нужно, это идентификатор родительского сообщения для каждого сообщения (или NULL, если это не ответ). Затем вы загружаете все сообщения и вызываете эту функцию только с помощью сообщений NULL, также предоставляя весь массив сообщений.