Позиционные параметры в SQL начинаются с 1. Вы обрабатываете это путем привязки к позиции $i+1
в цикле $ options.
Но затем вы привязываете последний параметр для cidades_codigo
к позиции count($options)
, который перезаписывает последний набор параметров в цикле $ options.
Вам необходимо привязать последний параметр к позиции count($options)+1
.
FWIW, вам не нужноbindValue()
вообще.Проще передать массив параметров в execute()
.Вот как я написал бы эту функцию:
public function getCompaniesByCity(City $city, $options = null) {
$database = Connection::getConnection();
$sql = "SELECT * FROM `empresas` WHERE `empresas`.`cidades_codigo` = ?"
$params = array();
$params[] = $city->getId();
if ($options) {
$sql .= " AND `prods_empresas`.`produtos_codigo` IN ("
. join(",", array_fill(1, count($options), "?") . ")";
foreach ((array)$options as $option) {
$params[] = $option->getId();
}
}
$statement = $database->prepare($sql);
echo $sql;
$statement->execute($params);
. . .
Также обязательно проверьте возвращаемое значение prepare()
и execute()
, это будет false
, если есть ошибка, и вам нужнопроверьте это и сообщите об ошибке.Или же разрешите PDO выдавать исключения при ошибке.