Как сделать так, чтобы insert при каждом обновлении браузера данные не дублировались в таблице?
Прослушал видеокурс урока №62.Написал скрипт как и в видео.Все получилось и данные из XML добавились в базу данных phpmyadmin в таблицу с фильмами.Но есть одно "но".Как сделать так,чтобы при каждом обновлении браузера данные не дублировались в таблице,то есть сделать один SQL запрос и больше не делать его при каждом обновлении браузера пока в таблице есть эти данные,как отклонить или отключить этот запрос?
5 ответов
Вставил это код после SQL запроса INSERT(весь код в функции представлен ниже). Выводит ошибку в браузере ERR_TOO_MANY_REDIRECTS. Удалил все cookie, почистил кэш, не помогает, ошибка осталась.
function insert($name_table,$name,$desc,$year,$rating,$poster,$category_id){
$mysqli = new mysqli('locallhost','root','','kinomonster');
if(mysqli_connect_errno()){
print_f('Соединение не установлено');
exit();
}
$mysqli->set_charset('utf8');
$query = "INSERT INTO $name_table
VALUES(null,'$name','$desc','$year','$rating','$poster',Now(),'$category_id')";
if($mysqli->query($query)) {
header("Location: " . $_SERVER['REQUEST_URI']);
exit();
}
}
1. Ошибка, localhost с одной l пишется.
$mysqli = new mysqli('locallhost','root','','kinomonster');
2. Весь код покажите и sql-дамп желательно показать
Ниже представлен код(полностью) и sql-дамп
-- phpMyAdmin SQL Dump
-- version 4.8.1
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1
-- Время создания: Июл 14 2018 г., 10:42
-- Версия сервера: 10.1.33-MariaDB
-- Версия PHP: 7.2.6
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `kinomonster`
--
-- --------------------------------------------------------
--
-- Структура таблицы `categories`
--
CREATE TABLE `categories` (
`id` tinyint(4) NOT NULL,
`category` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `categories`
--
INSERT INTO `categories` (`id`, `category`) VALUES
(1, 'Фильмы'),
(2, 'Сериалы');
-- --------------------------------------------------------
--
-- Структура таблицы `description_film`
--
CREATE TABLE `description_film` (
`id` int(11) NOT NULL,
`description` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `description_film`
--
INSERT INTO `description_film` (`id`, `description`) VALUES
(1, 'Нью-йоркский писатель Эдди, желая преодолеть чёрную полосу в жизни, принимает засекреченный препарат под названием NZT. Таблетка выводит мозг парня на работу в нереальной мощности. Этот творческий наркотик меняет всю жизнь Эдди, за короткий срок он зарабатывает кучу денег, но скоро начинает страдать от зловещих побочных эффектов препарата. А когда пытается найти других NZT-гениев, чтобы понять, как можно справиться с этим пристрастием, он узнает страшную правду…'),
(2, 'Наше время на Земле подошло к концу, команда исследователей берет на себя самую важную миссию в истории человечества; путешествуя за пределами нашей галактики, чтобы узнать есть ли у человечества будущее среди звезд.'),
(3, 'Американская телевизионная криминальная драма, транслировавшаяся с 20 января 2008 года по 29 сентября 2013 года по кабельному каналу AMC. На протяжении пяти сезонов, состоящих из 62 эпизодов, показана история Уолтера Уайта, школьного учителя, у которого диагностировали неоперабельный рак лёгких. Вместе со своим бывшим учеником Джесси Пинкманом он начинает производить и продавать метамфетамин, чтобы обеспечить финансовое будущее своей семьи. Постановка и съёмка сериала велись в городе Альбукерке, штат Нью-Мексико.'),
(4, 'Скотт Лэнг, известный также, как Человек-Муравей уже заслужил право оказаться в команде Мстителей, но желание быть ближе к собственной дочке удерживает его в родном Сан-Франциско — до тех пор, пока доктор Хэнк Пим, создавший когда-то изменяющий размеры своего владельца чудо-костюм, не призывает Скотта присоединиться к новой, опасной миссии. А помогать в противостоянии с коварным врагом Человеку-Муравью будет новая напарница — Оса.');
-- --------------------------------------------------------
--
-- Структура таблицы `movie`
--
CREATE TABLE `movie` (
`id` int(5) NOT NULL,
`name` varchar(255) NOT NULL,
`description` text NOT NULL,
`year` int(4) NOT NULL,
`raiting` float NOT NULL,
`poster` varchar(255) NOT NULL,
`add_date` datetime NOT NULL,
`category_id` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Структура таблицы `serial`
--
CREATE TABLE `serial` (
`id` int(5) NOT NULL,
`name` varchar(255) NOT NULL,
`description` text NOT NULL,
`year` int(4) NOT NULL,
`raiting` float NOT NULL,
`poster` varchar(255) NOT NULL,
`add_date` datetime NOT NULL,
`category_id` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `categories`
--
ALTER TABLE `categories`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `description_film`
--
ALTER TABLE `description_film`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `movie`
--
ALTER TABLE `movie`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `serial`
--
ALTER TABLE `serial`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `categories`
--
ALTER TABLE `categories`
MODIFY `id` tinyint(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT для таблицы `description_film`
--
ALTER TABLE `description_film`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT для таблицы `movie`
--
ALTER TABLE `movie`
MODIFY `id` int(5) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT для таблицы `serial`
--
ALTER TABLE `serial`
MODIFY `id` int(5) NOT NULL AUTO_INCREMENT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Movie</title>
</head>
<body>
<?php
function insert($name_table,$name,$desc,$year,$rating,$poster,$category_id){
$mysqli = new mysqli('localhost','root','','kinomonster');
if(mysqli_connect_errno()){
print_f('Соединение не установлено');
exit();
}
$mysqli->set_charset('utf8');
$query = "INSERT INTO $name_table VALUES(null,'$name','$desc','$year','$rating','$poster',Now(),'$category_id')";
if($mysqli->query($query)) { // Если выполнился query
// Здесь редирект
header("Location: " . $_SERVER['REQUEST_URI']);
exit();
}
}
$xml_movie = simplexml_load_file('xml_files/movies.xml') or die('Error create object');
$xml_serials = simplexml_load_file('xml_files/serials.xml') or die('Error create object');
function dataProcessing($xml,$id_category){
$title = null;
$title_origin = null;
$post = null;
$rating = null;
$year = null;
$name_table = null;
foreach ($xml as $movie_key => $movie) {
$title = $movie->title_russian;
$title_origin = $movie->title_original;
$year = $movie->year;
$name_table = $movie->type;
foreach ($movie->poster->big->attributes() as $poster_key => $poster){
$post = $poster;
}
if($movie->imdb){
$rating = $movie->imdb->attributes()['rating'];
} else {
$rating = null;
}
insert($name_table,$title,$title_origin,$year,$rating,$post,$id_category);
}
}
dataProcessing($xml_movie,1);
dataProcessing($xml_serials,2);
?>
</body>
</html>
Кажется понял в чем причина ошибки ERR_TOO_MANY_REDIRECTS.
Функция insert используется в цикле и вызывается каждый раз. Если поставить redirect в функцию insert, тогда после первого прохождения в цикле срабатывает редирет и так при каждой итерации. Из за этого ошибка ERR_TOO_MANY_REDIRECTS.
Здесь нужна другая проверка. Нужно написать еще одну функцию, которая будет проверять есть ли в таблице movie и serial фильм с названием, который подставляется в цикле и если уже есть - не делать вставку.
Здесь был похожий вопрос:
https://fructcode.com/ru/qa/pochemu-pri-kajdom-obnovlenii-tablisi/
Чтобы каждый раз при перезагрузке (обновлении) страницы браузера, данные не вставлялись в базу данных через POST-запрос в php, нужно добавить при вставке в функцию проверку:
if($mysqli->query($query)) { // Если выполнился query
// Здесь редирект
header("Location: " . $_SERVER['REQUEST_URI']);
exit();
}
Получается, что после успешной вставки в базу данных происходит редирект и выход из функции.