@igordata я часто с телефона сижу!!! Ну я думаю у тебя сенсорный телефон который зип поддерживает а то у меня не сенсорный но зип поддерживает, да скачай и посмотри что лучше улучшить или убрать, если конечно сможешь скачать --- Добавлено --- @igordata ты издеваешься скачай он не так много весит вопрос не работает header(); Ошибочку кидает типа данные были уже отправлены не возможно повторно отправить стандартная ошибка с этим headerom как у всех PHP: echo '<script>document.location.href="?go=all_msg&good=send";</script>';//так срабатывает перенаправленные а если не поддерживает у юзера js что сделать? header("location: ?go=all_msg&good=send");//Конечно же использовать header но блин ошибка выскакивает заголовки уже были отправлены, как бороться с этим?
если тебе нужно - ты делай усилия если тебе лень залить, почему мне не должно быть лень качать? Да ещё и нагрубил.
@igordata так если ты считаешь что тебе нагрубил, то извини пожалуйста! Только я не понял где я нагрубил)
Всем привет, сегодня встал утречком посмотрел в скрипт отправки сообщения, и увидел пару багов одним словом, исправил скрипт изменил. Посмотрите пожалуйста может я не правильно реализовал что либо, а вы мне подскажите где исправить спасибо.
@mkramer согласен что качать не кто не должен и не обязан))) Скрипт отправки сообщения: PHP: <?php include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/ error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки if(!defined('BEZ_KEY'))//типа ключ защиты die('Hacking attempt!'); $user_id = $_SESSION['user_id'];//сессия пользователя $to = intval($_POST['to_user']);//поле из формы кому будем оптравить $message = $_POST['message'];//поле из формы сообщение $error = array();//Вывод ошибок может пригодится if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету $row = $pdo->prepare('SELECT * FROM `users` WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1'); $row->execute(['user_id' => $to]); $result_row = $row->fetch(); if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать //Проверка на наличии созданного диалога между 2 пользователями $check_dialogs = $pdo->prepare(' SELECT `ds`.* FROM `dialogs` ds JOIN `dialog_user` du1 ON (du1.`dialog_id` = ds.`id`) JOIN `dialog_user` du2 ON (du1.`dialog_id` = du2.`dialog_id`) WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"'); $check_dialogs->execute(); $result_check = $check_dialogs->fetch(); $id = $result_check['id'];//этот id будем использовать при обновлении диалога if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение echo 'Новый диалог<br>'; //создаем диалог между пользователями $ins_date = date('Y.m.d H:i:s'); $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)'); $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]); $dialog_new_result = $dialogs->fetch(); //получаем последнюю созданную запись из таблицы dialogs $posledniy_InsertID = $pdo->lastInsertId(); //вставка диалога и id юзера от кого отправляем в общую таблицу dialog_user $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]); //вставка диалога и id юзера тому кому отправляем в общую таблицу dialog_user $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]); //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`dialog_id`, `sender_id`, `text`, `date`) VALUES (:dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); echo 'сообщение отправлено'; echo '<script>document.location.href="?go=all_msg&good=send";</script>'; // header("location: /system/modules/dialog/all_msg.php"); // exit; }else{//иначе обновляем диалог +1 к количеству сообщений добавляем и отправляем сообщение echo 'Диалог обновлен или же существует<br>'; //обновляем диалог делаем плюс 1 к сообщениям $upd_date = date('Y.m.d H:i:s');//создаем переменную для даты $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `pm_read`= :pm_read, `date`= :dates, `msg_num`= msg_num+1, `all_msg_num`= all_msg_num+1 WHERE `id` = "'.$id.'"'); $dialog_update->execute(['pm_read' => 'no', 'dates' => $upd_date]); //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`dialog_id`, `sender_id`, `text`, `date`) VALUES (:dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); echo 'сообщение отправлено'; echo '<script>document.location.href="?go=all_msg&good=send";</script>'; // header("location: /system/modules/dialog/all_msg.php"); // exit; } }else{ echo 'вы не можете писать самому себе'; } }else{ echo 'пользователь на зарегистрирован'; } }else{ echo 'поле сообщение не может быть пустым'; } ?> Форма отправки сообщения PHP: <?php if (!isset($_SESSION['user_id'], $_GET['to'])) { die("быстро пошел от сюда"); }else{ ?> <div class="content"> <form action="?go=send_msg" method="POST"> <input type="" name="to_user" placeholder="наберите id пользователя..." value="<?= (int)$_GET['to']; ?>"/> <textarea name="message" placeholder="наберите текст..." cols="40" rows="2"></textarea><br /> <input type="submit" value="Отправить" /> </form> </div> <?php } ?> Посмотрите что в коде не так, когда проверял на ошибки старался исправить их.
пишу скрипт диалоги, задачу себе придумал сам и заключается в том что надо: 1 вытащить все диалоги для одного пользователя 2 в этот диалог поместить последнее сообщение от кого либо если он последний писал то его сообщение вывести 3 кнопку или ссылку на открытие этого диалога, и кнопку на удаления диалога. В принципе последнее сообщение вытащить могу тупо делаю группировку ORDER BY `date` по дате, то есть сообщение что отправилось позже то и выведется у юзера, только выведется его сообщение что он отправлял а не его собеседник, пока что не разобрался, как вывести диалог для юзера.
Можно сделать вместе join и select - очень мощный приём. Результат select - это тоже таблица. Хотя, когда мне нужно было выводить последнее сообщение, я, как я уже писал, хранил его в таблице с диалогом (и, естественно, каждый раз обновлял) - чтобы не сильно думать над запросом, а то сильно сложно получается.
@mkramer То есть хранил, последнее сообщение, а как если пишут оба юзера друг другу и чье сообщения в диалоге сохраняется? Получается юзер пишет у тебя запись вставляется в сообщение и еще обновляется диалог со вставленным сообщением?
Самое последнее, пришедшее на обработку. И id последнего отправителя тоже, естественно. На низконагруженном проекте маловероятно, что придут одновременно, на высоконагруженном - там свои методы есть, пока не для тебя. Да, мне кажется это дешевле и по скорости работы, и по трудоёмкости, чем выбирать последние сообщения при запросе списка диалогов. У меня есть одна черта - она иногда хороша, хотя иногда и может мешать. Я терпеть не могу сложный код. --- Добавлено --- Хотя, все лекторы и авторы, которых я смотрел/читал, тоже пишут, что код должен быть наиболее простым из возможного. Конечно, иногда задача настолько сложна, что простым кодом её не решить.
вот тут спрошу, я же предлагал хранить user_id в таблице диалогов. Ну если я правильно понял надо хранить в таблице диалогов id сообщения и id юзера либо text сообщения и id юзера. Как лучше будет?
@mkramer и еще как будет идти запись в таблицу диалог, например для последнего сообщения, вот пример: если диалога нет и юзер только пишет вставляется запись в таблицу dialog а как же сообщение последнее если только что написал сообщение юзер? Что нужно будет после вставленного сообщения делать update для таблица dialog?
Ну ты тогда же не ставил задачу с отображением последнего, поэтому смысла не было, а если есть задача, смысл есть, только назвать как-нибудь типа last_sender_id, и оно меняется при каждом новом сообщении. Можно и обновить, можно и сразу поставить. update одной записи - быстрый запрос. Смотря, имеет ли смысл по задаче хранить не только само последнее сообщение, а и его id. А можно, кстати, и просто id последнего сообщения хранить, и тогда вполне человеческий join будет, не сложный. Вариантов масса, главное пользоваться головой
@mkramer я буду просто хранить id сообщения. Только не пойму как вставить запись сразу если сообщение только создалось? Вы смотрели скрипт который я написал как вам его реализация, код вроде красивый и реализация не сложная! А можно его оптимизировать?
Никак. Запиши сообщение, потом сделай update, один запрос обновления по первичному ключу погоды для быстродействия не сделает
@mkramer буду пробовать сделать запрос, может получится. Вот не пойму логику, делаю проверку на существования диалога если его нет вставляю запись ну и сразу создаю сообщение. А как продумать дальше логику чтобы можно последнее сообщение записать?
А я не пойму, что в этом сложного? Делаешь insert сообщения, а потом обновляешь какой-нибудь last_message_id у диалога. Не дифуру же решить
@mkramer давно диф уравнения не решал) Вот код: помогите доделать я просто не пойму что не так: PHP: <?php /* Appointment: Написать сообщений name: Отпрака сообщения File: send_msg.php Author: _ne_scaju_ */ include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/ error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки if(!defined('BEZ_KEY'))//типа ключ защиты die('Hacking attempt!'); $user_id = $_SESSION['user_id'];//сессия пользователя $to = intval($_POST['to_user']);//поле из формы кому будем оптравить $message = $_POST['message'];//поле из формы сообщение $error = array();//Вывод ошибок может пригодится if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету $row = $pdo->prepare('SELECT * FROM `users` WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1'); $row->execute(['user_id' => $to]); $result_row = $row->fetch(); if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать //Проверка на наличии созданного диалога между 2 пользователями $check_dialogs = $pdo->prepare(' SELECT `ds`.* FROM `dialogs` ds JOIN `dialog_user` du1 ON (du1.`dialog_id` = ds.`id`) JOIN `dialog_user` du2 ON (du1.`dialog_id` = du2.`dialog_id`) WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"'); $check_dialogs->execute(); $result_check = $check_dialogs->fetch(); $id = $result_check['id'];//этот id будем использовать при обновлении диалога if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение echo 'Новый диалог<br>'; //создаем диалог между пользователями $ins_date = date('Y.m.d H:i:s'); $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)'); $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]); $dialog_new_result = $dialogs->fetch(); //получаем последнюю созданную запись из таблицы dialogs $posledniy_InsertID = $pdo->lastInsertId(); //вставка диалога и id юзера от кого в общую таблицу dialog_user $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]); //вставка диалога и id юзера кому пишем в общую таблицу dialog_user $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]); //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['id' => NULL, 'dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); $new_mess_result = $new_mess->fetch(); // $id_msgss = $pdo->lastInsertId(); $id_msgss = $new_mess_result['id']; $sender_id = $new_mess_result['sender_id']; echo 'сообщение отправлено'; // echo '<script>document.location.href="?go=all_msg&good=send";</script>'; // header("location: /system/modules/dialog/all_msg.php"); // exit; /*//вставка последнего сообщения для ид пары диалога $message_user_insert_3 = $pdo->prepare('INSERT INTO `message_user` (`message_id`, `user_id`) VALUES (:message_id, :user_id)'); $message_user_insert_3->execute(['message_id' => $id_msgss, 'user_id' => $user_id]);*/ }else{//иначе обновляем диалог +1 к количеству сообщений добавляем и отправляем сообщение echo 'Диалог обновлен или же существует<br>'; /* //обновляем диалог делаем плюс 1 к сообщениям $upd_date = date('Y.m.d H:i:s');//создаем переменную для даты $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `pm_read`= :pm_read, `date`= :dates, `msg_num`= msg_num+1, `all_msg_num`= all_msg_num+1 WHERE `id` = "'.$id.'"'); $dialog_update->execute(['pm_read' => 'no', 'dates' => $upd_date]); //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['id' => NULL,'dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); $new_mess_result = $new_mess->fetch(); // $id_msg = $new_mess_result['id']; $id_msg = $pdo->lastInsertId(); echo 'сообщение отправлено'; // echo '<script>document.location.href="?go=all_msg&good=send";</script>'; // header("location: /system/modules/dialog/all_msg.php"); // exit; //обновляем диалог делаем плюс 1 к сообщениям $message_user_update = $pdo->prepare('UPDATE `message_user` SET `message_id`= :message_id, `user_id`= :user_id'); $message_user_update->execute(['message_id' => $id_msg, 'user_id' => $user_id]);*/ } if($result_check){ $dial = $pdo->prepare('SELECT * FROM `messages` WHERE `id` = NULL'); $dial->execute(); $id_aaa =$dial->fetch(); $dddd = $id_aaa['id']; $dialog_update = $pdo->prepare('UPDATE `dialogs` SET `message_id`= :message_id, `last_sender_id`= :last_sender_id WHERE `id` = "'.$id.'"'); $dialog_update->execute(['message_id' => $dddd, 'last_sender_id' => $user_id]); } }else{ echo 'вы не можете писать самому себе'; } }else{ echo 'пользователь на зарегистрирован'; } }else{ echo 'поле сообщение не может быть пустым'; } ?> помогите логику додумать чтобы последнее сообщение вставить.
Так у тебя всё написано уже. Не понял совсем 70-ю строку, ведь insert не возвращает данных. Вот 72 - правильная, хоть оно у тебя закомментено Теперь что-то вроде PHP: $pdo->query("update dialogs set last_message_id=$id_msgss where id=$posledniy_InsertID"); И всё. Строка 78 - что там за бредятина? Я по-моему писал, что скрипт обработки post должен редиректить, а не выводить что-то. И редиректить через header, а не через javascript
@mkramer все исправил, я даже не знал что так можно тупо $pdo->query(); делать но так же данные получаются открыты я не могу плейсхолдеры использовать. Теперь второй вопрос, когда я делаю редирект headerom то у меня ошибочки вылетают, стандартная ошибка типа заголовки были уже отправлены. Остаточный вариант скрипта на сегодня, проблемы с редиректом. PHP: <?php include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключение к бд*/ error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки if(!defined('BEZ_KEY'))//типа ключ защиты die('Hacking attempt!'); $user_id = $_SESSION['user_id'];//сессия пользователя $to = intval($_POST['to_user']);//поле из формы кому будем оптравить $message = $_POST['message'];//поле из формы сообщение $error = array();//Вывод ошибок может пригодится if(isset($message) AND !empty($message)){//если поля не заполнены то выдаем ошибку //запрос проверка на существование получателя + проверяем активировал ли аккаунт если нет то считаем что такого пользователя нету $row = $pdo->prepare('SELECT * FROM `users` WHERE `user_id` = :user_id AND `user_activation` = 1 LIMIT 1'); $row->execute(['user_id' => $to]); $result_row = $row->fetch(); if($result_row){//если пользователь не зареган то говорим что такой пользователь не зареган if($user_id != $to){ //если пользователь старается написать себе сообщение то говорим пользователю что он сам себе не может писать //Проверка на наличии созданного диалога между 2 пользователями $check_dialogs = $pdo->prepare(' SELECT `ds`.* FROM `dialogs` ds JOIN `dialog_user` du1 ON (du1.`dialog_id` = ds.`id`) JOIN `dialog_user` du2 ON (du1.`dialog_id` = du2.`dialog_id`) WHERE du1.`user_id` = "'.$user_id.'" AND du2.`user_id` = "'.$to.'"'); $check_dialogs->execute(); $result_check = $check_dialogs->fetch(); $id = $result_check['id'];//этот id будем использовать при обновлении диалога if(!$result_check){//если диалога между 2-мя пользователями не существует то создаем его и отправляем сообщение echo 'Новый диалог<br>'; //создаем диалог между пользователями $ins_date = date('Y.m.d H:i:s'); $dialogs = $pdo->prepare('INSERT INTO `dialogs` (`id`, `pm_read`, `date`, `msg_num`, `all_msg_num`) VALUES (:id, :pm_read, :dates, :msg_num, :all_msg_num)'); $dialogs->execute(['id' => NULL, 'pm_read' => 'no', 'dates' => $ins_date, 'msg_num' => 1, 'all_msg_num' => 1]); $posledniy_InsertID = $pdo->lastInsertId(); //получаем последнюю созданную запись из таблицы dialogs //вставка диалога и id юзера от кого в общую таблицу dialog_user $dialog_user_insert_1 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_1->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $user_id]); //вставка диалога и id юзера кому пишем в общую таблицу dialog_user $dialog_user_insert_2 = $pdo->prepare('INSERT INTO `dialog_user` (`dialog_id`, `user_id`) VALUES (:dialog_id, :user_id)'); $dialog_user_insert_2->execute(['dialog_id' => $posledniy_InsertID, 'user_id' => $to]); //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['id' => NULL, 'dialog_id' => $posledniy_InsertID, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); $posledniy_InsertID_msg = $pdo->lastInsertId(); echo 'сообщение отправлено'; //обновляем запись последнее id сообщения и id юзера отправителя $pdo->query("UPDATE `dialogs` SET `last_message_id` = $posledniy_InsertID_msg, `last_sender_id` = $user_id WHERE `id` = $posledniy_InsertID"); // echo '<script>document.location.href="?go=all_msg&good=send";</script>'; header("Location: ?go=all_msg&good=send"); exit; }else{//иначе отправляем сообщение и обновляем диалог таблицу echo 'Диалог обновлен или же существует<br>'; //Отправляем сообщение вставляем в базу $mess_date = date('Y.m.d H:i:s'); $new_mess = $pdo->prepare('INSERT INTO `messages` (`id`, `dialog_id`, `sender_id`, `text`, `date`) VALUES (:id, :dialog_id, :sender_id, :mess, :dates)'); $new_mess->execute(['id' => NULL,'dialog_id' => $id, 'sender_id'=> $user_id, 'mess'=> $message, 'dates'=>$mess_date]); $new_mess_result = $new_mess->fetch(); $posledniy_InsertID_msg = $pdo->lastInsertId(); echo 'сообщение отправлено'; //обновляем запись последнее id сообщения и id юзера отправителя $pdo->query("UPDATE `dialogs` SET `last_message_id` = $posledniy_InsertID_msg, `last_sender_id` = $user_id WHERE `id` = $id"); // echo '<script>document.location.href="?go=all_msg&good=send";</script>'; header("Location: ?go=all_msg&good=send"); exit; } }else{ echo 'вы не можете писать самому себе'; } }else{ echo 'пользователь на зарегистрирован'; } }else{ echo 'поле сообщение не может быть пустым'; } ?> Ошибка снизу: Warning: Cannot modify header information - headers already sent by (output started at не хотел показывать саму ошибку, я понимаю что она означает а как бороться с ней, не понимаю. Может объяснить как исправить?
Поищи по форуму, тысячу раз объясняли, из-за чего она может быть и как с этим бороться. Ну поскольку в этот запрос я подставляю только что полученные из базы значения автоинкремента, я как бы уверен, что там ничего кроме целых чисел не будет, в этих переменных. Но хочешь, сделай prepare, не суть Мне лень писать было. --- Добавлено --- Вот эту глубокомысленную надпись обязательно здесь выводить? Ещё раз: после успешной обработки POST (если это не ajax, и ты не пишешь API) не нужно ничего никуда выводить, кроме заголовка переадресации. Точка. Почитай тему с заданием от @Fell-x27, там кучу раз это обсуждалось
@mkramer нет конечно не обязательно, это когда тестировал скрипт проверял, к стати это считается и для header если какие то данные отправил перед ним то все header не переадресует? я знаю что эта ошибка описана на форуме, я вообще хочу разобраться чтобы впредь не ошибаться и бороться с ней)
Ну неужели лень самому поискать, надо что в рот положили. Да, перед header не должно быть никакого вывода. Я сторонник не писать вывода перед header, @Fell-x27 сторонник поставить ob_start() в начале скрипта, и забить на всё, поскольку тогда php сам разберётся, что и когда выводить. Разжёвана эта тема в нете 1000 раз, кто-то даже целый сайт сделал, посвящённый этой ошибке. Ну реально. Вот тебя возьмут на работу, ты тоже будешь с каждым вопросом на форум бегать? Так тогда зарплатой делиться придётся. Ты же даже update элементарный не можешь написать без вопроса...