За последние 24 часа нас посетили 16472 программиста и 1671 робот. Сейчас ищут 862 программиста ...

$_SESSION, 2 таблицы, 2 формы

Тема в разделе "PHP и базы данных", создана пользователем Bross, 1 апр 2011.

  1. Bross

    Bross Активный пользователь

    С нами с:
    28 июн 2010
    Сообщения:
    10
    Симпатии:
    0
    Добрый день. Предупрежу сразу, я далеко не мастак, пока для меня это ед-ная возможность внести авторизацию в чат ))

    есть такая проблема: нужно свести 2 формы (авторизация и отправка сообщения) так, чтобы информация из одной(логин) использовался при передаче сообщения(вторая форма) на сервер. Соответственно логин из первой таблицы заменял имя отправителя сообщения в другой таблице.

    Изначально эта страница служила просто чатом, где имя юзера передавалось через POST.

    Код (Text):
    1. <?php include_once("bd.php"); ?>
    2. <?php
    3. // Указываем тип и кодировку
    4. Header("Content-Type: text/html; charset=utf-8");
    5. ?>
    6.  
    7.  
    8. <!-- Указываем DOCTYPE -->
    9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    10. <html>
    11. <head>
    12. <title>PhpAjaxChat</title>
    13. <!-- У нас всё работает в UTF-8 -->
    14. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    15.  
    16. <!-- Загружаем стили для чата -->
    17. <link rel="stylesheet" type="text/css" media="screen" href="css.css" />
    18.  
    19. <!-- Подключаем jQuery -->
    20. <script type="text/javascript" src="jquery.js"></script>
    21.  
    22. <!-- Сам код нашего чата -->
    23. <script type="text/javascript">
    24.  
    25. $(document).ready(function () {
    26.     $("#pac_form").submit(Send); // вешаем на форму с именем и сообщением событие которое срабатывает кодга нажата кнопка "Отправить" или "Enter"
    27.     $("#pac_text").focus(); // по поле ввода сообщения ставим фокус
    28.     setInterval("Load();", 2000); // создаём таймер который будет вызывать загрузку сообщений каждые 2 секунды (2000 милесукунд)
    29. });    
    30.  
    31. // Функция для отправки сообщения
    32. function Send() {
    33.     // Выполняем запрос к серверу с помощью jquery ajax: $.post(адрес, {параметры запроса}, функция которая вызывается по завершению запроса)
    34.     $.post("ajax.php",  
    35.     {
    36.         act: "send",  // указываем скрипту, что мы отправляем новое сообщение и его нужно записать
    37.         <!-- вот здесь была переменная с именем-->
    38.         text: $("#pac_text").val() //  сам текст сообщения
    39.     },
    40.      Load ); // по завершению отправки вызвовем функцию загрузки новых сообщений Load()
    41.  
    42.     $("#pac_text").val(""); // очистим поле ввода сообщения
    43.     $("#pac_text").focus(); // и поставим на него фокус
    44.    
    45.     return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится
    46. }
    47.  
    48. var last_message_id = 0; // номер последнего сообщения, что получил пользователь
    49. var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем
    50.  
    51. // Функция для загрузки сообщений
    52. function Load() {
    53.     // Проверяем можем ли мы загружать сообщения. Это сделанно для того, что бы мы не начали загрузку заново, если старая загрузка ещё не закончилась.
    54.     if(!load_in_process)
    55.     {
    56.         load_in_process = true; // загрузка началась
    57.         // отсылаем запрос серверу, который вернёт нам javascript
    58.         $.post("ajax.php",
    59.         {
    60.             act: "load", // указываем на то что это загрузка сообщений
    61.             last: last_message_id, // передаём номер последнего сообщения который получил пользователь в прошлую загрузку
    62.             rand: (new Date()).getTime()
    63.         },
    64.         function (result) { // в эту функцию в качестве параметра передаётся javascript код, который мы должны выполнить
    65.             eval(result); // выполняем скрипт полученный от сервера
    66.             $(".chat").scrollTop($(".chat").get(0).scrollHeight); // прокручиваем сообщения вниз
    67.             load_in_process = false; // говорим что загрузка закончилась, можем теперь начать новую загрузку
    68.         });
    69.     }
    70. }
    71. </script>
    72. <body>
    73.  
    74. <?php
    75. if(empty($login) and empty($password)){
    76. print <<<HERE
    77. <table>
    78. Вход:
    79. <br>
    80. <br>
    81.  
    82.       <form action="login.php" method="POST">
    83.       <tr>
    84.       <td>Логин:</td>
    85.       <td><input type="text" name="login" ></td>
    86.       </tr>
    87.      
    88.       <tr>
    89.       <td>Пароль:</td>
    90.       <td><input type="password" name="password" ></td>
    91.       </tr>
    92.      
    93.       <tr>
    94.       <td colspan="2"><input type="submit" value="OK" name="submit" ></td>
    95.       </tr>
    96.       </form>
    97.       </table>
    98. <a href="registration.php">Регистрация</a>
    99. HERE;
    100. }
    101. else{
    102. echo "Привет, <strong>".$login."</strong> | <a href='exit.php'>Выход</a>";
    103. }
    104. ?>
    105.  
    106.  
    107.  
    108. <div style="padding: 100px;">
    109. <h1>Php Ajax Chat</h1>
    110. <!-- Вот в этих 2-х div-ах будут идти наши сообщения из чата -->
    111. <div class="chat r4">
    112. <div id="chat_area"><!-- Сюда мы будем добавлять новые сообщения --></div>
    113. </div>
    114. <form id="pac_form" action=""><!-- Наша форма с именем, сообщением и кнопкой для отправки -->
    115. <table style="width: 100%;">
    116.         <tr>
    117.                 <td>Имя:</td>
    118.                 <td>Сообщение:</td>
    119.                 <td></td>
    120.         </tr>
    121.         <tr>
    122.                 <!-- Поле ввода имени -->
    123.                  <!-- Поле ввода сообщения -->
    124.                 <td style="width: 80%;"><input type="text" id="pac_text" class="r4" value=""></td>
    125.  
    126.                 <!-- Кнопка "Отправить" -->
    127.                 <td><input type="submit" value="Отправить"></td>
    128.         </tr>
    129. </table>
    130. </form>
    131.  
    132. </div>
    133. </body>
    134. </html>

    Эта страница на которой идёт обращение к серверу для отправки сообщения

    Код (Text):
    1. <?php include("login.php"); ?>
    2.  
    3. <?php
    4. // настройки для подключения к MySQl
    5. $config = array( 'hostname' => '', 'username' => '', 'password' => '', 'dbname' => '' );
    6.  
    7. // подключаемся к MySQL, если не вышло то выходим
    8. if( !mysql_connect($config['hostname'], $config['username'], $config['password']) )
    9. {
    10.     exit();
    11. }
    12. // Выбираем базу данных, если не вышло то выходим
    13. if( !mysql_select_db($config['dbname']) )
    14. {
    15.     exit();
    16. }
    17. mysql_query("SET NAMES 'utf8'"); // говорим MySQl'у то что мы будем работать с UTF-8
    18.  
    19. Header("Cache-Control: no-cache, must-revalidate"); // говорим браузеру что-бы он не кешировал эту страницу
    20. Header("Pragma: no-cache");
    21.  
    22. Header("Content-Type: text/javascript; charset=utf-8"); // говорим браузеру что это javascript в кодировке UTF-8
    23.  
    24. // проверяем есть ли переменная act (send или load), которая указываем нам что делать
    25. if( isset($_POST['act']) )
    26. {
    27.     // $_POST['act'] - существует
    28.     switch ($_POST['act'])
    29.     {
    30.         case "send" : // если она раняется send, вызываем функцию Send()
    31.             Send();
    32.             break;
    33.         case "load" : // если она раняется load, вызываем функцию Load()
    34.             Load();
    35.             break;
    36.         default : // если ни тому и не другому  - выходим
    37.             exit();
    38.     }
    39. }
    40.  
    41. // Функция выполняем сохранение сообщения в базе данных
    42. function Send()
    43. {
    44.     // тут мы получили две переменные переданные нашим java-скриптом при помощи ajax
    45.     // это:  $_POST['name'] - имя пользователя
    46.     // и $_POST['text'] - сообщение
    47.  
    48.    
    49.     session_start();
    50.     $name = $_SESSION['login'];
    51.     $name = htmlspecialchars($name); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    52.     $name = mysql_escape_string($name); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
    53.    
    54.  
    55.    
    56.     $text = substr($_POST['text'], 0, 200); // обрезаем до 200 символов
    57.     $text = htmlspecialchars($text); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    58.     $text = mysql_escape_string($text); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
    59.    
    60.     // добавляем новую запись в таблицу messages
    61.     mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')");
    62.     unset($_SESSION["login"]);
    63. }
    64.  
    65.  
    66. // функция выполняем загрузку сообщений из базы данных и отправку их пользователю через ajax виде java-скрипта
    67. function Load()
    68. {
    69.     // тут мы получили переменную переданную нашим java-скриптом при помощи ajax
    70.     // это:  $_POST['last'] - номер последнего сообщения которое загрузилось у пользователя
    71.  
    72.     $last_message_id = intval($_POST['last']); // возвращает целое значение переменной
    73.    
    74.     // выполняем запрос к базе данных для получения 10 сообщений последних сообщений с номером большим чем $last_message_id
    75.     $query = mysql_query("SELECT * FROM messages WHERE ( id > $last_message_id ) ORDER BY id DESC LIMIT 10");
    76.    
    77.     // проверяем есть ли какие-нибудь новые сообщения
    78.     if( mysql_num_rows($query) > 0 )
    79.     {
    80.         // начинаем формировать java-скрипт который мы передадим клиенту
    81.         $js = 'var chat = $("#chat_area");'; // получаем "указатель" на div, в который мы добавим новые сообщения
    82.        
    83.         // следующий конструкцией мы получаем массив сообщений из нашего запроса
    84.         $messages = array();
    85.         while ( $row = mysql_fetch_array($query) )
    86.         {
    87.             $messages[] = $row;
    88.         }
    89.        
    90.         // записываем номер последнего сообщения
    91.         // [0] - это вернёт нам первый элемент в массиве $messages, но так как мы выполнили запрос с параметром "DESC" (в обратном порядке),
    92.         // то это получается номер последнего сообщения в базе данных
    93.         $last_message_id = $messages[0]['id'];
    94.        
    95.         // переворачиваем массив (теперь он в правильном порядке)
    96.         $messages = array_reverse($messages);
    97.        
    98.         // идём по всем этементам массива $messages
    99.         foreach ( $messages as $value )
    100.         {
    101.             // продолжаем формировать скрипт для отправки пользователю
    102.             $js .= 'chat.append("<span>' . $value['name'] . '&raquo; ' . $value['text'] . '</span>");'; // добавить сообщние (<span>Имя &raquo; текст сообщения</span>) в наш div
    103.         }
    104.        
    105.         $js .= "last_message_id = $last_message_id;"; // запишем номер последнего полученного сообщения, что бы в следующий раз начать загрузку с этого сообщения
    106.        
    107.         // отправляем полученный код пользователю, где он будет выполнен при помощи функции eval()
    108.         echo $js;
    109.     }
    110. }
    111. ?>
    Здесь происходит авторизация

    Код (Text):
    1.  
    2. <?php
    3. include_once("bd.php");
    4. ?>
    5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    9. </head>
    10. <body>
    11.  
    12. <?php
    13. if (isset($_POST['login'])) {
    14.     $login = $_POST['login'];
    15.     if ($login == '') {
    16.         unset($login);
    17.         exit ("Введите пожалуйста логин!");
    18.     }
    19. }
    20. if (isset($_POST['password'])) {
    21.     $password=$_POST['password'];
    22.     if ($password =='') {
    23.         unset($password);
    24.         exit ("Введите пароль");
    25.     }
    26. }
    27.  
    28. $login = stripslashes($login);
    29. $login = htmlspecialchars($login);
    30.  
    31. $password = stripslashes($password);
    32. $password = htmlspecialchars($password);
    33.  
    34.  
    35. $login = trim($login);
    36. $password = trim($password);
    37.  
    38. $password = md5($password);//шифруем пароль
    39.  
    40. $user = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'");
    41. $id_user = mysql_fetch_array($user);
    42. if (empty($id_user['id'])){
    43.     exit ("Извините, введённый вами логин или пароль неверный.");
    44. }
    45. else {
    46.  
    47.    
    48.     $_SESSION['password']=$password;
    49.     $_SESSION['login']=$login;
    50.     $_SESSION['id']=$id_user['id'];
    51.          
    52. }
    53. echo "<meta http-equiv='Refresh' content='0; URL=index.php'>";
    54. ?>
    55. </body>
    56. </html>
     
  2. Bross

    Bross Активный пользователь

    С нами с:
    28 июн 2010
    Сообщения:
    10
    Симпатии:
    0
    Разобрался, но не совсем )) Проблема далее возникла в функции отправки. После авторизации только один раз выводится имя пользователя. Вопрос: как сделать, чтоб в следующем сообщении имя так же записывалось?

    Код (Text):
    1.  
    2. function Send()
    3. {
    4.    
    5.     session_start();
    6.     $name = $_SESSION['login'];
    7.     unset($_SESSION["login"]);
    8.  
    9.     $name = htmlspecialchars($name); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    10.     $name = mysql_escape_string($name); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
    11.    
    12.  
    13.    
    14.     $text = substr($_POST['text'], 0, 200); // обрезаем до 200 символов
    15.     $text = htmlspecialchars($text); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    16.     $text = mysql_escape_string($text); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
    17.    
    18.     // добавляем новую запись в таблицу messages
    19.     mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')");
    20.    
    21. }
     
  3. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    не уничтожать сессию
     
  4. Bross

    Bross Активный пользователь

    С нами с:
    28 июн 2010
    Сообщения:
    10
    Симпатии:
    0
    Благодарю! Работает )))
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    напомнило эпизод из футурамы про "бюрократический цикл"