【问题标题】:PHP PDO prepare() prepared statements not working, but query() worksPHP PDO prepare() 准备好的语句不起作用,但 query() 有效
【发布时间】:2023-03-19 00:28:01
【问题描述】:

无法使这些 PDO 准备好的语句正常工作。在 Windows / MAMP 和 SQLite 上使用 PHP 7.0.9。

PHP PDO驱动pdo_sqlite安装版本3.8.10.2

有人知道我在这里做错了什么吗?

这按预期工作:

$st = $pdo->query("SELECT * FROM `e48` WHERE `parallel` >= 4000 AND `parallel` <= 4010");
$results = $st->fetchAll();

这不起作用,结果为零:

$st = $pdo->prepare("SELECT * FROM `e48` WHERE `parallel` >= :x AND `parallel` <= :y");
$st->execute(array(':x' => 4000, ':y' => 4010));
$results = $st->fetchAll();

这也不起作用:

$st = $pdo->prepare("SELECT * FROM `e48` WHERE `parallel` >= 4000 AND `parallel` <= :y");
$st->execute(array(':y' => 4010));
$results = $st->fetchAll();

最终给我的结果与以下相同:

SELECT * FROM `e48` WHERE `parallel` >= 4000

P.S 也在 Linux 虚拟机 Web 服务器中进行了测试,结果相同。

【问题讨论】:

  • 使用php.net/manual/en/pdo.errorinfo.php 看看有什么错误
  • 还要检查这里的答案,以确保您已正确配置 PDO 以检测错误:stackoverflow.com/questions/4584788/…
  • 尝试设置属性PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION$pdo-&gt;errorInfo(),但它们什么也没显示。
  • @u_mulder 第一个query() 方法确实有效,它下面的其他方法无效。

标签: php database pdo sqlite


【解决方案1】:

我已经解决了。

我在parallel 列中使用了TEXTSQLite datatype,当我将它切换到REAL 时它可以工作(它们都是浮点数)。所以数据库中的值以前存储为(首选)文本字符串。

将其更改为REAL 后,准备好的语句现在可以工作了。

参考:Type Conversions Prior To Comparison


为什么$pdo-&gt;query("SELECT * FROM e48 WHERE parallel &gt;= 4000 AND parallel &lt;= 4010") 有效?

如果一个操作数具有 INTEGER、REAL 或 NUMERIC 亲和性,而另一个操作数具有 TEXT 或 BLOB 或没有亲和性,则将 NUMERIC 亲和性应用于其他操作数。

右手操作数被视为具有NUMERIC 亲和力,因此比较按预期进行。


为什么$pdo-&gt;prepare("SELECT * FROM e48 WHERE parallel &gt;= :x AND parallel &lt;= :y") 不起作用?

如果一个操作数具有 TEXT 亲和性,而另一个没有亲和性,则将 TEXT 亲和性应用于另一个操作数。

将 PHP PDO 与 SQLite 结合使用时,右侧操作数被查询为根本没有 没有亲和力,因此比较被视为具有 TEXT 亲和力,这反过来又变成了一个无-操作比较。

【讨论】:

    【解决方案2】:
    $array=array('x' => 4000, 'y' => 4010);    
    $st = $pdo->prepare("SELECT * FROM `e48` WHERE `parallel` >= :x AND `parallel` <= :y");
    $st->execute($array);
    $results = $st->fetchAll();
    

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 2012-11-13
      • 1970-01-01
      • 2018-01-24
      • 2010-11-30
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多