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

Serebos

Новичок
Ошибки надо исправить
Привет. Некоторые ошибки мне удалось исправить. В чистом виде код работает и добавляет необходимую запись в БД.
PHP:
$host = 'localhost';
$db   = 'kinomonster';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");

     $stmt->execute([
    'name'               => 'Walking to Paris',
    'desc'    => 'The feature film, directed by Peter Greenaway, tells the story of the twenty-seven-year-old Romanian sculptor Constantin Brancusi.',
    'year'               => 2020,
    'rating'               => 8.1,
    'poster'               => 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBx',
    'category_id'          => 1,
    ]);

        echo "New records created successfully";
При дальнейшем изменении кода, с целью подгрузить данные с xml - код начал выводить ошибку со строки execute.
PHP:
$host = 'localhost';
$db   = 'kinomonster';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");

$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->execute([
    'name'               => $title,
    'desc'    => $description,
    'year'               => $year,
    'rating'               => $rating,
    'poster'               => $post,
    ]);

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


        echo "New records created successfully";

}
Здесь прошу помочь разобраться!

СПАСИБО.
 

nllabs

Новичок
Ты забыл самое главное - текст ошибки.
И забыл, что гораздо быстрее ее найти самому :)

Кроме того:
(Текст под тегом code почему-то не форматируется, поэтому пишу без этого тега)

$host = 'localhost';
$db = 'kinomonster';

$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";



$dsn = "mysql:host=localhost;dbname=kinomonster;charset=utf8mb4";
 

nllabs

Новичок
Ну раз уже задал вопрос - то тогда покажи и текст ошибки :)
 

Serebos

Новичок
PHP:
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in C:\xampp\htdocs\kinomonster\index.php:54 Stack trace: #0 C:\xampp\htdocs\kinomonster\index.php(54): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\kinomonster\index.php on line 54
 

Serebos

Новичок
на эту часть ругается
PHP:
 $stmt->execute([
    'name'               => $title,
    'desc'    => $description,
    'year'               => $year,
    'rating'               => $rating,
    'poster'               => $post,
    ]);

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

Serebos

Новичок
Ты забыл самое главное - текст ошибки.
И забыл, что гораздо быстрее ее найти самому :)

Кроме того:
(Текст под тегом code почему-то не форматируется, поэтому пишу без этого тега)

$host = 'localhost';
$db = 'kinomonster';

$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";



$dsn = "mysql:host=localhost;dbname=kinomonster;charset=utf8mb4";
это исправил. В такой способ приду к стандартным шаблонам документов - и не буду отвлекаться на рекомендации с различных источников.
 

nllabs

Новичок
PHP:
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in C:\xampp\htdocs\kinomonster\index.php:54 Stack trace: #0 C:\xampp\htdocs\kinomonster\index.php(54): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\kinomonster\index.php on line 54
Invalid parameter number = Неправильное количество параметров.

Вот твой запрос:
PHP:
$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");
При вызове execute все имена параметров соответствуют именам плейсхолдеров ?
 

Serebos

Новичок
если брать во внимание эту строку, то нет.
PHP:
$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");
меня сбивает с толку подключение файла xml и строки
PHP:
$title = null;
$description = null;
$post = null;
$rating = null;
$year = null;
(взято с урока - и принято мною как аксиома, для решения идентичной задачи).

Значения содержатся в хml - поэтому и подключил переменные оттуда.

И сейчас не понятно мне при появлении новых условий, как отобразить execute, чтобы значение подтянуло с xml!

Объясни пожалуйста, если тебе причина понятна, не отсылая к литературе.
 

nllabs

Новичок
если брать во внимание эту строку, то нет.
PHP:
$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");
Тут открытым текстом сказано: "Invalid parameter number".
Количество параметров не соответствует количеству плейсхолдеров.
Как тогда должен выполниться запрос ?

Добавлено позже:
Вопрос: должно ли количество параметров при выполнении подготовленного запроса соответствовать количеству плейсхолдеров в самом запросе ?
 
Последнее редактирование:

Serebos

Новичок
Тут открытым текстом сказано: "Invalid parameter number".
Количество параметров не соответствует количеству плейсхолдеров.
Как тогда должен выполниться запрос ?

Добавлено позже:
Вопрос: должно ли количество параметров при выполнении подготовленного запроса соответствовать количеству плейсхолдеров в самом запросе ?
Конечно должно. в верхней строке - 8 плейсхолдеров (вместе с null и now).
 

Фанат

oncle terrible
Команда форума
null и now - не плейсхолдеры.
плейсхолдеры - это те у которых точечки спереди.

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

У тебя УЖЕ есть пример работающего запроса. ЗАЧЕМ тебе какие-то другие примеры?

Ну неужели так сложно подставить в execute свои значения из ХМЛ? Зачем тебе для этого копировать какой-то еще пример непонятно откуда?

Вот у тебя рабочий код:
Код:
$stmt = $pdo->prepare("INSERT INTO movie (id, name, description, year, rating, poster, add_date, category_id) VALUES (null, :name, :desc, :year, :rating, :poster, Now(), :category_id)");

     $stmt->execute([
    'name'               => 'Walking to Paris',
    'desc'    => 'The feature film, directed by Peter Greenaway, tells the story of the twenty-seven-year-old Romanian sculptor Constantin Brancusi.',
    'year'               => 2020,
    'rating'               => 8.1,
    'poster'               => 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBx',
    'category_id'          => 1,
    ]);
ПОЧЕМУ ТЫ ЕГО НЕ ИСПОЛЬЗУЕШЬ?
 

Serebos

Новичок
такое я уже пробовал
PHP:
     $stmt->execute([
    'name'               => $title,
    'desc'    => $description,
    'year'               => $year,
    'rating'               => $rating,
    'poster'               => $post,
    'category_id'          => 1,
    ]);
PHP:
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'rating' cannot be null in C:\xampp\htdocs\kinomonster\index.php:52 Stack trace: #0 C:\xampp\htdocs\kinomonster\index.php(52): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\kinomonster\index.php on line 52
 

Serebos

Новичок
null тянет отсюда, наверное
PHP:
$title = null;
$description = null;
$post = null;
$rating = null;
$year = null;
 

Фанат

oncle terrible
Команда форума
Не оттуда, а ниже.
Хотя бы свой собственный код читай.

Ели нельзя нулл, значит присваивай другое значение.
 

Serebos

Новичок
PHP:
else {
         $rating = null;
     }
автор курса добавил это условие, чтобы в описаниях фильмов, где отсутствует значение рейтинга не копировалось значение с верхней позиции.
\
удалил условие вообще

PHP:
 if($movie->imdb) {
         $rating = $movie->imdb->attributes()['rating'];
     }
PHP:
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'rating' cannot be null in C:\xampp\htdocs\kinomonster\index.php:51 Stack trace: #0 C:\xampp\htdocs\kinomonster\index.php(51): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\kinomonster\index.php on line 51
 

Фанат

oncle terrible
Команда форума
Господи.
После того как ты его удалил, оно теперь берется из предыдущего null.
Ну блин
Я понимаю. все начинали.
но нельзя же настолько все время совешать какие-то бессмысленные телодвижения в надежде, что какое-то сработает.

Ну ты тогда хотя бы читай что тебе пишут.
Я говорю: присваивай другое значение.
Ты: удалил условие вообще

Такое ощущение что ты разговариваешь не с нами, а с голосами в своей голове
 

nllabs

Новичок
Там еще и курс, который он смотрит, добавляет проблем.
 
Сверху