sqlite - Подготовленный оператор в предложении WITH вызывает бесконечный цикл - PullRequest
0 голосов
/ 24 января 2019

У меня есть PHP-скрипт, который печатает числа в диапазоне от 2 до указанного конца, используя подготовленный оператор SQLite с предложением WITH.Когда я запускаю его, программа никогда не завершается и выводит также числа после 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";

1 Ответ

0 голосов
/ 24 января 2019

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