Ошибка вставки данных в базу данных, подготовленный запрос.

Anatol

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

Код (Text):
  1.     try {
  2.         $dbh = new PDO(«mysql:host=$database_server;dbname=$dbase», $database_user, $database_password);
  3.         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4.         $sql = «INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)»;
  5.         $params = [
  6.             ‘:username’ => $username,
  7.             ‘:password’ => $password
  8.         ];
  9.         $dbh = $pdo->prepare($sql);
  10.         $dbh->execute($params);
  11.         echo «Успешно создана новая запись»;
  12.     } catch (PDOException $e) {
  13.         echo $e->getMessage();
  14.         die();
  15.     }
  16.     $dbh = null;

Текст ошибки: Warning: Undefined variable $pdo inC:OpenServerdomainslocalhostsignup.phpon line9

Fatal error: Uncaught Error: Call to a member function prepare() on null in C:OpenServerNewdomainslocalhostaleansrucoretemplatessignup.php:9 Stack trace: #0 {main} thrown inC:OpenServerdomainslocalhostsignup.phpon line9

При написании 9-й строки таким образом:

Код (Text):
  1. $dbh = prepare($sql)->execute($params);

ошибка не появляется, всё отрабатывает нормально, но не знаю правильно ли так писать с точки зрения подготовленного запроса pdo. В мануалах везде пишут $dbh = $pdo->prepare($sql); Вообще не понимаю зачем нужна эта переменная прокладка, в моем случае $pdo. Прошу объяснить зачем она нужна.

 

MouseZver

зачем лесть в программирование, есть не читать даже ошибки ?

 

Anatol

Хороший дельный ответ. Спасибо.
У меня тоже к вам появился вопрос. Зачем читать и писать по русски если делаешь в простых словах такие нелепые ошибки?

 

mkramer

@Anatol А вы действительно читали мануал? Понимаете, что такое класс, что такое объект класса? У объекта какого класса вызывается prepare, а у какого — execute? В коде понимания того, что происходит, вообще не наблюдается. Вот опишите, для начала, что делает строчка 2? Ну а потом и все остальные

 

MouseZver

Это тебе и ответ, основанное на моей ошибке. IQ подними.

 

Anatol

Вторая строчка создает соединение с базой данных. Для чего нужны prepare, execute тоже читал.
К чему ваши вопросы по поводу моего понимания? Это форум для новичков или для «не задавай глупых вопросов»? Удивляют люди которые отправляют к чтению мануалов. Тогда зачем форум нужен?
— Добавлено —

По твоему ответу видно твой очень высокий IQ. Ты в курсе, что не знание php не относится к уровню IQ?

 

mkramer

Форум нужен чтобы помогать разрешать какие-то особенные ситуации и указывать направление решения проблемы, большей частью. Не само решение.

Вторая строчка не создаёт соединение с базой данных. Вторая строчка создаёт экземпляр класса PDO, предоставляющего методы для работы с базами данных, и записывает ссылку на него в переменную $dbh.

Вот теперь вопрос №2: а метод prepare что делает и что возвращает?

 

MouseZver

Очень
— Добавлено —
Когда поймешь, напишешь.

 

Anatol

Я так и думал)
— Добавлено —

Что?
— Добавлено —

Хорошо, поищу ответ на свой вопрос в другом месте. Всем спасибо за помощь. А то тут у всех высокий IQ, но почему то никто не может ответить на мой простой вопрос. Столько писанины и ни одного ответа по существу моего вопроса.
— Добавлено —
Отвечайте на особенные ситуации.
Просто скажите, что можно написать так например:

Код (Text):
  1.         $pdo = $dbh->prepare($sql);
  2.         $pdo->execute($params);

потому-что…

 

Artur_hopf

Просто люди негодуют ошибка же написана, строка указана. У тебя тупо нет такой переменной. $pdo.
Например А = 1; В = 2. Сколько будет С+В?
Будет ошибка Warning: Undefined variable С
— Добавлено —
Откуда ты такую переменную взял $pdo никто не знает, и как тебе помочь? Если ошибка итак написана в Warning.

 

Anatol

Отвечайте на

Да я перевел эту ошибку. Но у меня все равно остался вопрос как её исправить, поэтому и задал вопрос. Почему тогда так работает?:

Код (Text):
  1.         $pdo = $dbh->prepare($sql);
  2.         $pdo->execute($params);

или так:

Код (Text):
  1. $dbh = prepare($sql)->execute($params);

?
Переменной $dbh тоже до этой строчки не было, откуда она взялась?

Код (Text):
  1. $dbh = new PDO(«mysql:host=$database_server;dbname=$dbase», $database_user, $database_password);

Как правильно должна выглядеть эта конструкция?
— Добавлено —
Я где-то должен был объявить $pdo заранее?
— Добавлено —
Вот часть источников которые я смотрел:
https://www.php.net/manual/ru/pdo.prepared-statements.php
https://schoolsw3.com/php/php_mysql_insert.php

Ещё раз хочу уточнить, что ошибка мне понятна, в какой она строке тоже понятно. Не понятно, как правильно сделать.
— Добавлено —
Вот код примера 4 с сайта https://www.php.net/manual/ru/pdo.prepared-statements.php

Код (Text):
  1. <?php
  2. $stmt = $dbh->prepare(«CALL sp_returns_string(?)»);
  3. $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
  4.  
  5. // вызов хранимой процедуры
  6. $stmt->execute();
  7.  
  8. print «процедура вернула $return_valuen»;
  9. ?>

Откуда тут взялась переменная $dbh? У меня практически та же конструкция

 

Artur_hopf

Вот так она и взялась, как и вашем примере $dbh = new PDO();
А откуда у вас взялось $pdo->prepare($sql)?

 

mkramer

Документация по библиотеке написана для людей, которые сначала прочитали мануал по языку, и понимают, что, чтоб использовать какой-то объект, его сначала надо где-то создать. Поэтому авторы сочли возможным опустить очевидный момент создания и сосредоточиться на использовании метода prepare для работы с подготовленными выражениями
— Добавлено —

Вот поэтому и надо понимать, что не соединение создаётся, а экземпляр (или объект) класса PDO. И что это в классе PDO есть метод prepare, который, в свою очередь, возвращает объект класса PDOStatement, и последний уже содержит метод execute для выполнения подготовленного запроса

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *