首页 > 解决方案 > 使用 php 在网站中输出整个 oracle DB 表并保存为 CSV

问题描述

我一直在尝试在我的网站上使用 PHP 输出 Oracle 表。我目前只能在一行中输出行信息,其他事情失败并且不给我任何东西或解析错误。

我有的:

<?php
set_time_limit(0);
$conn = oci_connect("name", "pw", "localhost/service_name");
if (!$conn) {
  $m = oci_error();
  trigger_error(htmlentities($m['Error occured - no conenction created']), E_USER_ERROR);    

$sql = 'SELECT * FROM VIEW_DFINVENTORY 
WHERE ARTTIV NOT LIKE :didbv 
AND ROWNUM <= 100
ORDER BY ARTID';
$stid = oci_parse($conn, $sql);
$didbv = 1;
oci_bind_by_name($stid, ':didbv', $didbv);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo $row['ARTID'] ."<br>\n";
echo $row['ARTCODE'] ."<br>\n";

这只会给我这样的信息:

ARTID
ARTCODE
ARTID
ARTCODE
ARTID
ARTCODE
...

输出数据:

13546987400
1234
1658198200R
1324
874312346AR
8792
...

如何输出整个表/视图,例如在 SQLdeveloper 中显示的,或者通过使用 SQLPlus 将其输出到 CSV 及其所有标题和行?

我环顾四周,发现一个循环在我的情况下只在浏览器上显示一个空白页面:

<?php
set_time_limit(0);
$conn = oci_connect("name", "pw", "localhost/service_name");
if (!$conn) {
    $m = oci_error();
    trigger_error(htmlentities($m['Error occured - no conenction created']), E_USER_ERROR);    

$sql = 'SELECT * FROM VIEW_DFINVENTORY 
WHERE ARTTIV NOT LIKE :didbv 
AND ROWNUM <= 100
ORDER BY ARTID';
$stid = oci_parse($conn, $sql);
$didbv = 1;
oci_bind_by_name($stid, ':didbv', $didbv);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {

$results = array();

foreach($results as $row)
       {
            echo "<tr>\n";
            foreach($row as $index=>$value)
            {
                echo "<td>$value</td>\n";
            }
            echo "</tr>\n";
       }

oci_free_statement($stid);
oci_close($conn);
?>

我是 PHP 新手,所以有什么我错过的吗?自从现在超过 12 个小时以来,我真的被困住并试图解决这个问题。有些资源对我来说太先进了。也许你知道一个很好的教程。每种方法都受到欢迎。

我非常感谢您的帮助。提前谢谢你,马特

标签: php

解决方案


我将使用第二个代码示例并添加注释,以便您了解实际发生的情况:)

<?php
//...

/* oci_fetch_array returns you one row for the executed SQL-statement
 * in each loop run $row contains one row/line of the table.
 * $row always contains all selected columns (in your case * = all columns) of VIEW_DFINVENTORY 
 */
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
  echo "<tr>";

  //you can now print out all relevant columns of one line (if you know the column name) 
  //or automatically all columns you have selected
  foreach ($row as $columnName => $columnValue){
    //print one data column
    echo "<td>".$columnValue."</td>";
  }
  echo "</tr>";
}

有时您可能希望表的第一行包含所有列名称(=表标题),那么您应该在 while 循环之前添加此代码

$columnsCount = oci_num_fields($stid);
echo "<tr>";
for ($i = 1; $i <= $columnsCount ; $i++) {
    $colname = oci_field_name($stid, $i);
    echo "  <th>".htmlspecialchars($colname,ENT_QUOTES|ENT_SUBSTITUTE)."</th>";
}
echo "</tr>";

推荐阅读