@kr_ilya

PDO добавление записи в БД. Что делать?

Пытаюсь добавить запись в бд, но получаю ошибку:
Fatal error:  Uncaught Error: Call to a member function prepare() on null in E:\OSPanel\domains\test.ru\classes\_new.db.php:30
Stack trace:
#0 E:\OSPanel\domains\test.ru\api\ajax.php(19): db->prep('INSERT INTO db_...')
#1 {main}
  thrown in <b>E:\OSPanel\domains\test.ru\classes\_new.db.php</b> on line 30

$db->prep("INSERT INTO db_users_a (user, email, pass, referer, referer_id, date_reg, ip) 
VALUES (?, ?, ?, ?, ?, ?, ?)");
$arr = array('$login', '$email', '$pass', 'admin', '1', '$time', INET_ATON('$ip'));
$db->prep($arr);

Класс $db:
<?PHP
class db{
	private $config;
	private $arr;
  public function __construct(Config $config)
  {
  	$this->config = $config;
  	$this->connect();
  }

  private function connect()
  {
  	$host = $this->config->host;
  	$dbname = $this->config->base;
 	$charset = $this->config->charset;
 	$user = $this->config->user;
 	$pass = $this->config->pass;
  	$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
  	$opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_LAZY,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
  	$pdo = new PDO($dsn, $user, $pass, $opt);
  	return $this;
  }

  public function prep($sql, $arr=array())
  {
  	$stmt = $this->pdo->prepare($sql);
  	return $stmt->execute($arr);
  }
}

?>

Не могу понять что ему не хватает)
  • Вопрос задан
  • 764 просмотра
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Call to a member function prepare() on null

Почему вы вызываете метод класса подсовывая null вместо объекта?
А почему там может быть null? Например потому, что вы нигде не инициализируете $this->pdo, к тому же у вас выключены E_NOTICE в error_reporting, чем вы запретили интерпретатору показать подсказку..

Ну и пример использования вашего класса не подходит к фактическому поведению класса.
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL
$sql = "INSERT INTO db_users_a (user, email, pass, referer, referer_id, date_reg, ip) 
VALUES (?, ?, ?, ?, ?, ?, ?)";
$arr = array('$login', '$email', '$pass', 'admin', '1', '$time', INET_ATON('$ip'));
$db->prep($sql, $arr);
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Не могу понять что ему не хватает)

Наверное, вызова connect() перед началом использованием класса?

Кроме того, странно, что РНР не ругается вот на эту строчку
$arr = array('$login', '$email', '$pass', 'admin', '1', '$time', INET_ATON('$ip'));

Я уж не говорю о том, что в ДБ пойдут значения буквально $login, $email - а не их содержимое, но в РНР нет функции INET_ATON. Это функция mysql, и писать ее поэтому надо в запросе.

Вообще, с таким уровнем владения РНР (писать переменные в кавычках, да еще и в одинарных) я бы подождал пока с написанием собственных классов. Учитывая, что метод prep() и так бесполезен для большинства запросов, а connect() бесполезен полностью (его код должен быть в конструкторе), я бы настоятельно прекомендовал отложить класс DB в сторонку, поработать пока с чистым ПДО, набить руку, и только потом пробовать писать свои классы. Ну или по крайней мере воспользоваться готовым.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 10:42
150000 руб./за проект
25 апр. 2024, в 10:41
2000 руб./за проект
25 апр. 2024, в 10:25
2000 руб./за проект