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

Здравствуйте, Александр. Подскажите, пожалуйста, как правильно обработать 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

Sergey
Sergey
Здравствуйте, Александр. С помощью других людей, мне удалось написать рабочий код 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();
        }
    }
СПАСИБО ЗА ПОМОЩЬ!
Sergey
Sergey
не в том месте указал переменные nameFilter… Код заработал!
Александр Мальцев
Александр Мальцев
Отлично!
Но, при перезагрузке страницы данные в массиве $_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
Спасибо, Александр, за вашу помощь! Такими вот нюансами и дополняю свое понимание вещей!
код мой выглядит так
<?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
Спасибо за совет, Александр! Продолжу свою работу далее!
Александр Мальцев
Александр Мальцев
Здравствуйте!
При создании сайта желательно логику представления писать в одних php скриптах, а операции с базой данных в других. В этом случае при отправке у вас данные всегда будут уходить в отдельный php скрипт, в котором вы будете обрабатывать данные и перенаправлять результат обратно в скрипт представления. Скрипт представления в результате не будет содержать POST данных в заголовке запроса, и, следовательно у вас не будет этих проблем.
Работу с базой, если вы не используете никаких готовых php библиотек, желательно производить на pdo.