gpt4 book ai didi

php - 如何重用 PDOStatement prepare?

转载 作者:可可西里 更新时间:2023-11-01 12:53:22 24 4
gpt4 key购买 nike

我进行了搜索,但找不到任何令人满意的东西

想象一下:

<?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";
}

我可以做这样的事情吗?我如何克隆/重用一个PDOStatement 实例并在使用它的同时使用它的原始实例?

不要说“使用UNION,这不是我问题的重点:P

提前谢谢你。

最佳答案

这不是准备好的语句重用的目的。重用准备好的语句的想法是连续,而不是并发

所以你可以这样做:

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

关于php - 如何重用 PDOStatement prepare?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com