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

Serebos

Новичок
Всем привет. Помогите, пожалуйста, разобраться в корректности кода.
1. там ли htmlspecialchars и он ли должен быть для экранирования?
2. синтаксические ошибки в написанном 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 = htmlspecialchars($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");


$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>";

СПАСИБО!
 

nllabs

Новичок
1. Оформите код как полагается (тег code).
2. Какой тип у возвращаемого результата
Код:
mysqli::prepare
?
 

Serebos

Новичок
nllabs,
1. что конкретно подразумевается "оформить код как полагается"? в плане визуального отображения?! При создании темы я не увидел рекомендаций относительно комментирования кода, на панели инструментов редактора тоже не вижу кнопок для определения языка программирования.... Если в плане синтаксиса - так я поэтому сюда и обратился! Уточните, пожалуйста, первую рекомендацию.
2.
$name - целое число
$desc - строка
$year - целое число
$rating - число с плавающей точкой
$poster - строка
$category_id - целое число

Спасибо, уточните, пожалуйста, если нужно дополнить это сообщение.
 

nllabs

Новичок
1. В визуальном редакторе имеется кнопка для вставки кода. Вот так:
PHP:
echo "<pre>";
print_r ($xml);
echo "</pre>";
2 Нет. Это был намек, тест на сообразительность. У функции
Код:
mysqli::prepare
есть возвращаемое значение. Какого оно типа ?
Оно одно, а не несколько. И тип у него: mysqli_stmt. А что на вход принимает htmlspecialchars ? Он принимает строку.
Как это будет работать ? Что вообще делает htmlspecialchars ?
Не вставляйте код, который не понимаете, в свой проект.
Если так учит видеокурс - в топку его.
 

Serebos

Новичок
Спасибо за уточнение! О классах мне уже говорили, но я толком еще не разобрался! По вашей ссылке буду сейчас читать. Многие вещи мне еще предстоит понять, ибо сейчас еще отсутствует представление о их сути.
Изначально код я написал и он работал!

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/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;
    }
 
   insert($title, $description, $year, $rating, $post, 1);
 }
 
echo "<pre>";
print_r ($xml);
echo "</pre>";
Возникали лишь проблемы при добавлении в БД текста, где были спец символы (апостроф, например). Мне посоветовали экранирование добавить и для безопасности функцию prepare применить. Я пол дня писал код и теперь ищу советов и помощи сделать его рабочим!
 

nllabs

Новичок
Я бы сделал подключение к базе данных в начале скрипта один раз.
А при выполнении запроса - передавал бы его как параметр.
 

nllabs

Новичок
Там, в скрипте, присутствует SQL-инъекция. Нужно подготавливать (prepare) запрос. А потом "биндить" (bind) переменные. И только после этого выполнять запрос.

Я сам предпочитаю работать с БД через PDO. В документации по PDO и книге Котерова описано как работать с PDO.
 

Serebos

Новичок
Спасибо. А в этой книге тоже детально описано и ООП? Везде мне говорят, чтобы использовал один тип: процедурный или ООП! Процедурный отходит в прошлое! Что лучше ООП или PDO не знаю, но склоняюсь к ООП!
Относительно вашей рекомендации, не могу ничего толком найти по запросу "как передать в виде параметра подключение к базе PHP".
 

Serebos

Новичок
Там, в скрипте, присутствует SQL-инъекция. Нужно подготавливать (prepare) запрос. А потом "биндить" (bind) переменные. И только после этого выполнять запрос.

Я сам предпочитаю работать с БД через PDO. В документации по PDO и книге Котерова описано как работать с PDO.
вероятно разобью на блоки свой код и буду уточнять относительно каждого блока!
 

Serebos

Новичок
книга Котерова Дмитрия PHP7 качается, сейчас взгляну на нее. www.php.net/manual - очень сухие примеры, вроде читаешь, понимаешь, а когда нужно перенести на свой код - не получается (дополнительные условия и специфика случая создают совсем другую конструкцию, нежели в примерах)!
 

AnrDaemon

Продвинутый новичок

Примеры в документации вовсе не обязаны демонстрировать вершины программистского гения. Они должны иллюстрировать конкретный функционал. И вовсе не факт, что этот функционал вообще рекомендован к ежедневному применению.
 

Фанат

oncle terrible
Команда форума
Вот развели поучения с учебниками.
Куда быстрее было код написать

Функция здесь мешает использовать подготовленные выражения по назначению.
Не говоря о том что в ней по-хорошему должно быть всего две строчки
Поэтому лучше от нее отказаться
Код соединения с БД берем здесь

PHP:
$stmt = $mysqli->prepare("INSERT INTO movie VALUES(null, ?,?,?,?,?, Now(),?)";
$stmt->bind_param("sssss", $name, $desc, $year, $rating, $poster,  $category_id);
foreach ($xml as $movie_key => $movie) {
...
    $stmt->execute();
}
количество (и порядок) знаков вопроса, а также количество букв "s" должно соответсовать количеству переменных.
 
Последнее редактирование:

nllabs

Новичок
А в этой книге тоже детально описано и ООП?
Настоящим ООП я и сам не владею на 100% :) Пока над этим не нужно париться, просто нужно знать, что примеры из 90% книг - чушь, не имеющая отношения к ООП.
Настоящее ООП - это SOLID, KISS, YAGNI, шаблоны проектирования. Рекомендую, при наличии свободного времени, почитать эту книгу и посмотреть блог Дмитрия Елисеева.

> ООП или PDO
Это несравнимые вещи. PDO использует ООП.

> не могу ничего толком найти по запросу "как передать в виде параметра подключение к базе PHP"
как передают параметры при вызове процедуры ? Нужно передать на один параметр больше.
 

Serebos

Новичок
Функция здесь мешает использовать подготовленные выражения по назначению.
Не говоря о том что в ней по-хорошему должно быть всего две строчки
Поэтому лучше от нее отказаться
Код соединения с БД берем здесь

PHP:
$stmt = $mysqli->prepare("INSERT INTO movie VALUES(null, ?,?,?,?,?, Now(),?)";
$stmt->bind_param("sssss", $name, $desc, $year, $rating, $poster,  $category_id);
foreach ($xml as $movie_key => $movie) {
...
    $stmt->execute();
}
количество (и порядок) знаков вопроса, а также количество букв "s" должно соответсововать количеству переменных.
Спасибо, Фанат. За шаблон брал базовый код с интерактивного курса освоения PHP! Поэтому, отталкиваюсь от него. Хотя, вероятных способов достижения одной цели может быть много! Сейчас, хотя бы один способ освоить! Если не prepare, возможно mysqli_real_escape_string????
 
Последнее редактирование модератором:

Serebos

Новичок
Настоящим ООП я и сам не владею на 100% :) Пока над этим не нужно париться, просто нужно знать, что примеры из 90% книг - чушь, не имеющая отношения к ООП.
Настоящее ООП - это SOLID, KISS, YAGNI, шаблоны проектирования. Рекомендую, при наличии свободного времени, почитать эту книгу и посмотреть блог Дмитрия Елисеева.

> ООП или PDO
Это несравнимые вещи. PDO использует ООП.

> не могу ничего толком найти по запросу "как передать в виде параметра подключение к базе PHP"
как передают параметры при вызове процедуры ? Нужно передать на один параметр больше.
Спасибо, nllabs. Почитаю еще теорию и попробую код переписать на PDO и снова на форум с вопросами!
 
Сверху