Почему возникает ошибка в вызове метода? Пытаюсь написать 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
208 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир