Подготовленный оператор PDO возвращает пустой набор, Query работает нормально

0

У меня есть функция PDO, которая выполняет запрос Mysql. Он корректно работает для всех запросов.

public function run($sql, array $params = NULL) {

  $statement = $this->pdo->prepare($sql);

  if (!is_null($params)) {

    foreach ($params as $key) {

      $statement->bindParam(":n", $key);

    }

  }

  $statement->execute();

  return $statement->fetchAll(PDO::FETCH_CLASS);

}

Однако, когда я запускаю запрос ниже, он возвращает пустой набор

$variation = $query->run(
  "SELECT url, title, sale_price
  FROM product
  where category_id = :n
  and url != :n",
  [ $data[0]->category_id, $filePathArray[1] ]
);

Его работы, когда я запускаю запрос вручную в mysql-клиенте.

Я пробовал тип, набрасывающий идентификатор категории, но не радость:

(int)$data[0]->category_id 

(поскольку он передавал строку, а не Integer)

Вот параметр var_dump из $ params из функции run

array(2) { 
  [0]=> int(1) 
  [1]=> string(21) "light-resistance-band" 
}
  • 2
    Вы не можете повторно использовать заполнители в одном запросе.
  • 3
    Вы используете именованные заполнители с именем :n используемым дважды, и вы связываете два разных значения с :n . Как это должно работать?
Показать ещё 1 комментарий
Теги:
pdo

2 ответа

0
Лучший ответ

Вам нужно добавить другой именованный держатель места для привязки соответствующих значений (не идентичных)

$variation = $query->run(
  "SELECT url, title, sale_price
  FROM product
  where category_id = :n
  and url != :n1",
  [ ':n'=>$data[0]->category_id, ':n1'=>$filePathArray[1] ]
);
  • 0
    имеет смысл, я сделаю это
  • 0
    @BennyThadikaran Вы можете обратиться ко мне по ссылке. Если у меня будет время, я отвечу или кто-то наверняка ответит
0

Вы можете скомпоновать свою функцию, проверяя тип $key и bindParam следующим образом:

 public function run($sql, array $params = NULL) {

  $statement = $this->pdo->prepare($sql);

  if (!is_null($params)) {

    foreach ($params as $key=>$value) {
        $statement->bindParam(":".$key, $value);
    }

  }

  $statement->execute();

  return $statement->fetchAll(PDO::FETCH_CLASS);

}
  • 0
    Спасибо Goms, но это ограничивает параметры до 2. Пожалуйста, смотрите мои изменения. PS - Я не голосовал против вашего ответа.
  • 0
    Я отредактировал ответ ... вы можете проверить ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню