sqlite - WITH子句中的准备语句导致无限循环
sqlite - Prepared statement in WITH clause causes infinite loop
我有 PHP 脚本,它使用带有 WITH
子句的 SQLite 准备语句打印从 2 到指定结尾范围内的数字。当我 运行 它时,程序永远不会退出并输出 5 之后的数字(指定为参数)。当我 运行 类似的程序结束固定(SQL 代码中的常量)而不是准备好的语句时,它输出预期的数字。
<?php
// Version with prepared statement
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < :to
) select * from range
");
$s->execute(array(":to" => 5));
foreach ($s as $value)
echo $value[0] . "\n";
<?php
// Version with constant -- working
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < 5
) select * from range
");
$s->execute(array());
foreach ($s as $value)
echo $value[0] . "\n";
LIMIT
可以用来限制行数。这并不适用于所有情况,但当我们知道行数时就可以了。
<?php
// Version with prepared statement and LIMIT
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < :to
) select i from range limit :to - 1
");
$s->execute(array(":to" => 5));
foreach ($s as $value)
echo $value[0] . "\n";
我有 PHP 脚本,它使用带有 WITH
子句的 SQLite 准备语句打印从 2 到指定结尾范围内的数字。当我 运行 它时,程序永远不会退出并输出 5 之后的数字(指定为参数)。当我 运行 类似的程序结束固定(SQL 代码中的常量)而不是准备好的语句时,它输出预期的数字。
<?php
// Version with prepared statement
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < :to
) select * from range
");
$s->execute(array(":to" => 5));
foreach ($s as $value)
echo $value[0] . "\n";
<?php
// Version with constant -- working
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < 5
) select * from range
");
$s->execute(array());
foreach ($s as $value)
echo $value[0] . "\n";
LIMIT
可以用来限制行数。这并不适用于所有情况,但当我们知道行数时就可以了。
<?php
// Version with prepared statement and LIMIT
$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
SELECT 2
UNION
SELECT i + 1 FROM range WHERE i < :to
) select i from range limit :to - 1
");
$s->execute(array(":to" => 5));
foreach ($s as $value)
echo $value[0] . "\n";