Я пытаюсь создать функцию запроса базы данных, которая может принимать несколько параметров и повторно использоваться в другом месте, однако попытался использовать несколько методов в Интернете, подобных моему подходу, и они не работают должным образом.
function query($query, $bindings, $type)
Я хочу иметь возможность запускать запросы в пути с помощью этой единственной функции, этот тип функции намного проще с драйвером PDO, поскольку вы можете просто ввести привязку внутри ->execute($binding);
однако в этом случае я вынужден использовать MySQLi, поскольку приложение на самом деле полагается на него, но хочет обновить его, чтобы использовать подготовленные инструкции.
Пример того, как мне нужно использовать эту функцию, чтобы обеспечить ее повторное использование и гибкость:
$engine->query("SELECT * FROM accounts WHERE email = :mail AND id = :id",array(':mail' => $_POST['mail'], ':id' => 2))->fetch_assoc();
Давайте разделим каждую из них. Сначала это оператор, затем массив, который используется для привязки используемых параметров, затем типы параметров и, наконец, тип fetch_ для использования в запросе (ASSOC, OBJECT, ARRAY) и т. Д.
"SELECT * FROM accounts WHERE email = :mail AND id = :id", array(':mail' => $_POST['mail'], ':id' => 2), "si" ->fetch_assoc();
хотя реализовать именованные параметры было бы довольно сложной задачей, остальное вполне выполнимо.
Вариант PHP> = 5.6, реализующий оператор splat:
function query($query, $params = NULL, $types = NULL) { if (!$params) { return $mysqli->query($query); } $statement = $this->mysqli->prepare($select); $types = $types ?: str_repeat('s', count($params)); $statement->bind_param($types, ...$params); $statement->execute(); return $statement->get_result(); }
используется так
$sql = "SELECT * FROM accounts WHERE email = ? AND id = ?"; $row = $engine->query($sql, [$_POST['mail'], 2])->fetch_assoc();
или, если вы хотите явно задать типы
$row = $engine->query($sql, [$_POST['mail'], 2], "si")->fetch_assoc();