2013-05-18 47 views
0

你好,我有方法讓我們說,如果行存在檢查:查詢的內置函數添加更多參數?

/** 
    * Method rowExists 
    * 
    * Checks if row exists with given parameters. 
    * 
    * @param name The name of the value in a column. 
    * @param column The name of the given column. 
    * @param table The name of the given table. 
    **/ 

    private function rowExists($name, $column, $table) 
    { 
     $this->user = $this->pdo->prepare("SELECT * FROM ".$table." WHERE ".$column." = :name"); 
     $this->user->execute(array(":name" => $name)); 

     if ($this->user->rowCount() > 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

有了這個,我可以檢查是否行存在

用法:

if ($this->rowExistsAnd($this->get['user_id'], $generatedCode, 'user_id', 'generated_code', 'account_verifications') === true) { 

現在我所要求的,這個方法只支持1個參數來檢查

如果我想檢查WHERE兩列怎麼辦?

例子:

當前查詢它:

SELECT * FROM table WHERE column1 = value1 

我想:

SELECT * FROM table WHERE column1 = value1 AND column2 = value2 

我想用1種方法這樣做,不創造另一個r方法添加參數。 我該怎麼做?

編輯:

private function rowDoesExist($params) 
    { 
     if (count($params) < 4) 
     { 
      $this->user = $this->pdo->prepare("SELECT * FROM ".$params[0]." WHERE ".$params[1]." = :name"); 
      $execute = array(":name" => $params[2]);     
     } 
     else 
     { 
      $this->user = $this->pdo->prepare("SELECT * FROM ".$params[0]." WHERE ".$params[1]." = :name AND ".$params[2]." = :name2"); 
      $execute = array(":name" => $params[3], ":name2" => $params[4]); 
     } 
     $this->user->execute($execute));   
    } 

用法:

$this->rowDoesExist(array('users', 'user_name', $username); 
+1

你可以使用數組,而不是單一的字符串。一個包含列的名稱和另一個 - 值。 – Havelock

回答

2

我'd建議像這樣重寫你的功能(未測試):

private function countRows($table, array $criteria = null) 
{ 
    $query = "SELECT COUNT(*) AS c FROM $table"; 
    if ($criteria) { 
     $query .= ' WHERE ' . implode(' AND ', array_map(function($column) { 
      return "$column = ?"; 
     }, array_keys($criteria)); 
    } 
    $stmt = $this->pdo->prepare($query) 
     or die('Failed to prepare query ' . $query); 
    $stmt->execute(array_values($criteria)); 
    return $stmt->fetchColumn(); 
} 

首先,它有點沒用SELECT *,如果你想要的僅僅是行數。其次,將過濾條件(對於WHERE子句)用作關聯數組更有意義:鍵將對應於列名和值,以及它們的期望值。如果你想更具體的功能,將永遠只有一個單一的標準工作,去:

private function countRowsBySingleCriteria($table, $column, $value) 
{ 
    return $this->countRows($table, array($column => $value)); 
} 

對我來說更有意義的是檢查中countRows參數類型。

+0

請檢查我的編輯,是不是 – user2391753

+0

問題是,這種功能的使用很快就會失去控制。如果你最終希望使用3個標準呢?四?五?當關聯數組感覺自然適合時,用數值數組來實現這個目的是沒有意義的。 – raina77ow

+0

哦,我明白了。我該如何使用該功能?例如, – user2391753

0

你可以使用數組作爲additon parametr,或使用func_num_args()func_get_arg()func_get_args() functuins用於獲取函數額外參數

0

有3個信息考慮:

  • 列名(如user_idgenerated_code
  • 運算符(如=
  • 值與比較(如$this->get['user_id']$generatedCode

我想你應該使用一個數組來實現這一點。

private function rowExists($table, array $wheres = array()) 
{ 
    $query = "SELECT COUNT(*) FROM {$table} WHERE 1 = 1"; 
    $params = array(); 

    foreach ($wheres as $where) 
    { 
     $query .= " AND {$where[0]} {$where[1]} ? " 
     $params[] = $where[2]; 
    } 

    $this->user = $this->pdo->prepare($query); 
    $this->user->execute($params); 

    if ($this->user->fetchcolumn() > 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

用例:

if ($this->rowExistsAnd('account_verifications', array(
    array('user_id', '=', $this->get['user_id']), 
    array('generated_code', '=', $generatedCode) 
)) === true) { 
0

試試這個...

private function rowExists($name1,$name1, $column1,$column2 $table) 
    { 
    $cond=" where 1=1"; 
    if($column1) 
    $cond.=" and ". $column1."=:name1"; 
    if($column2) 
    $cond.=" and ". $column2."=:name2" 
    $query = "SELECT * FROM ".$table.$cond; 
    $this->user = $this->pdo->prepare($query); 
    $this->user->execute(array(":name1" => $name1,":name2" => $name2)); 

    if ($this->user->rowCount() > 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

「我想用1種方法做到這一點,不用創建另一種方法來添加參數」 – user2391753

+0

我還沒有創建另一種方法,只是擴展了您的... –

+0

如果我只想使用一個參數,該怎麼辦?邏輯。 – user2391753