@Kamaz73

Почему возникает ошибка в вызове метода?

Пытаюсь написать querybuilder. Возникает ошибка при выполнении запроса.

Fatal error: Call to a member function quote() on a non-object in

файл MyQueryBuilder.php

class 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.php

<?php 
require_once('MyQueryBuilder.php');


$mysql = new MyQueryBuilder('localhost','asd','test','test');
$mysql->devMode = 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';
  • Вопрос задан
  • 216 просмотров
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
public function sqlProt($str)
        {
            global $pdo;            
            return $pdo->quote($str);
        }

Глобал? Серьезно? А где вы его создали в глобальном пространстве? (подсказка - dbh)
Зачем quote(), если есть prepared statements?
Мой совет - посмотрите готовые библиотеки, для начала простенькие. Хотя бы поймете что и как делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы