php - 使用 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
//...
/* 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>";
推荐阅读
- python - 在 Python 中创建 Whoosh 索引时丢失了一些行
- c++ - 如何将数组分隔成偶数列(C++)
- apache-spark - Dataframes join 在 Spark Scala 中返回空结果
- android - 协程中的范围混淆
- python - 将文件写入 EFS docker 卷时,Python 进程没有响应
- javascript - 将矩形对象放在画布的边框上
- putty - 从 PUTTY 连接到运行 micropython 的 ESP8266
- macos - 使用mac终端在CSV特定列的N位置添加一个字符
- python - 在python中将一个类移动到它自己的文件中
- c++ - 我可以在析构函数中调用公共函数来释放内存吗?