2013-05-18 2 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 параметр для проверки

Что делать, если я хочу проверить ГДЕ две колонки?

Пример:

Текущий запрос делает:

SELECT * FROM table WHERE column1 = value1 

Я хочу:

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

Я хочу сделать это с 1 методом, без создание r с добавлением параметров. Как это сделать?

Edit:

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

I Рекомендуем переписать вашу функцию следующим образом (не проверено):

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 *, если то, что вы хотите только ROWCOUNT.

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

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

Для меня это имеет смысл, что проверка на тип аргументов в countRows.

+0

Пожалуйста, проверьте мои изменения, правильно ли это – user2391753

+0

Проблема в том, что использование такого рода функций быстро выходит из-под контроля. Что, если вы в конце концов захотите использовать его с 3 критериями? 4? 5? Для этой цели мало смысла использовать числовые массивы, когда ассоциативный массив чувствует себя естественным образом. – raina77ow

+0

О, я вижу. И как я могу использовать эту функцию? – user2391753

0

Вы можете использовать массив как Вдобавок Parametr, или с помощью func_num_args(), func_get_arg() и func_get_args() functuins для получения функция лишних Params

0

Существует 3 информацию для рассмотрения:

  • имен столбцов (например, user_id, generated_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

«Я хочу сделать это с помощью одного метода, не создавая другого метода с добавлением параметров» – user2391753

+0

Я еще не создал другой метод, просто расширивший ваш ... –

+0

Что делать, если я хочу использовать только параметр ONE? Логика. – user2391753

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