2014-01-23 2 views
6

Я сделал поиск, но я не мог найти ничего удовлетворяющегоКак повторно подготовить PDOStatement?

Представьте себе следующее:

<?php 

$connection = new \PDO($dsn, $user, $pass); 

$stmt1 = $connection->prepare(" 
    SELECT 
     * 
    FROM 
     table 
    WHERE 
      a = :a 
    AND  b = :b 
    AND  c = :c 
    AND  d = :d 
    AND  search LIKE :search 
"); 
$stmt1->bindValue(":a", $a); 
$stmt1->bindValue(":b", $b); 
$stmt1->bindValue(":c", $c); 
$stmt1->bindValue(":d", $d); 

$stmt2 = clone $stmt1; 

$stmt1->bindValue(":search", "a%"); 
$stmt2->bindValue(":search", "b%"); 

$stmt1->execute(); 
$stmt2->execute(); 

while(($r1 = $stmt1->fetchObject()) && ($r2 = $stmt2->fetchObject())) 
    echo $r1->foo . " " . $r2->foo . "\n"; 
} 

Могу ли я сделать что-то вроде этого? Как я могу использовать clone/повторно использовать экземпляр и использовать его в то же время в своем оригинальном экземпляре?

Не говори «использовать UNION», это не суть моего вопроса: P

Спасибо заранее.

+0

Что вы подразумеваете под клоном? используя только один и тот же оператор или используя одни и те же параметры! –

+1

Вы не клонируете объект '$ stmt'. Вы связываете разные значения, а затем снова вызываете -> execute() (вместе с выборкой). –

+0

Не можете ли вы просто привязать все 5 переменных и выполнить их, а затем перестроить переменную ': search' и выполнить ее снова? – Tony

ответ

5

Это не то, что подготовлено для повторного использования заявления. Идея повторного использования подготовленных заявлений - последовательных, а не , одновременный.

Таким образом, вы можете сделать это:

$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(); 
1

Похоже, что вы ищете абстракции подготовленное заявление, которое способно нести его собственные параметры с ним.

Как вы на самом деле потребляете каждый результат, пройдя его, добавив Iterator, который знает, как пройти такой параметризованный подготовленный оператор.

Однако это предложение не является частью PDO, так что вам нужно будет написать его самостоятельно (однако это также может помешать повторить себя с PDO кодом и вы, возможно, даже deffer фактического создания и исполнения заявления так что это может также создать некоторую выгоду для ленивых данных загрузки).

+0

вот что я думал: P –

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