Мое веб-приложение в настоящее время выполняет простые запросы: простые операции CRUD, подсчет, ...
Несколько месяцев назад кто-то рекомендовал мне написать для этого простую оболочку для PDO (чтобы не писать попытку/ 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);
, так как мне нужно знать тип данных.
Какой лучший способ решить эту проблему?
Спасибо