2015-09-16 4 views
1

У меня проблема с использованием подготовленных заявлений в моем проекте. Я создал класс с именем БД и в этом классе я функция называется «где» и в таком виде он не работает:Подготовленные заявления в правильном направлении?

public function where($table_name, $key, $value) { 
    try { 
     $stmt = $this->connection->prepare("SELECT * FROM $table_name WHERE :key = :value ORDER BY id DESC"); 
     $stmt->execute(array(":key" => $key, ":value" => $value)); 
     return ($stmt->rowCount() > 0) ? $stmt : false; 
    } catch(Exception $e) { 
     return false; 
    } 
} 

, но когда я изменить функцию, чтобы просто работать с одним местозаполнителем он работает ! Почему это происходит?

public function where($table_name, $key, $value) { 
    try { 
     $stmt = $this->connection->prepare("SELECT * FROM $table_name WHERE $key = :value ORDER BY id DESC"); 
     $stmt->execute(array(":value" => $value)); 
     return ($stmt->rowCount() > 0) ? $stmt : false; 
    } catch(Exception $e) { 
     return false; 
    } 
} 
+3

Я не думаю, что вы можете использовать заполнители для имен полей в ПДО, только для параметров значения. См. Принятый ответ здесь: http://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-name-as-parameter – jeoj

+0

Спасибо, мне это очень помогло. –

ответ

1

У вас не может быть полей в подготовленных операциях. Однако вы можете вставить его с помощью PDO::quote:

$stmt = $this->connection->prepare("SELECT * FROM $table_name WHERE " . $this->connection->quote($key) . " = :value ORDER BY id DESC"); 
+0

Большое вам спасибо. –

+0

Я попробовал ваше предложение, но оно не работает. –

+0

Возможно, PDO :: quote не подходит для имен полей. В качестве первого шага попробуйте без вызова quote(), как в '$ stmt = $ this-> connection-> prepare (" SELECT * FROM $ table_name WHERE ". $ Key." =: Значение ORDER BY id DESC ") ; ' –

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