Я пытаюсь выбрать несколько идентификаторов, используя mySQL, PHP и PDO следующим образом:

$scheme_ids = "23,24";

// get details for all permitted schemes
$stmt = $pdo->prepare("SELECT * FROM schemes WHERE id IN(?)");
$stmt->execute([$scheme_ids]);
$schemes = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt = null;

foreach ($schemes as $scheme){
    echo $scheme['reference']."<br>";     
}

В таблице схем есть строки для обоих идентификаторов, но он выбирает только значения для идентификатора 23. Результирующий массив не содержит ничего для идентификатора 24.

У кого-нибудь есть идеи?

1
Jamie Moffat 20 Авг 2018 в 13:07

3 ответа

Лучший ответ

Из документации по PDOStatement :: execute:

Несколько значений не могут быть связаны с одним параметром; например, в предложении IN () нельзя связывать два значения с одним именованным параметром.

Вы не можете использовать подготовку заявления в этом случае; вам придется объединить значения в строку запроса. Я предполагаю, что $scheme_ids динамически получен из какого-то пользовательского ввода в вашем реальном приложении, поэтому убедитесь, что он правильно экранирован.

$stmt = $pdo->prepare("SELECT * FROM schemes WHERE id IN($scheme_ids)");
$stmt->execute();
1
Justin 20 Авг 2018 в 10:16

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

$scheme_ids = [23,24];

// get details for all permitted schemes
$stmt = $pdo->prepare("SELECT * FROM schemes WHERE id IN(?)");
$stmt->execute($scheme_ids);
$schemes = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt = null;

foreach ($schemes as $scheme){
    echo $scheme['reference']."<br>";     
}
1
Yogesh Salvi 20 Авг 2018 в 10:09

Вы должны попробовать этот путь

$id= array();
//add value into array like $id[]=23; $id[]=24
//convert the array to a csv string for use with the query
$id= implode(',', $id);
$stmt = $pdo->prepare("SELECT * FROM schemes WHERE id IN(?)");
$stmt->execute($id);
$schemes = $stmt->fetchAll(PDO::FETCH_ASSOC);
2
Bilal Ahmed 20 Авг 2018 в 10:11
51928421