Я чувствую, что я теряю рассудок на этом. У меня три простых таблицы. Таблица пользователей, таблица ролей и таблица role_user, которая объединяет пользователя и роли во многих отношениях.
У меня есть следующий код для ролей для пользователя:
$query = $pdo->prepare('select roles.* from roles inner join role_user on roles.id = role_user.role_id where role_user.user_id = ?'); $query->execute(array('1')); die(var_dump($query->fetchAll()));
Это возвращает пустой массив. Нет результатов. Однако, если я изменю код на это, я получу роли пользователя:
$query = $pdo->prepare('select roles.* from roles inner join role_user on roles.id = role_user.role_id where role_user.user_id = 1'); $query->execute(); die(var_dump($query->fetchAll()));
Мне что-то совершенно очевидно? Есть ли что-то в моем SQL, которое испортило привязки? Почему не работает пример с привязками?
Это ошибка в PDO: http://bugs.php.net/bug.php?id=45259
В качестве обходного пути следующий код, хотя и более тяжелый, должен работать в PHP5.3:
$query = $pdo->prepare( 'select roles.* from roles inner join role_user on roles.id = role_user.role_id ' . 'where role_user.user_id = :id' ); $query->bindValue(':id', 1, PDO::PARAM_INT); $query->execute(); die(var_dump($query->fetchAll()));
В последних версиях SQLite есть собственные подготовленные операторы, но я не думаю, что PDO может их использовать (IIRC, код PDO не имеет реального помощника, поэтому он не развивается очень сильно). Вероятно, это ничего не изменит, но вы все равно можете отключить эмуляцию с помощью $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);