Почему возникает ошибка в вызове метода? Пытаюсь написать 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);
Ошибка возникает из-за того, что переменная $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; } }
Ошибка возникает из-за того, что переменная $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;
}
}
Теперь ваш код должен работать без ошибок.