Есть ли способ очистки массива для условия IN на PHP Fat Free Framework? - PullRequest
0 голосов
/ 06 февраля 2020

Например, если я хочу очистить строку, я использую следующий код

$db->exec("SELECT * FROM users WHERE email = :email", [':email' => 'john.smith@gmail.com']);

Но если я хочу использовать условие IN, следующий код не работает

$db->exec("SELECT * FROM users WHERE email IN :emails", [':emails' => ['john.smith@gmail.com', 'juan.perez@gmail.com']]);

Как правильно это сделать? Спасибо за ваше время

1 Ответ

1 голос
/ 07 февраля 2020

К сожалению, сделать это нелегко, поскольку класс PDO сам по себе не предоставляет никакого механизма для этого.

Вот как это сделать:

$emails = ['john.smith@gmail.com', 'juan.perez@gmail.com'];

$sql = 'SELECT * FROM users WHERE email IN (' .
       implode(',', array_fill(0, count($emails), '?')) . ')';
$i = 1;
$args = [];
foreach ($emails as $email)
  $args[$i++] = $email;

$db->exec($sql, $args);

ОБНОВЛЕНИЕ:

На самом деле, я не видел ответа george007 , который гораздо более лаконичен, чем мой. Я не знал, что фреймворк автоматически исправляет любой массив с 0 индексированными аргументами (PDO требует, чтобы индекс начинался с 1).

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

$emails = ['john.smith@gmail.com', 'juan.perez@gmail.com'];

$sql = 'SELECT * FROM users WHERE email IN (?' . str_repeat(',?', count($emails)-1) . ')';

$db->exec($sql, $emails);
...