Правильно ли написан подготавливаемый запрос на PHP?
Здравствуйте.
Помогите разобраться с корректностью записи кода:
- Весь ли код ООП?
- Там ли
htmlspecialchars
и он ли должен быть для экранирования? - Синтаксические ошибки в написанном
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
Спасибо, Александр за такой обширный ответ. Вопросов еще больше стало - но, в первую очередь, буду разбираться с синтаксисом ООП.
Прошу прощения, относительно
htmlspecialchars
, то строка выглядит следующим образом:Сам синтаксис вероятно неправильный функции
prepare
! Возможно, еще по этому поводу пару замечаний?!Спсаибо!
Так
Например: Если, например, вставляемые данные должны быть числом, то так: Кроме этого, после вставки данных (в данном случае послеhtmlspecialchars
использовать нельзя. Если вы вставляете в какое-то поле текст и вам необходимо заменить в нём все специальные символы на HTML сущности, то эту функцию необходимо использовать именно для него.foreach
) запросы рекомендуется явно закрыть:Здравствуйте!
mysqli
– это стандартный класс. В переменной$mysqli
у вас находится объект - экземпляр классаmysqli
.connect_errno
– это свойство, аset_charset
- это метод классаmysqli
. Чтобы у вас код был ООП вам нужно создавать собственные классы.htmlspecialchars
? В представленном коде его нет. Любые данные перед тем, как попасть в базу должны приводиться к типу, валидироваться или, например очищаться.