MySQLi запрос из функции

Рейтинг: 0Ответов: 2Опубликовано: 04.10.2014

Я выполняю функцию

function test($uid) {
$data = array(
    'uid' => $uid,
    'bla' => $bla,
    'bla1' => $bla1,
    'bla2' => $bla2);
db::insert("chat",$data);
}

а он показывает мне такую ошибку

Strict Standards: Non-static method DB::insert() should not be called statically

Fatal error: Using $this when not in object context

ООП MySQLi

class DB {

    protected $db_name = 'test';
    protected $db_user = 'root';
    protected $db_pass = 'root';
    protected $db_host = 'localhost';


    public function connect() {
        $this->db = mysqli_connect($this->db_host, $this->db_user, $this->db_pass,$this->db_name);
        return true;
    }

    public function insert($table, $data) {
        $columns = "";
        $values = "";
        foreach ($data as $column => $value) {
            $columns .= ($columns == "") ? "" : ", ";
            $columns .= '`'.$column.'`';
            $values .= ($values == "") ? "" : ", ";
            $values .= "'".$value."'";
        }
        $sql = "insert into $table ($columns) values ($values)";
        mysqli_query($this->db, $sql) or die(mysql_error());
        return mysql_insert_id();
    }
}

$db = new DB();

$db->connect();

Помимо insert, есть и, например, DELETE

public function delete($table, $where) {
    $sql = "DELETE FROM `$table` WHERE $where";
    mysqli_query($this->db, $sql) or die(mysql_error());
    return true;
}

который находится в этом же классе, но delete работает без ошибок.

Когда присваиваю static к insert, то остаётся только вторая ошибка, но delete при таких же условиях почему-то не нуждается в static.

Ответы

▲ 2Принят

Если вы хотите сделать методы статичными, то не должны использовать в них $this, так как $this ссылается на текущий объект, которого у вас нет.

Добавлю от себя:

  • если уж вы используете ООП, то почему не использовать объектный подход у MySQLi?
  • метод connect можно переделать в конструктор, тогда отпадает необходимость вызывать какой-либо метод для соединения с БД
  • не забывайте обрабатывать данные, у вас возможна SQL-инъекция
  • почитайте про стандарты кодирования (PSR, Zend, PEAR)
▲ 2

Следует понимать, что помимо мелкой частной проблемы со статическим вызовом, в этом классе присутствует множество других проблем, принципиальных и фатальных.

И в первую очередь это полная открытость к SQL инъекциям.

О некоторых других проблемах сказали выше, плюс множество мелких проблем. Например, гомерическая конструкция die(mysql_error());, в которой неверно всё: здесь не должно быть ни mysql_error(), ни die(). или, скажем, бессмысленные переменные класса с параметрами соединения.

И, наконец, здесь принципиально неверный подход к организации подобного класса. Я уже разбирал схожий случай, поэтому не буду повторяться.