2016-02-27 53 views
0

我瞭解預處理語句是如何工作的(在函數之外)。但真正讓我困惑的是,準備好的語句如何在類文件的函數內部工作。在PHP數據庫連接類中編寫語句

例如,如果一個準備好的聲明的用法是:

$dbc->select('SELECT * FROM users WHERE firstname = ?'); 

但是,我不知道我是多麼困惑自己關於用戶如何將使用$ dbc->選擇();函數在類文件中,創建一個查詢,然後使用預處理語句執行查詢。

難道是一些簡單的讓用戶編寫查詢,然後給變量作爲另一參數,如:

$dbc->select('SELECT * FROM users WHERE firstname = ?', 'Bob'); 

或將我作爲用戶,以填補獨立變量,然後將其內置到一個準備好的聲明中,如:

$dbc->select($columns, $table, $variables = array()); 

或者會讓事情變得複雜嗎?我也可以有另一個選擇特定行的函數。

我覺得選項1是更好的選擇,但它似乎不是用戶友好的?還是我太累了,我正在推翻完整的sh **?無論如何,我希望這一切都合情合理,我對任何錯誤表示歉意 - 我在打字時幾乎要睡着了!也許是時候稱它爲一個夜晚。

感謝, 基隆

+0

whaaaaaaaaaaaa? –

+0

你的目標是讓它更高級,比如查詢生成器或者只是標準語句執行和返回的包裝? – jardis

+0

好吧,剛剛醒來,我可以更好地解釋它(因爲我不再累)。我想要做的是創建一個數據庫類,它將具有常見的mysqli函數,如select,insert,delete,update等。因此,他們將使用我自己製作的函數來查詢數據庫。我遇到的問題是我對如何在用戶提供查詢時如何使用預處理語句感到困惑(我怎麼知道列,表等)我在我的文章中給出了一些關於我想到的方法的例子,但我不確定它們是否是最佳選擇。 – Sutton

回答

0

正如我提到的,所有的這些都是可行的:

實例之一:

class qEngine 
    { 
     private $con, 
       $bind, 
       $query; 

     public function __construct($con) 
      { 
       $this->con = $con; 
      } 
     public function addParams($array) 
      { 
       $i = 0; 
       foreach($array as $key => $value) { 
        $bKey = ":{$i}"; 
        $this->bind[$bKey] = $value; 
        $i++; 
       } 
       return $this; 
      } 
     public function query($sql) 
      { 
       if(!empty($this->bind)) { 
        $this->query = $this->con->prepare($sql); 
        $this->query->execute($this->bind); 
       } 
       else { 
        $this->query = $this->con->query($sql); 
       } 
       return $this; 
      } 
     public function getResults() 
      { 
       while($result = $this->query->fetch(PDO::FETCH_ASSOC)) { 
        $row[] = $result; 
       } 
       return (!empty($row))? $row : 0; 
      } 
    } 

你舉的例子:

$dbc->select('SELECT * FROM users WHERE firstname = ?'); 

必須是這樣的:

// $con would be a PDO connection 
$qEngine = new qEngine($con); 
$results = $qEngine  ->addParams(array('Bob')) 
         ->query('select * from users where firstname = :0') 
         ->getResults(); 
print_r($results); 

實例二:

class qEngine 
    { 
     private $con, 
       $bind, 
       $query; 

     public function __construct($con) 
      { 
       $this->con = $con; 
      } 
     private function addParams($array = false) 
      { 
       if(empty($array)) 
        return false; 

       $i = 0; 
       foreach($array as $key => $value) { 
        $bKey = ":{$i}"; 
        $this->bind[$bKey] = $value; 
        $i++; 
       } 
      } 
     public function query($sql,$bind = false) 
      { 
       $this->addParams($bind); 

       if(!empty($this->bind)) { 
        $this->query = $this->con->prepare($sql); 
        $this->query->execute($this->bind); 
       } 
       else { 
        $this->query = $this->con->query($sql); 
       } 
       return $this; 
      } 
     public function getResults() 
      { 
       while($result = $this->query->fetch(PDO::FETCH_ASSOC)) { 
        $row[] = $result; 
       } 
       return (!empty($row))? $row : 0; 
      } 
    } 

你舉的例子:

$dbc->select("SELECT * FROM users WHERE firstname = ?",'Bob'); 

必須是這樣的:

// $con would be a PDO connection 
$qEngine = new qEngine($con); 
$results = $qEngine ->query('select * from users where firstname = :0',array('Bob')) 
          ->getResults(); 

print_r($results); 

實例三必須更復雜,因爲您必須自動構建sql。我有一個我使用的類似,但它很複雜。

無論如何,這大概是我該怎麼做的。一個注意,我沒有廣泛使用這些,但他們應該工作,只要你有一個適當的pdo連接注入構造。

+0

啊,完美!這使得現在更加清晰。所以我可以爲普通的sql函數的不同特定功能做到這一點。謝謝! – Sutton