КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

Добавление комментариев используя технологию Ajax

Привет! Давайте разберёмся как добавлять комменты на сайт без перезагрузки страницы. Итак, файл index.php: ставим хедер с кодировкой и подключаем файл-обработчик Handler.php, в котором определены в виде констант нужные параметры доступа к БД и написан такой вот класс:


define('HOST', 'localhost');
define('DBNAME', 'web4myself');
define('LOGIN', 'root');
define('PASSWORD', '');
define('TABLENAME', 'comment');


class Handler{

  protected $db;

  public function __construct(){
      
    try{
      $this->db = new PDO('mysql: host='.HOST.'; dbname='. DBNAME, LOGIN, PASSWORD);
      $this->db->exec("SET NAMES 'utf8'"); 
      $this->db->exec("SET CHARACTER SET 'utf8'");
      $this->db->exec("SET SESSION collation_connection = 'utf8_general_ci'");
      
      $this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // PDO::ATTR_ERRMODE: Режим сообщений об ошибках.  ERRMODE_EXCEPTION - для отладки и отлова ошибок

    //Перехват исключений    
    }catch(PDOException $err){
            
      echo 'Ошибка соединения ' . $err->getMessage(). '<br> 
            в файле '.$err->getFile().", строка ".$err->getLine(); 
      // можно также записать ошибку в лог-файл      
      $logger = $_SERVER['DOCUMENT_ROOT'].'../logger/PDOErrors.txt';
  file_put_contents($log, $e->getMessage()." (".date("l, d-m-Y H:i:s").") - Ошибка коннекта к БД\r\n", FILE_APPEND);
      exit; 
            
    }
  }
  
  public function select($query, array $values=array()){
    $stmt = $this->db->prepare($query);
    $stmt->execute($values);
    $stat = array();
    while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
      $stat[] = $row;
    }
    return $stat;
  }
  
  public function insert($table, $fields, array $values)
  {
    try{
      $db = $this->db;
      $fields_ = explode(',', $fields);
      $fields_len = count($fields_);
      $values_len = count($values);
      if ($fields_len !== $values_len) {
        exit('Количество полей и значений не совпадает');
      }
      $prepare = str_repeat('?,', $fields_len);
      // Отрезаем последнюю запятую в составленном запросе
      $prepares = substr($prepare, 0, mb_strlen($prepare) - 1);
      $sql = "INSERT INTO $table ($fields) VALUES ($prepares)";
      $stmt = $db->prepare($sql);
      // обезвреживание данных
      for ($i = 0; $i < $values_len; $i++) {
        $value = trim($values[$i]);
        if (preg_match('/^\d+$/', $value)) {
          $stmt->bindValue($i + 1, $value, \PDO::PARAM_INT);
        }
        else {
          $stmt->bindValue($i + 1, $value, \PDO::PARAM_STR);
        }
      }
      return $stmt->execute();
    } catch (\PDOException $err) {
      echo 'Ошибка при вставке данных в таблицу ' . $err->getMessage(). '<br> 
              в файле '.$err->getFile().", строка ".$err->getLine() . "<br><br>Стэк вызовов: " . preg_replace('/#\d+/', '<br>$0', $err->getTraceAsString()); 
        exit;  
    }
    
  }

  function __destruct(){
   $this->db=null;
   unset($this);
  }
}

, и создаём объект нашего класса
$handler = new Handler();

Дальше подлючаем джейквери и файл, который будет заниматься отправкой аякс-запроса js/comments.js.В body ставим див обёрточный, в котором стандартная форма для добавления комментариев и список ul, в нём через цикл выводим комментарии, которые, если они есть в таблице comment, будут возвращены в виде массива вызвынной функцией select у объекта $handler:

$sql = "SELECT nickname, comment FROM comment ORDER BY id DESC";
$comments = $handler->select($sql);

foreach ($comments as $row){
  echo "<li><span class='span'>".$row['nickname'].
"</span><p>".$row['comment']."</p></li><hr>"; 
}
В файле js/comments.js составляем аякс-запрос к файлу php/comments.php, который выполнится после нажатия на кнопку "Добавить комментарий":
$('#commentbutton').click(function(e){
  
  e.preventDefault(); // перехватываем стандартное событие отправки формы
  
  // получим введённые данные
  var nickname = $('#nickname').val();
  var comment = $('#comment').val();
  
  // лёгонькие проверки
  if(nickname != 'Ник' && nickname != '' && comment != 'Комент' && comment != ''){
    
    // url не указан, значит запрос будет сделан к текущему скрипту, то есть к index.php
    $.ajax({
      type:"POST",
      // передаём данные в виде объекта
      data:{nickname:nickname, comment:comment},
      // в функцию success-а вернётся ответ скрипта как переменная data
      success: function(data){
        // если пришла единица
        if(data == 1){
          $("ul#commentslist").prepend("<li><span class='span'>" + nickname + "</span><p>" + comment + "</p></li><hr>"); // Итак, если js-скрипт принял единицу, то форматируем то, что передавалось и вставляем до всего предыдущего в ul
          
          // и очищаем поля
          $('#nickname').val('');
          $('#comment').val(''); 
        }
      }
    });
  }
});
И самый главный вопрос - что мы сделаем с передаваемыми Аяксом данными, где мы их отловим? А ловим мы их сразу после создания экземпляра класса Handler, и сразу же передаём $_POST-данные в функцию insert объекта $handler:
  if($_POST){
    // делаем эхо того, что вернёт нам $handler->insert, в случае успеха просто Обязана вернуться единица
    echo $handler->insert(TABLENAME, "`nickname`, `comment`", array($_POST['nickname'], $_POST['comment']));
    exit; // exit в данном случае обязателен, потому что в противном случае аякс-запрос вернёт нам вдобавок весь хтмл файла)
  }

Вот и всё, не бойтесь кода. Если принцип понятен, то остальное всё допилите сами, не буду воровать у вас эту радость. Пока, отцу привет

2015.04.13 (обновлена 2017.05.18) 1891
jpgjpg

Сценарий XXX фильма для компьютерщиков Пока в командировке, жена случайно ломает компьютер. Боясь что муж об этом узнает вызывает на дом мастера по объявлению в интернете. Приходит небритый волосатый мужчина в свитере. Он понимает что она боится рассказать мужу и поэтому она полностью в его власти. Акт длится целую ночь - подробно показываются сцены переустановки Windows, восстановления файлов с помощью Acronis, особенно жестоко показана сцена настройка dialup соединения.
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


  • Пригодится, забираю. А не скажите, как изменить код PHP, а то у меня на сайте используется PDO?

  • 2017.05.16 - 15:16

  • sash ответил VintIk

    VintIk, ясное дело как, только ручками Я уже только PDO и использую, эта статейка давным-давно писалась.. Вот статья по ПДО http://web4myself.ru/mysql/PDO::великий и могучий

  • 2017.05.16 - 15:44

  • sash ответил VintIk

    VintIk, специально для тебя перепишу статью древнюю

  • 2017.05.16 - 22:06

  • sash ответил VintIk

    VintIk, забирай обнову

  • 2017.05.18 - 15:13

Яндекс.Метрика Яндекс.Метрика