【问题标题】:sqlite - Prepared statement in WITH clause causes infinite loopsqlite - WITH子句中的准备语句导致无限循环
【发布时间】:2019-06-18 16:01:49
【问题描述】:

我有一个 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";

【问题讨论】:

  • 我认为 CTE 的递归部分是这里的罪魁祸首。不确定解决方法。

标签: sql sqlite pdo prepared-statement infinite-loop


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 2010-10-05
    • 2013-08-26
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2016-04-08
    • 2023-03-23
    相关资源
    最近更新 更多