не понял --- Добавлено --- вернее, я не понял, чего ты не понимаешь. мне казалось ты понимаешь. давай заново всё распиши в одном сообщении, и задай развёрнутый вопрос.
@igordata 1. Я вытягиваю все диалоги которые есть между пользователям. 2. Хочу по клику или по ссылке диалога открыть список сообщений между 2-мя пользователями 3. ну и потом, уже буду дальше действовать с сообщениями, прочтения сообщений ответ на них 1. Пункт вроде получился, вытащить все диалоги 2. На втором пункте я завис
@igordata Я не пойму как будет правильно строится логика. 1. сперва надо показать все диалоги 2. потом при клике на один из них открывалась переписка между этими пользователями 3. у меня проблемы с GET end POST ссылками. 4. создавать ссылку могу, но не пойму когда перехожу по ней, то ошибки выкидывает, что приходится все делать на GET. 5. либо создавать именно кнопку типа с формой.(
Таких ссылок не бывает. Их можно только эмулировать на javascript. Ты не усваиваешь, что тебе пишут. Браузер посылает post-запрос в двух случаях: 1. Отправлена форма методом post 2. Из JavaScript специально попросили сделать именно post-запрос (т.е. AJAX) Пока не знаешь javascript, научись на css заставлять кнопку выглядеть как ссылку, и пиши где надо формы А так есть очень простой приём на javascript
пост-ссылок не бывает --- Добавлено --- этого достаточно, чтобы показать диалог плюс я тебе рекомендую делать сразу нормальные урлы ты на фреймворке? если нет - попробуй пинпай =)
@igordata Да знаю что POST ссылок нету, хотя можно сказать не знал. @mkramer css знаю до придела нужного, кнопки ссылки превратить в кнопки умею. @igordata @mkramer может объясните как с js отправлять POST, спасибо. Я начал с нуля писать опять переписку, + диалоги.
POST не нужен, когда ты выбираешь диалог. POST нужен, когда что-то где-то меняется. Обычно ссылки, которые через js переадресуются на post, используются для удаления, к примеру, чтоб защититься от csrf-атак (тут в соседней теме). Если ты о ссылках с имитацией post, то из js создаётся невидимая форма с нужным action и сабмитится.
Мужики давайте покажу что я делаю, а вы мне объясните что я не так делаю? 1. делом я перехожу в диалоги при нажатии на ссылку PHP: <a href="?go=all_d">диалоги</a> 2. делом открывается скрипт который выводит список диалогов. PHP: <?php /* Appointment: Все диалоги File: im.php */ include($_SERVER['DOCUMENT_ROOT'].'/system/inc/inc.php'); error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки if(!defined('BEZ_KEY')) die('Hacking attempt!'); $user_id = $_SESSION['user_id']; //################### Вывод всех диалогов ###################// $vivod_dailog = $pdo->prepare(" SELECT SQL_CALC_FOUND_ROWS `tb1`.`msg_num`, `im_user_id`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `im` tb1, `users` tb2 WHERE `tb1`.`iuser_id` = ? AND `tb1`.`im_user_id` = `tb2`.`user_id` ORDER by `idate` DESC LIMIT 0, 50"); $vivod_dailog->execute([$user_id]); $dialog_result = $vivod_dailog->fetchall(); if($dialog_result){ echo 'Список всех диалогов<br>'; foreach($dialog_result as $row){ echo 'ID: '.$row['im_user_id'].' Логин: '.$row['user_login'].'<br>'; if($row['user_photo']) echo '<img src="/uploads/users/full_img/'.$row['user_photo'].'" height="60"><br>'; else echo '<img src="/uploads/users/full_img/no_ava/no_ava.png" height="50px"><br>'; if($row['msg_num']) echo 'Количество смс'.'<div class="im_new fl_l" id="msg_num'.$row['im_user_id'].'">'.$row['msg_num'].'</div>'; else echo $row['msg_num'], ''; echo'<a href="?go=all_m&act='.$row['im_user_id'].'" onClick="">посмотреть диалог</a>'; ### <<<<<===== вот эта ссылка echo'<a href="?go=f_del_dialog&for_dlg='.$row['im_user_id'].'" onClick="">удалить диалог</a><br><hr>'; } }else{ echo 'Диалогов нет<br>'; } ?> 3. делом я создаю ссылку в этом файле что описан выше, что бы при клике на ссылку открыть весь диалог между пользователями PHP: <?php /* Appointment: Все сообщения File: im.php */ include($_SERVER['DOCUMENT_ROOT'].'/system/inc/inc.php'); error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки //Ключ защиты if(!defined('BEZ_KEY')) die('И че ты тут забыл??'); //Создаем гет параметр для работы с данными $act = isset($_GET['act']) ? $_GET['act'] : false; $user_id = $_SESSION['user_id'];//Сессия пользователя ################### Вывод всех полученных сообщений ################### $page = 1; $gcount = 20; $limit_page = ($page-1)*$gcount; //Запрос в БД на вывод сообщений $z_inbox = $pdo->prepare(' SELECT SQL_CALC_FOUND_ROWS `tb1`.`id`, `for_user_id`, `from_user_id`, `text`, `pm_read`, `date`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `messages` tb1, `users` tb2 WHERE `tb1`.`for_user_id` = ? AND `tb1`.`from_user_id` = `tb2`.`user_id` ORDER by `date` DESC LIMIT ?'); $z_inbox->execute([$user_id, $gcount]); $res_inbox = $z_inbox->fetchall(); //Если есть ответ из БД, то считаем кол-вот ответов if($res_inbox){ //выводим количество сообщений $msg_count = $pdo->prepare(' SELECT COUNT(id) AS `cnt` FROM `messages` `tb1`, `users` `tb2` WHERE `tb1`.`for_user_id` = ? AND `tb1`.`from_user_id` = `tb2`.`user_id`'); $msg_count->execute([$user_id]); $res_msg_count = $msg_count->fetch(); //header сообщений полученные|отправленные|просмотр сообщений include'./templates/default/messages/head.php'; /*if($user_id['user_msg_type'] == 0) echo $user_id['user_msg_type'].'Показать в виде диалогов'; else echo $user_id['user_msg_type'], 'Показать в виде сообщений';*/ #############Выводим количесвто сообщений найденных для пользователя######## if($res_inbox){ echo 'Вы получили <span id="all_msg_num">'.$res_msg_count['cnt'].'</span>msg<br>'; }else{ echo'Нет полученных сообщений<br>'; } //Если есть сообщения то продолжаем, если нет, то выводи информацию if($res_inbox){ // include'./templates/default/messages/message.php'; foreach ($res_inbox AS $mess) { //Строка фото if($mess['user_photo']){ echo '<img src="/uploads/users/full_img/'.$mess['user_photo'].'" height="50"><br>'; }else{ echo '<img src="/uploads/users/full_img/no_ava/no_ava.png'.$mess['user_photo'] .'" height="50px"><br>'; } //Строка сообщения echo ' <div>'.stripslashes(strip_tags($mess['text'])).'('.$mess['pm_read'].')'.'</div>'; //Строка от кого echo 'От кого ID: '. $mess['from_user_id'].'<br>'; //Строка номер сообщения echo '№: '. $mess['id'].'<br>'; //Строка дата echo 'Дата: '. $mess['date'].'<br>'; //Строка ответить сообщение echo '<br><a href="?go=msg&mid='.$mess['id'].'&act=review" onClick="Page.Go(this.href); return false">Ответить</a>'; //Строка удалить сообщение echo '<a href="?go=f_delet&mid='.$mess['id'].'" onClick="">Удалить</a><br>'; // var_dump($mess); } if($res_msg_count['cnt'] > $gcount) echo $gcount, $res_msg_count['cnt'], '<a href="/index.php?go=msg&page=">Сделующая</a>'; }else{ echo 'no_msg1'; } }else{ echo 'Пока сообщений нет, у вас.'; } // } ?> 4. при нажатии на ссылку посмотреть диалог у меня открывается полный список смс от разных пользователей, а мне нужно чтобы: открывался список смс между двумя пользователями. 5. как быть в такой ситуации, если таблицы нужны могу показать, ах да связь что в таблице messages(сообщения) что в таблице im(диалоги) связь стоит многие к одному. Проконсультируйте меня по коду) спасибо, да признаюсь у меня с логикой проблема(
@mahmuzar Вот обработчик просмотр сообщений, то есть если юзер нажимает на сообщение или на кнопку ответить то смс считается прочитанным: PHP: //################### Просмотр сообщения ###################// case "review": $mid = intval($_GET['mid']); // $mid = isset($_GET['mid']) ? $_GET['mid'] : false; if($mid){ //SQL Запрос за вывод сообщения $review = $pdo->prepare(' SELECT `tb1`.`id`, `from_user_id`, `history_user_id`, `text`, `pm_read`, `date`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `messages` `tb1`, `users` `tb2` WHERE `tb1`.`id` = ? AND `tb1`.`from_user_id` = `tb2`.`user_id` AND `tb1`.`for_user_id` = ?'); $review->execute([$mid, $user_id]); $res_review = $review->fetch(); //header сообщений include'./templates/default/messages/head.php'; echo $mid.'<br>'; if($res_review){ include'./templates/default/messages/review.php'; if($res_review['user_photo']){ echo '<img src="/uploads/users/full_img/'.$res_review['user_photo'].'" height="50"><br>'; }else{ echo '<img src="/uploads/users/full_img/no_ava/no_ava.png'.$res_review['user_photo'] .'" height="50px"><br><br>'; } echo 'От: '.$res_review['user_login'].'<br>'; echo 'Сообщение: '.stripslashes($res_review['text']).'<br>'; echo 'ID: '.$res_review['from_user_id'].'<br>'; echo 'Date: '.$res_review['date'].'<br>'; echo '№смс: '.$mid.'<br>'; //Если статус сообщения не прочитано, то обновляем его if($res_review['pm_read'] == 'no'){ $up1 = $pdo->prepare(' UPDATE `messages` SET `pm_read` = "yes" WHERE `id` = :id'); $up1->execute(['id' => $mid]); $up2 = $pdo->prepare(' UPDATE `messages` SET `pm_read` = "yes" WHERE `id` = :id'); $up2->execute(['id' => $mid+1]); $up3 = $pdo->prepare(' UPDATE `users` SET `user_pm_num` = `user_pm_num`-1 WHERE user_id = :user_id'); $up3->execute(['user_id' => $user_id]); $up4 = $pdo->prepare(' UPDATE `im` SET `msg_num` = `msg_num`-1 WHERE `iuser_id` = :iuser_id AND `im_user_id` = :im_user_id'); $up4->execute(['iuser_id' => $user_id, 'im_user_id' => $res_review['from_user_id']]); // echo 'сообщение прочитано'; }else{ echo 'сообщение прочитано.'; } }else{ echo 'Сообщения такого не существует, или оно предназначенно не вам!'; } }else{//Конец $mid echo 'еще какая та ошибка'; } break; Посмотрите и объясните мою ошибку, спасибо.
@_ne_scaju_, что у тебя хранится в tb1 --- Добавлено --- понял, не внимательно взглянул на твой запрос. В общем, зачем тебе псевдонимы для таблиц вроде бы у тебя нету там конфликтов. --- Добавлено --- @_ne_scaju_, раз используешь две таблицы, и начал указывать какая колонка к какой относится придерживайся этого подхода всегда. А то одно пишешь так, другое так, и не понятно что откуда. Код (Text): SELECT `tb1`.`id`, `from_user_id`, `history_user_id`, `text`, `pm_read`, `date`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `messages` `tb1`, `users` `tb2` WHERE `tb1`.`from_user_id` = `tb2`.`user_id` AND `tb1`.`for_user_id` = ? Попробуй такой звпрос.
@igordata Да только по юзеру вытаскивать могу сообщения, а что должен быть, если я создам номер для диалога то это будет выглядеть как то так: 1 from for msg 2 for from msg и какой тут может собственный номер?
@mahmuzar Можете мне коротко рассказать структуру если не сложно, как построена на форумах система сообщений, например как на этом... И еще вопрос когда я просто хочу вывести данные лучше использовать в запросе prepare или же query в PDO всегда интересовал этот вопрос, ваша точка зрения...
prepare помогает экранировать данные, чтобы запрос не изменили, в query их так же можно экранировать через quote метод из PDO
@denis01 Значит я так понял лучше всегда использовать метод prepare, да? @igordata Да я знаю что свой номер это id диалога, просто если сообщение идут многие компании многим какой там может быть номер, не будет же для первого диалога такой записи: 1 from for msg 1 for from msg Запись же идёт по порядку: 1 from for msg 2 for from msg И т.д.
В доке это все достаточно подробно расписано, как все работает. https://php.ru/manual/pdo.prepared-statements.html почитай. --- Добавлено --- Самому не приходилось реализовать. А так можешь скачать какой-нибудь движок форму и глянуть, какая у них структура базы. Как я у себя делал скидывал тебе структуру.
@mahmuzar Я читал) Не помню когда ты мне скидывал структуру, скачал пару движков посмотрю что в них и как добавляется сообщения в бд. Буду изучать. К статье по видео и по примерам создал класс для БД, и почти уточню почти нет разницы в запросах) Буду за ноутом покажу класс, который сотворил.
Всем привет, вот что получается у меня, вытягиваю все диалоги которые пришли пользователю так: PHP: default: //################### Вывод всех диалогов ###################// //Вывод диалогов $vivod_dailog = $pdo->prepare(" SELECT SQL_CALC_FOUND_ROWS `tb1`.`dialog_id`, `from_dialog`, `for_dialog`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `dialogs` tb1, `users` tb2 WHERE `tb1`.`for_dialog` = ? AND `tb1`.`from_dialog` = `tb2`.`user_id` OR `tb1`.`from_dialog` = ? AND `tb1`.`for_dialog` = `tb2`.`user_id` ORDER by `idate` DESC LIMIT 0, 50"); $vivod_dailog->execute([$user_id, $user_id]); $dialog_result1 = $vivod_dailog->fetchall(); if($dialog_result1){ //подключаем форму диалогов // include'./templates/default/im/dialog.php'; echo 'ALL dialogs<br>'; foreach($dialog_result1 as $row){ echo '<hr>'; echo 'ID: '.$row['for_dialog'].' Логин: '.$row['user_login'].'<br>'; if($row['user_photo']) echo '<img src="/uploads/users/full_img/'.$row['user_photo'].'" height="60"><br>'; else echo '<img src="/uploads/users/full_img/no_ava/no_ava.png" height="50px"><br>'; echo'<a href="?go=msg&act=inbox&for_id='.$row['from_dialog'].'" onClick="">просмотреть</a>'; echo'<a href="?go=f_del_dialog&for_dlg='.$row['for_dialog'].'" onClick="">удалить диалог</a><br>'; echo '<hr>'; } }else{ echo 'no dialog'; } //header сообщений // include'./templates/default/im/head.php'; break; а теперь хочу при нажатии на ссылку посмотреть вытащить список сообщений между этими пользователями пробую сделать так: PHP: ################### Вывод всех полученных сообщений ################### case 'inbox': $inbox = intval($_GET['for_id']); if(isset($_GET['info']) == 1 ) echo'<script type="text/javascript">setTimeout(\'$(".err_yellow").fadeOut()\', 1500);</script>Ваше сообщение успешно отправлено.'; //Запрос в БД на вывод сообщений $z_inbox = $pdo->prepare(' SELECT SQL_CALC_FOUND_ROWS `tb1`.`message_id`, `for_user_id`, `from_user_id`, `text`, `pm_read`, `date`, `tb2`.`user_id`, `user_login`, `user_photo` FROM `messages` tb1, `users` tb2 WHERE `tb1`.`for_user_id` = ? AND `tb1`.`from_user_id` = `tb2`.`user_id` ORDER by `date` DESC LIMIT '.$limit_page.', '.$gcount.''); $z_inbox->execute([$user_id]); $res_inbox = $z_inbox->fetchall(); //Если есть ответ из БД, то считаем кол-вот ответа if($res_inbox){ //выводим количество сообщений $msg_count = $pdo->prepare(' SELECT COUNT(message_id) AS `cnt` FROM `messages` `tb1`, `users` `tb2` WHERE `tb1`.`for_user_id` = ? AND `tb1`.`from_user_id` = `tb2`.`user_id`'); $msg_count->execute([$user_id]); $res_msg_count = $msg_count->fetch(); #############Выводим количесвто непрочитанных сообщений для пользователя######## if($res_msg_count){ echo 'Вы получили <span id="all_msg_num">'.$res_msg_count['cnt'].'</span>msg<br>'; }else{ echo'Нет полученных сообщений<br>'; } //Если есть сообщения то продолжаем, если нет, то выводи информацию if($res_inbox){ // include'./templates/default/messages/message.php'; foreach ($res_inbox AS $mess) { //Строка фото echo '<hr>'; if($mess['user_photo']){ echo '<img src="/uploads/users/full_img/'.$mess['user_photo'].'" height="50">'; }else{ echo '<img src="/uploads/users/full_img/no_ava/no_ava.png" height="50px">'; } //Строка от кого echo 'От : '. $mess['user_login'].'<br>'; //Строка номер сообщения // echo '№: '. $mess['id'].'<br>'; //Строка сообщения echo ' <div>'.stripslashes(strip_tags($mess['text'])).'</div>'; //делаем проверку сообщение прочитано или нет if($mess['pm_read'] == 'no'){ echo'<span style=color:red; >'.'Не прочитано</span><br>'; }else{ echo '<span style=color:green; >'.'Прочитанно</span><br>'; } //Строка дата echo '<span style=color:silver; >'.'Дата: '. $mess['date'].'</span>'; //Строка ответить сообщение echo '<br><a href="?go=msg&mid='.$mess['message_id'].'&act=review" onClick="Page.Go(this.href); return false">Ответить</a>'; //Строка удалить сообщение echo '<a href="?go=f_delet&mid='.$mess['message_id'].'" onClick="">Удалить</a><hr><br><br>'; //var_dump($mess); //var_dump($user_id); } if($res_msg_count['cnt'] > $gcount) echo $gcount, $res_msg_count['cnt'], '<a href="/index.php?go=msg&page=">Сделующая</a>'; }else{ echo 'no_msg1'; } }else{ echo 'Пока сообщений нет, у вас.'; } // } break; Но у меня таким образом вытягивается все сообщения пришедшие данному пользователю, не смотря на то даже на какой я диалог нажму, то ли от юзера1 то ли от юзера2. Вот вы можете считать меня нубом, или не умения учится правильно... Ну помогите поправьте меня в коде.