Почему возникает ошибка в вызове метода? Пытаюсь написать querybuilder. Возникает ошибка при выполнении запроса.
Fatal error: Call to a member function quote() on a non-object in
файл MyQueryBuilder.phpclass MyQueryBuilder
{
protected $link;
protected $dbh;
public $host = 'localhost';
public $db = 'asd';
public $user = 'test';
public $pass = 'test';
public $charset = 'utf8';
public $dsn = 'mysql:host=$host;dbname=$db;charset=$charset';

public function __construct($host,$db_name,$user,$pass)
{

$this -> dbh = new PDO("mysql:host=$host;dbname=$db_name",$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
public $parms = array();
/* Режим разработчика */
public $devMode = 0;
/* Защита от SQL инъекций */
public function sqlProt($str)
{
global $pdo;
return $pdo->quote($str);
}
/* Добавление поля и защищенного значения */
public function add($name, $value)
{
$this->parms[$name] = $this->sqlProt($value);

}


/* INSERT запрос */
public function insert($tableName)
{
global $pdo;
$queryCol = '';
$queryVal = '';
foreach ($this->parms as $key => $val) {
if ($queryCol == '') {
$queryCol = "`$key`";
} else {
$queryCol = $queryCol . ',' . "`$key`";
}
if ($queryVal == '') {
$queryVal = $val;
} else {
$queryVal = $queryVal . "," . $val;
}
}

$query = "INSERT INTO $tableName ($queryCol) VALUES ($queryVal)";
$res = $pdo->query($query);

if (!$res) {
$this->parms = array(); //Reset params
return false;
} else {
$ret = $pdo->insert_id;
if ($ret == 0) $ret = true;
$this->parms = array(); //Reset params
return $ret;
}
}
файл insert.phpdevMode = 1; //Режим разработчика, в случае ошибок вернет вам вид вашего SQL запроса
$mysql->add('name','Victor'); //Добавляем значение защищенное от SQL инъекций
$mysql->add('address','Samara'); //Добавляем значение защищенное от SQL инъекций
$res = $mysql->insert('users'); //Вставляем наши подготовленные данные в таблицу USERS
if ($res) echo 'Insert is complete'; else echo 'Insert is not complete';

21 Авг 2019 в 07:01
175 +1
0
Ответы
1

Ошибка возникает из-за того, что переменная $pdo не является объектом в вашем классе MyQueryBuilder или в файле insert.php. В конструкторе класса MyQueryBuilder вы создаете объект PDO и сохраняете его в переменную $dbh, но в методах sqlProt и insert вы используете глобальную переменную $pdo без объявления ее как глобальной.

Чтобы исправить ошибку, вам нужно удалить строки с глобальной переменной $pdo и заменить ее на уже существующий объект $dbh внутри класса MyQueryBuilder:

Измените метод sqlProt():

public function sqlProt($str)
{
return $this->dbh->quote($str);
}

Измените метод insert():

public function insert($tableName)
{
$queryCol = '';
$queryVal = '';
foreach ($this->parms as $key => $val) {
// код остается без изменений
}
$query = "INSERT INTO $tableName ($queryCol) VALUES ($queryVal)";
$res = $this->dbh->query($query);
if (!$res) {
$this->parms = array(); //Reset params
return false;
} else {
$ret = $this->dbh->insert_id;
if ($ret == 0) $ret = true;
$this->parms = array(); //Reset params
return $ret;
}
}

Теперь ваш код должен работать без ошибок.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 722 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир