Как правильно вернуть результат одной базы данных?

0

Все, что я хочу сделать, это получить результат имени из этой функции, но он чувствует, что это слишком много кода, чтобы сделать это на основе идентификатора сеанса.

//query_functions.php

function find_name_by_id($id) {
    global $db;

    $sql = "SELECT firstname FROM admins ";
    $sql .= "WHERE id='" . db_escape($db, $id) . "' ";
    $sql .= "LIMIT 1";
    $result = mysqli_query($db, $sql);
    confirm_result_set($result);
    $name = mysqli_fetch_assoc($result); // find first
    mysqli_free_result($result);
    return $name; // returns an assoc. array
  }

// admin.php

id = $_SESSION['admin_id'];
$name = find_name_by_id($id);

// what is the shortest way to get this $name result?
  • 3
    Вы используете очень подробный, низкоуровневый API базы данных. Было бы еще больше строк кода, если бы вы делали это безопасно, используя подготовленные операторы. Подумайте об использовании PDO или API более высокого уровня, такого как Doctrine или что-то в этом роде.
  • 2
    : «Похоже, что вы пишете свой собственный ORM. Рассматривали ли вы использовать тот, который уже написан, протестирован и широко поддерживается как RedBeanPHP , Doctrine , Propel или Eloquent
Показать ещё 2 комментария
Теги:

1 ответ

0

Чтобы сделать это правильно, используя подготовленные операторы, вам действительно нужно больше кода:

function find_name_by_id($db, $id) {
    $stmt = $db->prepare("SELECT firstname FROM admins WHERE id=?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $stmt->free_result();
    return $row[0];
}

Я не уверен, что такое confirm_result_set, поэтому я не confirm_result_set его.

Давайте представим, что $db был объектом PDO:

function find_name_by_id($db, $id) {
    $stmt = $db->prepare("SELECT firstname FROM admins WHERE id=?");
    $stmt->execute([$id]);
    return $stmt->fetchColumn();
}

Гораздо меньше кода. А для API более высокого уровня это будет абстрагировано в одну строку кода.

В действительности, во всех случаях вы хотели бы выполнить некоторую проверку ошибок, учесть отсутствие возвращаемых записей и т.д. Также следует избегать глобальных переменных, они очень плохой формы. Поместите свой код в класс или просто используйте внедрение зависимостей, как я сделал.

  • 0
    Можете ли вы дать более полное представление о том, почему глобальные переменные имеют плохую форму?
  • 1
    Загромождение глобального пространства имен, повышение сложности кода за счет отсутствия информации о происхождении переменной, потенциальные проблемы в области видимости, если вы забудете глобальные объявления. На самом деле вы должны использовать правильно подобранный класс для хранения вашей функциональности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню