2016-09-10 2 views
0

Я хочу, чтобы получить информацию по идентификатору пользователя, поэтому давайте добавим это к модели:Как организовать функции выбора SQL?

public function getById ($id) 
{ 
    $sql = 'SELECT * FROM users'; 
    return ActualDbHander::run($sql); 
} 

позже, я хочу, чтобы получить только некоторые поля:

public function getById ($id, $fields = '*') 
{ 
    $sql = 'SELECT '.$fields.' FROM users'; 
    return ActualDbHander::run($sql); 
} 

другая идея, позволяет добавить заказ:

public function getById ($id, $fields = '*', $orderBy = '') 
{ 
    $sql = 'SELECT '.$fields.' FROM users'; 
    if ($orderBy != '') 
    { 
     $sql.= ' ORDER BY '.$orderBy; 
    } 
    return ActualDbHander::run($sql); 
} 

и я вижу, что это становится грязным и грязным. Что делать, если я хочу добавить JOIN-s? Что делать, если я хочу добавить подробные WHERE-s? Это когда рождаются «слишком общие» методы.

+1

Затем приходит помощь Хранимые процедуры. Вы можете очистить php-код с помощью хранимых процедур. –

+1

Вы можете отказаться от второго запроса, потому что третий покрывает поведение второй. Не уверен, что вам нужно сохранить procs здесь, логика для информации, которую вы хотите извлечь, должна быть где-то. –

+1

Я вижу, откуда вы родом, мой старый драйвер db имеет все это плюс подготовленные заявления, кеширование и множество функций полезности, но получил настолько сложный, что я редко его использую. Вместо этого теперь это копировальный блок, в котором я просто беру необходимые для любого проекта компоненты кода. Это уточнение имеет смысл, если у вас есть огромный проект с тщательным последующим дизайном. В этом случае вы будете знать, какую функциональность реализовать, и что не учитывать. В противном случае вы получите суперкомплексный драйвер DB, который может «все», но только когда-либо использовать 2 части из него. – mch

ответ

1

Я полностью согласен с комментариями mch и Mjh, но только в том случае, если вы действительно хотите иметь «драйвер BD» (и самостоятельно его создать), я бы использовал разные имена для каждого запроса, очень специфичные имена , потому что вам нужно точно знать, какая функция вернется к вам.

Так что, если бы я тебя, я хотел бы использовать такие имена, как getAllUsers, getUserById, getAllUsersOnlyPersonalData, getUserByIdOnlyPersonalData, getAllUsersOnlyContactData и так далее (с фиксированными полями и фильтров для каждого метода).

Обратите внимание, что в ваших примерах вы не используете переменную $ id, поэтому вы всегда получаете список пользователей.

Что касается способа выполнения запросов, есть много способов сделать это. Лично я предпочитаю MySQLi Объектно-ориентированные подготовленные заявления, потому что это безопасно, просто и в настоящее время очень распространено, поэтому я буду использовать его только для иллюстрации примеров.

Ваши функции будет что-то вроде этого:

<?php 
class DBDriver{ 

    function openConnection(){ 

    // If you don't always use same credentials, pass them by params 
    $servername = "localhost"; 
    $username = "username"; 
    $password = "password"; 
    $database = "database"; 

    // Create connection 
    $conn = new mysqli($servername, $username, $password, $database); 

    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 

    // Return conection object 
    return $conn; 
    } 

    function closeConnection($conn){ 
    $conn->close(); 
    } 

    function getAllUsers(){ // We don't need ids here 

    $conn = $this->openConnection(); 

    // Array of arrays to store the results 
    // You can use any other method you want to return them 
    $resultsArray = []; 

    $sqlQuery = "SELECT * FROM users"; 

    // In this case it's not neccesary to use prepared statements because we aren't binding any param but we'll use it to unify the method 

    if ($stmt = $conn->prepare($sqlQuery)) { 

     // Execute query 
     $stmt->execute(); 

     // Bind result variables (I don't know your actuall column names) 
     $stmt->bind_result($id, $name, $email, $phone, $birthdate); 


     // Fetch values 
     while ($stmt->fetch()) { 
     $resultsArray[] = [$id, $name, $email, $phone, $birthdate]; 
     } 

     // Close statement 
     $stmt->close(); 
     } 

    $this->closeConnection($conn); 

    // If no results, it returns an empty array 
    return $resultsArray; 
    } 

    function getUserByIdOnlyContactData ($userId){ 

    $conn = $this->openConnection(); 

    // Array to store the results (only one row in this case) 
    $resultsArray = []; 

    $sqlQuery = "SELECT name, email, phone FROM users WHERE id = ?"; 

    if ($stmt = $conn->prepare($sqlQuery)) { 

     // Bind parameter $userId to "?" marker in $sqlQuery 
     $stmt->bind_param("i", $userId); 

     $stmt->execute(); 

     $stmt->bind_result($name, $email, $phone); 

     // If id found 
     if ($stmt->fetch()) { 
     $resultsArray = [$name, $email, $phone]; 
     } 

     // Close statement 
     $stmt->close(); 
     } 

    $this->closeConnection($conn); 

    return $resultsArray; 
    } 

    function getAllUserOnlyBirthdayDataOrderByBirthday(){ 

    $conn = $this->openConnection(); 

    $resultsArray = []; 

    $sqlQuery = "SELECT id, name, birthdate FROM users ORDER BY birthdate"; 

    if ($stmt = $conn->prepare($sqlQuery)) { 

     $stmt->execute(); 

     $stmt->bind_result($id, $name, $birthdate); 

     while ($stmt->fetch()) { 
     $resultsArray[] = [$id, $name, $birthdate]; 
     } 

     // Close statement 
     $stmt->close(); 
     } 

    $this->closeConnection($conn); 

    return $resultsArray; 
    } 

} // Class end 

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

Надеюсь, это поможет вам организовать драйвер базы данных!

Смежные вопросы