2017-02-24 88 views
0

我在下面的代码中使用PDO在一个excetute和fetchall中运行多个语句。这适用于Microsoft SQL Server,但不适用于Oracle。PHP PDO 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,只不过没有说它不理解的分号。

是否有某种方式可以在PHP中同时在一个批处理中运行多个语句,并连接到最新的Oracle XE。

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

+0

使你的代码吐出错误 – nogad

+0

有没有错误的fetchAll返回零数组没有数据。 –

+0

Oracle SQL Developer如何做到这一点? –

回答

0

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

准备好几条语句的能力对我来说是一个安全问题。即使应该尽可能避免,也可能发生SQL查询的字符串是动态构建在PHP中的。如果发生恶意攻击和非惯性输入,人们可以在您选择并删除数据库中的数据后添加第二条语句。

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

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

+1

你的思绪很有趣,但完全偏离轨道,事实上不正确。 PDO是否支持多查询语句取决于底层实现。 –

+0

@YourCommonSense:没有“多查询语句”之类的东西。查询是一个SQL语句。因此,如果PDO文档声明它将* a *语句作为第一个参数,则显然它不会一次支持多个语句。所以根据规范它不支持它。如果实现支持它,则不符合规格。 – JeromeFr

+0

如果你想要多个语句,那里有特定的方法。例如在MySQL中:http://php.net/manual/en/mysqli.multi-query.php。但是MySQL文档会警告SQL注入以及可能会在您的字符串中添加恶意语句的人员:https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.multiple-statement.html 。它还表示“不支持使用多语句和准备好的语句。”# – JeromeFr