2016-12-15 27 views
-1

Я пытаюсь использовать подготовленный оператор для установки значения-заполнителя с использованием свойства объекта класса, которое передается в качестве аргумента для __конструкция. Однако я шов получаю ошибку, указав необходимость в двух параметрах, когда у меня есть только один параметр для значения держателя места.PHP - PDO Подготовленный statment, «Предупреждение: PDOStatement :: bindParam() ожидает как минимум 2 параметра»

КОД:

<?php include ('connection.inc.php'); 

class Team { 

    // Remember to switch back to private! 
    private $database; 
    public $statement = 'SELECT * FROM members ORDER BY :full_name'; 
    public $order; 
    public $query; 

    private $result;  

    public function __construct($database, $order) { 
     $this->database = $database; 
     $this->order = $order; 
     $this->query = $this->database->prepare($this->statement); 
     $this->query->bindParam(array('full_name', $this->order)); 
     $this->query->execute();     
    } 

    public function getMember() {   
     $this->result = $this->query->fetch(PDO::FETCH_ASSOC); 
     return $this->result;       
    } 
    public function id() { 
     echo $this->result['id']; 
    } 

    public function fullName() { 
     echo $this->result['full_name']; 
    } 
    public function alias() { 
     echo $this->result['alias']; 
    } 
    public function abilities() { 
     echo $this->result['abilities']; 
    }  

}; 

$test = new Team($database, 'full_name'); 

?> 

ОШИБКИ:

Внимание: PDOStatement :: bindParam() ожидает, по меньшей мере, 2, 1 Параметры, приведенные в

Фатальная ошибка: Исключить исключение «PDOException» с сообщением «SQLSTATE [HY093]: Недопустимый номер параметра: нет параметра ERS были связаны»

Решение

Благодаря @Daerik, я изменил мои bindParam() заявления:

$this->query->bindParam(':full_name', $this->order)); 

Это снимало ошибки.

ответ

1

PDOStatement::bindParam (mixed $parameter , mixed &$variable )

$parameter: Идентификатор параметра. Для подготовленного оператора с использованием именованных заполнителей это будет имя параметра формы: name. Для подготовленного заявления с использованием заполнителей вопросительных знаков это будет 1-индексированная позиция параметра.

$variable: Имя переменной PHP для привязки к параметру оператора SQL.

Вы хотите использовать:

$this->query->bindParam(':full_name', $this->order); 

Для получения более подробной информации читайте PDOStatement::bindParam.

+0

Спасибо, что удалены обе ошибки и. Однако при повторении запроса sql с использованием метода 'gettMember()' он швы игнорирует мой оператор 'ORDER BY ': full_name'' и использует столбец' id' для сортировки записей. Это ошибка в моем подготовленном заявлении? –

+1

@ FrederickM.Rogers Вы хотите использовать столбец в инструкции 'ORDER BY'. Присвоение строки будет сравнивать их все с одним и тем же значением и по умолчанию индексом. Подробнее см. Http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html. – Daerik

+0

спасибо, что прочитаете его и внесите необходимые корректировки! –

1

Не используйте bindParam() передать несколько параметров, просто используйте:

$this->query->execute(array(':full_name' => $this->order)); 

Примечание: Вы должны включить : в имени параметра и вам необходимо пройти ':key' => $value пар.

Или только один, не передать массив, bindParam() требует два аргумента:

$this->query->bindParam(':full_name', $this->order); 
+1

Вам не нужно включать ':' при использовании 'PDOStatement :: execute'. – Daerik

+1

@Daerik: никогда не пробовал, и все ручные примеры показывают ': параметр', а также _Ключи от input_parameters должны совпадать с объявленными в SQL._, но это может быть возможно. – AbraCadaver

+1

В операторе SQL требуются колонии, чтобы указать, какие идентификаторы являются заполнителями. Колонки в вызовах 'execute()' являются необязательными. Документация указывает их, но реализация достаточно умна, чтобы понять, что вы имеете в виду, если вы их оставите. – Daerik