Это не то, что подготовлено для повторного использования заявления. Идея повторного использования подготовленных заявлений - последовательных, а не , одновременный.
Таким образом, вы можете сделать это:
$connection = new \PDO($dsn, $user, $pass);
$stmt = $connection->prepare("
SELECT *
FROM table
WHERE a = :a
AND b = :b
AND c = :c
AND d = :d
AND search LIKE :search
");
$stmt->bindValue(":a", $a);
$stmt->bindValue(":b", $b);
$stmt->bindValue(":c", $c);
$stmt->bindValue(":d", $d);
foreach (["a%", "b%"] as $search) {
$stmt->bindValue(":search", $search);
$stmt->execute();
while($r = $stmt->fetchObject()) {
echo $r->foo . "\n";
}
$stmt->closeCursor();
}
Если вы хотите обрабатывать несколько наборов данных одновременно (по крайней мере, с MySQL), вам нужно будет выполнить одно из следующих действий:
- Используйте соответствующий набор
UNION
/JOIN
, чтобы создать единый результирующий набор.
- Буфер результирующих наборов в памяти и повторите их снова, когда у вас есть все доступные данные.
- Создание нескольких подключений - вы не можете иметь более одного курсора открытого оператора за соединение, но вы можете иметь несколько открытых соединений.
Если вы хотите использовать несколько соединений, ваш код становится:
$query = "
SELECT *
FROM table
WHERE a = :a
AND b = :b
AND c = :c
AND d = :d
AND search LIKE :search
";
$connection1 = new \PDO($dsn, $user, $pass);
$connection2 = new \PDO($dsn, $user, $pass);
$stmt1 = $connection1->prepare($query);
$stmt1->bindValue(":a", $a);
$stmt1->bindValue(":b", $b);
$stmt1->bindValue(":c", $c);
$stmt1->bindValue(":d", $d);
$stmt1->bindValue(":search", "a%");
$stmt2 = $connection2->prepare($query);
$stmt2->bindValue(":a", $a);
$stmt2->bindValue(":b", $b);
$stmt2->bindValue(":c", $c);
$stmt2->bindValue(":d", $d);
$stmt2->bindValue(":search", "b%");
$stmt1->execute();
$stmt2->execute();
while(($r1 = $stmt1->fetchObject()) && ($r2 = $stmt2->fetchObject()))
echo $r1->foo . " " . $r2->foo . "\n";
}
$stmt1->closeCursor();
$stmt2->closeCursor();
Что вы подразумеваете под клоном? используя только один и тот же оператор или используя одни и те же параметры! –
Вы не клонируете объект '$ stmt'. Вы связываете разные значения, а затем снова вызываете -> execute() (вместе с выборкой). –
Не можете ли вы просто привязать все 5 переменных и выполнить их, а затем перестроить переменную ': search' и выполнить ее снова? – Tony