0
0

Курс php/mysql. Урок 8.3. При выполнении скрипта (файл взят из прикреплённых к уроку), происходит дублирование всех записей, то есть вместо 25 фильмов вбивается 50, но друг за другом. Что делать? Может, в phpmyadmin проблема?

<?php 

	function insert($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 movie VALUES(null, '$name', '$desc', '$year', '$rating', '$poster', Now(), '$category_id')";

		$result = false;

		if($mysqli->query($query)) {
			$result = true;
		}

		return $result;
	}

	$xml = simplexml_load_file("xml_files/movies.xml") or die("Error: Cannot create object");

	//echo count($xml);

	$title = null;
	$title_orign = null;
	$post = null;
	$rating = null;
	$year = null;

	foreach ($xml as $movie_key => $movie) {
		$title = $movie->title_russian;
		$title_orign = $movie->title_original;
		$year = $movie->year;


		foreach ($movie->poster->big->attributes() as $poster_key => $poster) {
			$post = $poster;
		}

		if($movie->imdb) {
			$rating = $movie->imdb->attributes()['rating'];
		} else {
			$rating = null;
		}

		insert($title, $title_orign, $year, $rating, $post, 1);

	}

	echo "<pre>";
	print_r($xml);
	echo "</pre>";

?>


Никита Кушнарёв
5 years ago






при каждом запуске добавляется еще +25 записей, ощищать таблицу после запуска скрипта

очисти таблицу и запусти 1 раз и проверь - должно 25 записей быть

Кирилл Лавров
5 years ago

только что прогнал повторно (очистил movie, запустил скрипт, обновил movie), но вставка опять дублируется(

Никита Кушнарёв
5 years ago

а 2-й раз если запустить - сколько еще добавляется записей?

Кирилл Лавров
5 years ago

это немного странно, но опять +50 записей

Никита Кушнарёв
5 years ago

после вызова функции insert в цикле 

insert($title, $title_orign, $year, $rating, $post, 1);

поставь лог, чтобы значения выводились на экран  echo...

Кирилл Лавров
5 years ago

на экран выводится 25 строк, но в таблице +50 строк

звучит как бред

Никита Кушнарёв
5 years ago

ну тогда я сдаюсь :)

Кирилл Лавров
5 years ago

не понимаю, в чём проблема, но работает оно так (эксперименты помогли):

- при обновлении страницы со скриптом он дублирует записи

- если же обращаться к странице, прописав его адрес (kinomonster.com) , при этом используя другую страницу (открыв тот же яндекс), то выведется всё корректно

надеюсь, что вы сможете объяснить эту аномалию)

Никита Кушнарёв
5 years ago

Ты сам не понимаешь, что перезагружаешь страницу 2 раза, или же не знаешь что в базе данных много страниц, и ты мог заполнить 1-ую и уже начать 2-ую. А на кнопку "Показать всё" ты не нажимал. И НЕ МОЖЕТ добавляться по 50 стр. а не 25стр. Ты сам не знаешь что сам делашеь ошибку. ИЛИ ЖЕ в другом файле написано тоже самое, и скрипт выполняется сразу в 2-ух файлах, вот тебе и 50.

Даниил Кузмичёв
5 years ago

че вы спорите? это же ежу понятно что он дублировать будет записи,  пишите функцию на удаление дубликатов  после того как функция insert добавит данные.

мое решение, но он чисто в учебных целях. Да и кстати наименования таблиц я у  меня другие имейте в виду.

foreach ($xml as $movie_key => $movie) {
$title = $movie->title_russian;
$title_orign = $movie->title_original;
$year = $movie->year;

foreach ($movie->poster->big->attributes() as $poster_key => $poster)
{
$post = $poster;
}
if ($movie->imdb) {
$rating = $movie->imdb->attributes()['rating'];
}else {
$rating = null;
}

$check = $mysqli->query("SELECT `name` FROM `films` WHERE `name` = '". $title ."'");

if(count(mysqli_fetch_assoc($check)) == 0) {
insert($title, $title_orign, $year, $rating, $post, 1);
}

}

Сергей Жиглинский
3 years ago

10 ответов