Как сделать так, чтобы insert при каждом обновлении браузера данные не дублировались в таблице?

0

Прослушал видеокурс урока №62.Написал скрипт как и в видео.Все получилось и данные из XML добавились в базу данных phpmyadmin в таблицу с фильмами.Но есть одно "но".Как сделать так,чтобы при каждом обновлении браузера данные не дублировались в таблице,то есть сделать один SQL запрос и больше не делать его при каждом обновлении браузера пока в таблице есть эти данные,как отклонить или отключить этот запрос? 

php
mysql

5 ответов

1

Вставил это код после 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

1. Ошибка, localhost с одной l пишется.

$mysqli = new mysqli('locallhost','root','','kinomonster');

2. Весь код покажите и sql-дамп желательно показать

1

Ниже представлен код(полностью) и 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>
3

Кажется понял в чем причина ошибки ERR_TOO_MANY_REDIRECTS.

Функция insert используется в цикле и вызывается каждый раз. Если поставить redirect в функцию insert, тогда после первого прохождения в цикле срабатывает редирет и так при каждой итерации. Из за этого ошибка ERR_TOO_MANY_REDIRECTS.

Здесь нужна другая проверка. Нужно написать еще одну функцию, которая будет проверять есть ли в таблице movie и serial фильм с названием, который подставляется в цикле и если уже есть - не делать вставку. 

2

Здесь был похожий вопрос:

https://fructcode.com/ru/qa/pochemu-pri-kajdom-obnovlenii-tablisi/

Чтобы каждый раз при перезагрузке (обновлении) страницы браузера, данные не вставлялись в базу данных через POST-запрос в php, нужно добавить при вставке в функцию проверку:

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

Получается, что после успешной вставки в базу данных происходит редирект и выход из функции.

Sign up or Log in to write an answer