2016-09-10 80 views
0

我想通過用戶ID信息,以便讓這個添加到模型:如何組織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

您可以放棄第二個查詢,因爲第三個查詢涵蓋了第二個查詢的行爲。不知道你是否需要在這裏存儲過程,你想提取的信息的邏輯必須在某個地方。 –

+1

我看到你來自哪裏,我的舊數據庫驅動程序具有所有這些以及準備好的語句,緩存和大量的實用函數,但它們非常複雜以至於很少使用它。相反,它現在是一個複製粘貼筆記本,我只需要獲取任何當前項目所需的代碼部分。如果你有一個完整的後續設計的巨大項目,這種改進只有意義。在這種情況下,你會知道要實現什麼功能,以及要拋棄什麼。否則,你會得到一個超級複雜的數據庫驅動程序,可以做「一切」,但只能使用它的兩個部分。 – mch

回答

1

我完全MCH和MJH意見一致,但是,只有在情況下,你真的想有一個「BD驅動器」(和建立它自己),我會爲每個查詢使用不同的名稱,非常具體的名稱 ,因爲你需要確切地知道一個函數會返回給你。

所以,如果我是你,我會使用的名字,如getAllUsersgetUserByIdgetAllUsersOnlyPersonalDatagetUserByIdOnlyPersonalDatagetAllUsersOnlyContactData(固定字段和篩選器每個方法)

請注意,在您的示例中,您沒有使用任何$ 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 

這樣,這是真的,你將有很多的根據您的要求的功能,但你可以看到它是非常容易增加新的或修改它們(和你不會因同一功能中的許多不同選項而生氣)。

希望這可以幫助你組織你的數據庫驅動程序!