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

Sergey
Sergey
1.3K
6
Здравствуйте, Александр. Подскажите, пожалуйста, как правильно обработать 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();
 }
Спасибо, огромное!

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

  1. Sergey
    Sergey
    19.04.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
      Sergey
      20.04.2020, 07:04
      не в том месте указал переменные nameFilter… Код заработал!
    2. Александр Мальцев
      Александр Мальцев
      20.04.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']);
      }
      
    3. Sergey
      Sergey
      20.04.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
    Sergey
    17.04.2020, 15:44
    Спасибо за совет, Александр! Продолжу свою работу далее!
  3. Александр Мальцев
    Александр Мальцев
    17.04.2020, 14:56
    Здравствуйте!
    При создании сайта желательно логику представления писать в одних php скриптах, а операции с базой данных в других. В этом случае при отправке у вас данные всегда будут уходить в отдельный php скрипт, в котором вы будете обрабатывать данные и перенаправлять результат обратно в скрипт представления. Скрипт представления в результате не будет содержать POST данных в заголовке запроса, и, следовательно у вас не будет этих проблем.
    Работу с базой, если вы не используете никаких готовых php библиотек, желательно производить на pdo.