• PHP

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

Здравствуйте.

Помогите разобраться с корректностью записи кода:

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

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;

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>';
Спасибо!

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

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

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

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

СПАСИБО!

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