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

Sergey
Sergey
1,1K
6
Содержание:
  1. Комментарии
Здравствуйте, Александр.
Подскажите, пожалуйста, как правильно обработать 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
    2020-04-19 20:23:24
    Здравствуйте, Александр. С помощью других людей, мне удалось написать рабочий код 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
    2020-04-20 07:04:38
    не в том месте указал переменные nameFilter… Код заработал!
  • Александр Мальцев
    Александр Мальцев
    2020-04-20 13:52:00
    Отлично!
    Но, при перезагрузке страницы данные в массиве $_POST останутся.
    Этот момент желательно доработать. Например, выполнив редирект на эту же страницу. Результат нужных операций можно вывести на страницу через сессионные переменные, которые вы уже создали:
    if (isset($_POST['name']) && isset($_POST['author'])) {
      ...
      if (empty($_POST['name']) || empty($_POST['author'])) {
        $_SESSION['error']['empty'] = 'Не заполнено Наименование или Автор';
      } else {
        ...
      }
      header('Location: ' . $_SERVER['REQUEST_URI']);
    }
    
  • Sergey
    Sergey
    2020-04-20 22:47:44
    Спасибо, Александр, за вашу помощь! Такими вот нюансами и дополняю свое понимание вещей!
    код мой выглядит так
    <?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»

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