как пользоваться INSERT в php?

Sergey
512
6
0
Здравствуйте, Александр.
Подскажите, пожалуйста, как правильно обработать INSERT при вставке значения в БД через php? Проблема в том, что при каждом обновлении дублируется запись. Нужно добавить запись один раз! К тому же, подозреваю, что эта проблема меня настигнет и при обработке пользовательской формы, если будет случайно перезагружена страница после отправки формы!!!

Нашел в сети информацию о использовании редиректа! Не могу его применить в своем случае! Сервер локальный Apache, страница вывода (http://kinomonster.com/player.php).

В коде, однозначно допущены синтаксические ошибки(
Warning: mysqli::query(): Couldn't fetch mysqli in C:\xampp\htdocs\kinomonster\player.php on line 12
Warning: mysqli::query(): Couldn't fetch mysqli in C:\xampp\htdocs\kinomonster\player.php on line 14)!
Возможно иная логика будет более приемлемой в этом случае?!
$query = "INSERT into songs values(null, 'Home', 'Armand Amar')";
$mysqli->query($query);

 if($mysqli->query($query)) { // Если выполнился query
      // Здесь редирект
     header("Location: http://kinomonster.com/player.php" . $_SERVER['REQUEST_URI']);
     exit();
 }


Спасибо, огромное!

Комментарии:

  1. Sergey
    19 апреля 2020, 20:23
    Здравствуйте, Александр. С помощью других людей, мне удалось написать рабочий код php (добавление песен в БД через пользовательскую форму). Все работало до момента, пока я не добавил переменные $nameFilter, $authorFilter с целью обеспечить проверку входных данных от пользователя. Подскажите, пожалуйста, как должен выглядеть рабочий вариант этого кода?! Сейчас он добавляет пустые записи в БД.
    session_start();
     
    if (isset($_POST['name']) && isset($_POST['author'])) {
        unset($_SESSION['error']);
        
        if (empty($_POST['name']) || empty($_POST['author'])) {
            $_SESSION['error']['empty'] = 'Не заполненно Наименование или Автор';
        } else {
            $mysqli = new mysqli('localhost', 'root', '', 'player');
            if (mysqli_connect_errno()) {
            	$nameFilter = htmlspecialchars($_POST ['name'], ENT_QUOTES, 'UTF-8');
                $authorFilter = htmlspecialchars($_POST ['author'], ENT_QUOTES, 'UTF-8');
                printf("Соединение не установлено", mysqli_connect_error());
                exit();
            }
     
            $name = $mysqli->real_escape_string($_POST['name']);
            $author = $mysqli->real_escape_string($_POST['author']);
     
            $result = $mysqli->query("SELECT * FROM songs WHERE name = '" . $name . "' AND author = '" . $author . "'");
            
            if ($result->num_rows > 0) {
                $_SESSION['error']['duplicate'] = 'В базе,  уже существует идентичная запись';
            } else {
                $query = "INSERT INTO songs (name,author) VALUES('" . $nameFilter . "', '" . $authorFilter . "')";
                $mysqli->query($query);
                $mysqli->close();
            }
        }
    
    СПАСИБО ЗА ПОМОЩЬ!
    1. Sergey
      20 апреля 2020, 07:04
      не в том месте указал переменные nameFilter… Код заработал!
      1. Александр Мальцев
        20 апреля 2020, 13:52
        Отлично!
        Но, при перезагрузке страницы данные в массиве $_POST останутся.
        Этот момент желательно доработать. Например, выполнив редирект на эту же страницу. Результат нужных операций можно вывести на страницу через сессионные переменные, которые вы уже создали:
        if (isset($_POST['name']) && isset($_POST['author'])) {
          ...
          if (empty($_POST['name']) || empty($_POST['author'])) {
            $_SESSION['error']['empty'] = 'Не заполнено Наименование или Автор';
          } else {
            ...
          }
          header('Location: ' . $_SERVER['REQUEST_URI']);
        }
        
        1. Sergey
          20 апреля 2020, 22:47
          Спасибо, Александр, за вашу помощь! Такими вот нюансами и дополняю свое понимание вещей!
          код мой выглядит так
          <?php
          include('db.php');
          
          $query = $mysqli->query('SELECT * FROM songs');
          while($row = mysqli_fetch_assoc($query)) {
          	echo $row['name']." - ".$row['author']."
          ";
          }
          $mysqli->close();
           
          session_start();
           
          if (isset($_POST['name']) && isset($_POST['author'])) {
              unset($_SESSION['error']);
              
              if (empty($_POST['name']) || empty($_POST['author'])) {
                  $_SESSION['error']['empty'] = '<p style="color: red">Name or author is not filled';
              } else {
                  $mysqli = new mysqli('localhost', 'root', '', 'player');
                  $nameFilter = trim(htmlspecialchars($_POST ['name'], ENT_QUOTES, 'UTF-8'));
                  $authorFilter = trim(htmlspecialchars($_POST ['author'], ENT_QUOTES, 'UTF-8'));
              if (mysqli_connect_errno()) {
                      printf("Connection failed", mysqli_connect_error());
                      exit();
                  }
                  $name = $mysqli->real_escape_string($_POST['name']);
                  $author = $mysqli->real_escape_string($_POST['author']);
           
                  $result = $mysqli->query("SELECT * FROM songs WHERE name = '" . $name . "' AND author = '" . $author . "'");
                  
                  if ($result->num_rows > 0) {
                      $_SESSION['error']['duplicate'] = '<p style="color: red">An identical entry already exists in the database';
                  } else {
                      $query = "INSERT INTO songs (name,author) VALUES('" . $nameFilter . "', '" . $authorFilter . "')";
                      $mysqli->query($query);
                      $mysqli->close();
                  }
              }
          
              header('Location: ' . $_SERVER['REQUEST_URI']);
          }
          ?>
          
          На форуме мне подсказали, что nameFilter i authorFilter не нужны здесь, потому что присутствует real_escape_string
          А также завтра займусь этим советом «нужно позаботиться, чтоб не поломался сам SQL запрос, для этого используйте real_escape_string либо подготовленные запросы. www.php.net/manual/ru/mysqli.prepare.php»

          Спасибо и вам, так и соберу по-понемногу рабочий код и опыт!
    2. Sergey
      17 апреля 2020, 15:44
      Спасибо за совет, Александр! Продолжу свою работу далее!
      1. Александр Мальцев
        17 апреля 2020, 14:56
        Здравствуйте!
        При создании сайта желательно логику представления писать в одних php скриптах, а операции с базой данных в других. В этом случае при отправке у вас данные всегда будут уходить в отдельный php скрипт, в котором вы будете обрабатывать данные и перенаправлять результат обратно в скрипт представления. Скрипт представления в результате не будет содержать POST данных в заголовке запроса, и, следовательно у вас не будет этих проблем.
        Работу с базой, если вы не используете никаких готовых php библиотек, желательно производить на pdo.
        Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.