@hooligan377

Подготовленные запросы, как сократить код?

Есть у меня от 2 до 10 подготовленных запросов, соответственно это много кода и трата ресурсов. Как можно сократить размеры кода*?

Сократить на примере этого:

$stmt = $base->prepare("SELECT * FROM `forum_topic` WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$topic = $stmt->get_result()->fetch_assoc();

$stmt = $base->prepare("SELECT * FROM `profile` WHERE id = ?");
$stmt->bind_param("i", $topic['uid']);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();
  • Вопрос задан
  • 219 просмотров
Пригласить эксперта
Ответы на вопрос 3
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Тут только обёртку пилить. Могу поделится как я реализовал. Я так понял это mysqli
Я сделал как в PDO через execute проброс параметров
Ответ написан
php666
@php666
PHP-макака
Моя обертка - Database
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Можно написать простую обертку для mysqli, которая будет брать на себя рутинные операции, если надо выполнить только один запрос.
$sql = "SELECT * FROM `forum_topic` WHERE id = ?";
$topic = mysqli($base, $sql, [$id])->get_result()->fetch_assoc();
$sql = "SELECT * FROM `profile` WHERE id = ?";
$profile = mysqli($base, $sql, [$topic['uid']])->get_result()->fetch_assoc();

Плюс, как водится, второй запрос здесь не нужен вообще, поскольку такие вещи делаются джойнами
$sql = "SELECT * FROM forum_topic, t profile p WHERE p.id=t.uid AND t.id = ?";
$topic = mysqli($base, $sql, [$id])->get_result()->fetch_assoc();

И в топике будет вся информация из профиля.

Если не нравится постоянно писать ->get_result()->fetch_assoc(), то можно эти операции записать в еще одну функцию
function mysqli_assoc($mysqli, $sql, $params) {
    return mysqli($mysqli, $sql, $params)->get_result()->fetch_assoc();
}

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

Только непонятно, почему в вопросе стоит тег PDO.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы