Подготавливаемый запрос PHP

Sergey
Sergey
407
4
Содержание:
  1. Комментарии
Здравствуйте, Александр.

Помогите разобраться с корректностью записи кода.
1. весь ли код ООП?
2. там ли htmlspecialchars и он ли должен быть для экранирования?
3. синтаксические ошибки в написанном prepare()?

function insert($name, $desc, $year, $rating, $poster, $category_id) {
	$mysqli = new mysqli('localhost', 'root', '', 'kinomonster');
	if ($mysqli->connect_errno) {
		printf('Connect failed: ' . $mysqli->connect_error);
	    exit();
	}

/*	instead 5,6,7 strings
if ($mysqli->connect_errno) {
    die('Connect failed: ' . $mysqli->connect_errno);
}*/

	$mysqli->set_charset('utf8');

	/*$query = "INSERT INTO movie VALUES(null, '$name', '$desc', '$year', '$rating', '$poster', Now(), '$category_id')";*/
	 $stmt = $mysqli->prepare("INSERT INTO movie (null, name, desc, year, rating, poster, Now(), category_id) VALUES (?, ?, ?, ?, ?, ?)");
	$result = false;
	if($mysqli->query($query)) {
		$result  = true;
	}
	return $result;
}

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

/*echo count($xml);*/

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

<cut/> foreach ($xml as $movie_key => $movie) {
 	$title = $movie->title_russian;
 	$description = $movie->description;
 	$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;
 	}

    $stmt -> bind_param('ssidsi', null, '$name', '$desc', '$year', '$rating', '$poster', Now(), '$category_id');
	$stmt -> execute();

   insert($title, $description, $year, $rating, $post, 1);
 }

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


СПАСИБО!

Комментарии:

  1. Sergey
    27 апреля 2020, 16:17
    Спасибо, Александр за такой обширный ответ. Вопросов еще больше стало — но, в первую очередь, буду разбираться с синтаксисом ООП.

    Прошу прощения, относительно htmlspecialchars, то строка выглядит следующим образом

    $stmt = htmlspecialchars($mysqli->prepare('INSERT INTO movie (null, name, desc, year, rating, poster, Now(), category_id) VALUES (?,?,?,?,?,?)'));
    Сам синтаксис вероятно неправильный функции prepare! Возможно, еще по этому поводу пару замечаний?!

    СПАСИБО!

    1. Александр Мальцев
      28 апреля 2020, 13:18
      Так htmlspecialchars использовать нельзя. Если вы вставляете в какое-то поле текст и вам необходимо заменить в нём все специальные символы на HTML сущности, то эту функцию необходимо использовать именно для него.
      Например:
      $description = htmlspecialchars($movie->description);
      Если, например, вставляемые данные должны быть числом, то так:
      $year = (int) $movie->year;
      Кроме этого, после вставки данных (в данном случае после foreach) запросы рекомендуется явно закрыть:
      $stmt->close();
      1. Sergey
        28 апреля 2020, 14:50
        Спасибо, вам Александр, за уточнения! Приму ко вниманию все замечания и рекомендации!
    2. Александр Мальцев
      27 апреля 2020, 15:50
      Здравствуйте!
      1. То, что вы написали состоит из одной функции и кода. При этом вы не создавали собственные классы. Под ООП понимают создание классов и их использование в коде.
      mysqli — это стандартный класс. В переменной $mysqli у вас находится объект — экзмеляр класса mysqli.
      connect_errno — это свойство, а set_charset — это метод класса mysqli.
      Чтобы у вас код был ООП вам нужно создавать собственные классы.
      2. Не знаю где у вас htmlspecialchars? В представленном коде его нет. Любые данные перед тем, как попасть в базу должны приводиться к типу, валидироваться или, например очищаться.
      3. Для подсветки ошибок в коде поставьте среду, которая это может делать. Например, phpStorm.
      Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.