Почему не работает метод Delete?
подскажите пожалуйста и за чего метод Delete не удаляет пользователя( Для примера показал и метод get - он работает )
index.php
#$products = Database::getInstance()->get('products', ['name', '=', 'Macbook PRO']);
Database::getInstance()->delete('products', ['name', '=', 'Danu']);
Database.php
<?php
class Database
{
private static $instance = null;
private $pdo, $query, $error = false, $results, $count;
private function __construct()
{
try{
$this->pdo = new PDO("mysql:host=localhost;dbname=university;", 'mysql', 'mysql');
}
catch (PDOException $e){
echo $e->getMessage();
}
}
public function getInstance(){
if(!isset(self::$instance)){
self::$instance = new Database();
}
return self::$instance;
}
public function query($sql, $params=[]){
$this->error = false;
$this->query = $this->pdo->prepare($sql);
if(count($params)){
$i = 1;
foreach($params as $param){
$this->query->bindValue($i, $param);
$i++;
}
}
if(!$this->query->execute()){
$this->error = true;
}
else{
$this->results = $this->query->fetchAll(PDO::FETCH_OBJ);
$this->count = $this->query->rowCount();
}
return $this;
}
public function get($table, $where=[]){
return $this->action('SELECT', $table, $where);
}
public function delete($table, $where=[]){
return $this->action('DELETE', $table, $where);
}
public function action($action, $table, $where){
if(count($where) === 3){
$operators = ['=', '>', '<', '<=', '>='];
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)){
$sql = "{$action} * FROM {$table} WHERE {$field} {$operator} ?";
if( !$this->query($sql, [$value])->showError() ){
return $this;
}
}
}
}
public function showError()
{
return $this->error;
}
public function showResult(){
return $this->results;
}
public function count(){
return $this->count;
}
}
Ответы (2 шт):
А почему должен? Выведите полученный SQL-запрос в $sql.
DELETE * FROM -- дальше уже и не важно
Нет такого синтаксиса в стандарте и я не знаю СУБД, где бы такое реализовали расширение стандарта.
Основная ваша проблема в том, что у вас нет обработки ошибок. Поставьте PDO::ATTR_ERRMODE в адекватный PDO::ERRMODE_EXCEPTION, тогда PDO будет для вас генерировать хорошо заметные exception.
В целом здесь три проблемы - локальная, глобальная и концептуальная.
Тов. Мелкий правильно указывает на первые две, а я обращу внимание на третью.
Смысла в функции Delete - ноль целых, ноль десятых.
Не составляет ни малейшей проблемы написать
Database::getInstance()->query('DELETE FROM products WHERE name = ?', ['Danu']);
А подводных камней с этим ручным колупанием в запросах - вагон и маленькая тележка.
Ну и в целом у класса много косяков, в частности, хранение результата внутри объекта, что приведет к ошибкам нарушения целостности, когда запрос уже другой, а результат всё тот же. Или приватность свойства $pdo которое не даст воспользоваться свойствами и методами этого класса, например таким банальным как lastInsertId()
Я бы от ввсего класса оставил только метод query, в таком виде
public function query($sql, $params=[]){
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
и писал просто
$products = DB::getInstance()->query('SELECT * FROM products WHERE name = ?', ['Macbook PRO'])->fetchAll();