В настоящее время мое веб-приложение выполняет простые запросы: простые операции CRUD, подсчет,...
Несколько месяцев назад кто-то рекомендовал меня здесь написать простую оболочку PDO для этого (чтобы избежать написания try/catch, prepare(), execute() и т.д. каждый раз, когда запрос должен быть выполнен). Этот примерный метод был показан (я внес некоторые изменения, чтобы использовать его в своем собственном проекте):
public function execute() {
$args = func_get_args();
$query = array_shift($args);
$result = false;
try {
$res = $this->pdo->prepare($query);
$result = $res->execute($args);
} catch (PDOException $e) { echo $e->getMessage(); }
return $result;
}
Поскольку мне нужно выполнить больше операций (выполнение запросов, извлечение 1 записи, извлечение нескольких записей, подсчет результатов), я создал метод для всех из них:
public function getMultipleRecords() {
$args = func_get_args();
$query = array_shift($args);
$records = array();
try {
$res = $this->pdo->prepare($query);
$res->execute($args);
$records = $res->fetchAll();
} catch (PDOException $e) { echo $e->getMessage(); }
return $records;
}
public function getSingleRecord() {
$args = func_get_args();
$query = array_shift($args);
$record = array();
try {
$res = $this->pdo->prepare($query);
$res->execute($args);
$record = $res->fetch();
} catch (PDOException $e) { echo $e->getMessage(); }
return $record;
}
public function execute() {
$args = func_get_args();
$query = array_shift($args);
$result = false;
try {
$res = $this->pdo->prepare($query);
$result = $res->execute($args);
} catch (PDOException $e) { echo $e->getMessage(); }
return $result;
}
public function count() {
$args = func_get_args();
$query = array_shift($args);
$result = -1;
try {
$res = $this->pdo->prepare($query);
$res->execute($args);
$result = $res->fetchColumn();
} catch(PDOException $e) { echo $e->getMessage(); }
return $result;
}
Как вы видите, большая часть кода одинаков. Для каждого метода различаются только 2 строки кода: инициализация $result (я всегда хочу вернуть значение, даже если запрос завершается с ошибкой) и выборки. Вместо того, чтобы использовать 4 метода, я мог бы написать только один из них и передать дополнительный параметр с типом действия. Таким образом, я мог бы использовать кучу операторов if/else оператора switch. Однако, я думаю, код может стать беспорядочным. Это хороший способ решить эту проблему? Если нет, то что было бы хорошим решением?
Вторая проблема, с которой я сталкиваюсь (именно поэтому я сейчас работаю над этим классом), заключается в том, что я хочу использовать подготовленные операторы с помощью инструкции LIMIT SQL. Однако это невозможно сделать:
$res = $pdo->prepare("SELECT * FROM table LIMIT ?");
$res->execute(array($int));
По какой-то причине переменная будет указываться (и, следовательно, запрос не будет выполнен), как описано здесь: https://bugs.php.net/bug.php?id=40740
Решение похоже использует bindValue() и использует тип данных int в качестве параметра: http://www.php.net/manual/de/pdostatement.bindvalue.php
Я мог бы переписать метод для поддержки этого, но мне также нужно будет использовать дополнительный параметр. Я не могу просто использовать $db->execute($sql, $variable1, $variable2);
больше, поскольку мне нужно знать тип данных.
Какой лучший способ решить эту проблему?
Спасибо