@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);
  }
}

?>

Не могу понять что ему не хватает)
  • Вопрос задан
  • 766 просмотров
Пригласить эксперта
Ответы на вопрос 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 в сторонку, поработать пока с чистым ПДО, набить руку, и только потом пробовать писать свои классы. Ну или по крайней мере воспользоваться готовым.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы