2013-08-09 3 views
1

Следующий запрос возвращает все требуемые результаты, если ввести в PHPMyAdmin:MySQL WHERE IN() + И, PDO возвращает только один ряд

SELECT  postid, voting 
FROM  postvotes 
WHERE  userid = 1 
AND  postid IN 
        (1007,1011,1012,1013,1014, 
        1015,1016,1017,1018,1019,1020,1021,1023,1025,1026, 
        1027,1028,1029,1030,1031) 

Но PDO не в fetchAll(). Он просто возвращает первое совпадение подобно fetch().

Что случилось?

PHP код:

private function userPostVotings($postIDs) { 

// $postIDs contains a string like 1,2,3,4,5,6,7... 
// generated through implode(',', idArray) 

    try { 

    $userPostVote = $this->_db->prepare('SELECT postid, voting 
    FROM postvotes 
    WHERE userid = ? 
    AND postid IN (?)'); 

    $userPostVote->setFetchMode(\PDO::FETCH_ASSOC); 
    $userPostVote->execute(array($this->_requester['id'], $postIDs)); 

    while ($res = $userPostVote->fetch()) { 

     var_dump($res); 

    } 

    } catch (\PDOException $p) {} 

} 

Если я эхо из запроса, используемый в этом методе и стрелять через PHPMyAdmin я получить правильное количество результатов. Однако PDO дает только первое. Независимо от того, есть ли цикл с fetch() или fetchAll().

+2

если запрос побежал нормально, то это ошибка PHP, отправлять вам PHP код, я предполагаю, что вы говорите о расширении php pdo –

+0

Добавлен код php – user2429266

+0

Где находится fetchAll()? –

ответ

2

не fetchAll ПДО(), конечно, но ваш запрос.

Который не

IN (1007,1011,1012,1013,1014) 

но

IN ('1007,1011,1012,1013,1014') 

и, конечно, он найдет только первое значение, поскольку эта строка будет наложено на первый номер

Один должен создать запрос с заполнителями, представляющими каждый член массива, а затем привязать эти значения массива к выполнению:

$ids = array(1,2,3); 
$stm = $pdo->prepare("SELECT * FROM t WHERE id IN (?,?,?)"); 
$stm->execute($ids); 

Чтобы сделать этот запрос более гибким, то лучше создать строку с динамически:

$ids = array(1,2,3); 
$in = str_repeat('?,', count($arr) - 1) . '?'; 
$sql = "SELECT * FROM table WHERE column IN ($in)"; 
$stm = $db->prepare($sql); 
$stm->execute($ids); 
$data = $stm->fetchAll(); 
+0

Я попробую. Благодарю. – user2429266

3

Вы не можете связать массив в подготовленных операторах в PDO.

Ссылка: Can I bind an array to an IN() condition?

+0

Нет массива. Implode возвращает строку чисел, разделенную запятой. Эта строка передается методу. – user2429266

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