【问题标题】:PHP PDO Oracle not working for multiple statementsPHP PDO Oracle 不适用于多个语句
【发布时间】:2017-07-14 17:10:21
【问题描述】:

我在以下代码中使用 PDO 在一个执行和 fetchall 中运行多个语句。这适用于 Microsoft SQL Server,但不适用于 Oracle。

<?php 
    $conn = new PDO("odbc:oratest", "SYSTEM", "password");
    $result = $conn->prepare("select * from all_objects; select * from all_users;");
    $result->execute();

    echo "<html><body>";
    do
    {
        echo "<table border=\"0\">";
        $row = $result->fetchAll(PDO::FETCH_ASSOC);
        if($row && count($row) > 0) {
            $keys = array_keys($row[0]);
            echo "<tr>";
            for($j = 0; $j < count($keys); $j++) {
                echo "<td>" . $keys[$j] . "</td>";
            }
            echo "</tr>";
            for($i = 0; $i < count($row); $i++) {
                echo "<tr>";
                for($j = 0; $j < count($keys); $j++) {
                    echo "<td>" . $row[$i][$keys[$j]] . "</td>";
                }
                echo "</tr>";
            }
        }
        echo "</table>";
    } while($result->nextRowset());
    echo "</body></html>";
?>

使用 OCI PHP 方式的其他代码也不能使用多个语句:

$stid = oci_parse($conn, 'select * from all_objects; select * from all_users;');

oci_parse 只是失败,说它不理解分号字符。

有没有办法在连接到最新Oracle XE的PHP中同时运行多个语句。

这个问题与现有的 MySQL 问题不同,因为这个问题是关于 Oracle 的,它是一个具有不同功能和限制的不同驱动程序。

【问题讨论】:

  • 让你的代码吐出错误
  • fetchAll 返回零数组没有数据没有错误。
  • Oracle SQL Developer 是如何做到的?
  • 只是好奇,用单独的调用运行查询有什么问题?为什么您认为有必要将脚本中的每个查询都填充到单个 blob 中,然后针对数据库触发它?
  • 另一个原因是他们可能会编写一个他们想在 PL/SQL 中发送的脚本,这将是一堆需要一起运行的语句。

标签: php oracle pdo


【解决方案1】:

我真的很惊讶它可以与 Microsoft SQL Server 一起使用。 PDO::prepare 第一个参数是the doc的SQL语句,不是几个。

将多个语句放入准备中的能力对我来说是一个安全问题。即使应尽可能避免,SQL 查询的字符串也可能在 PHP 中动态构建。在恶意攻击和未转义输入的情况下,人们可以在您选择后添加第二条语句并删除数据库中的数据。

我还担心如果表的结构不同,PHP 将如何在一次调用中处理两个 SQL 语句的结果。结果数组应该是什么样子的?

TL;DR :在单个 SQL 查询中使用多次执行和 fetchall 或检索所有数据,例如使用 UNION ALL

【讨论】:

  • 你的想法很有趣,但完全偏离了轨道,实际上是不正确的。 PDO 是否支持多查询语句,取决于底层实现。
  • @YourCommonSense :没有“多查询语句”之类的东西。查询是一条 SQL 语句。因此,如果 PDO 文档说它以 a 语句作为第一个参数,那么很明显它不支持同时使用多个语句。所以根据规范它不支持它。如果实现支持它,则它不遵守规范。
  • 如果你想要多个语句,有具体的方法。例如在 mysql 中:php.net/manual/en/mysqli.multi-query.php。但是 MySQL 文档警告 SQL 注入和可能在您的字符串中添加恶意语句的人:dev.mysql.com/doc/apis-php/en/…。它还说Use of the multiple statement with prepared statements is not supported.
  • @YourCommonSense 我是唯一一个在这里链接文档的人,你只是告诉我我错了而没有证明。所以我给出事实,你没有。 w3schools.com/sql/sql_syntax.asp :“分号是在数据库系统中分隔每个 SQL 语句的标准方法,它允许在对服务器的同一次调用中执行多个 SQL 语句。”这再次意味着具有多个分号的字符串意味着它不止一个语句。文档说:a 声明。你读了吗?
  • 问题是您的链接以及您的幻想与所提出的问题无关,应该作为评论发布
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多