Cap*_*Ron 5 php sql oracle select geospatial
更新更新:
我可以通过定义列名来查询......所以问题出在查询上, SELECT *但我的表中有近100列......我不想将它们全部硬核并维护该列表......为什么可以我用不SELECT *??
我只是想创建一个按钮;前端,用户可以在其中选择三个表中的一个导出为 .csv 文件。单击一个选项 -> 该选项将通过该选项传回我的 PHP,table:which;然后将在 oracle 数据库中查询特定表并在浏览器中下载该表。以下是我返回错误的尝试。
jQuery前端调用(导出按钮点击):
$('#export' + '.' + crnt).click(function(){
let which = crnt;
window.location.href = "export?table="+which;
});
Run Code Online (Sandbox Code Playgroud)
PHP 通过纤薄的路线:
<?php
$app->post('/export', function ($request, $response, $args) {
$which = $_POST['table'];
$config = parse_ini_file(__DIR__ . '/../../xx/xx.ini');
$dbuser = $config['dbuser'];
$dbpass = $config['dbpass'];
$dbhost = $config['dbhost'];
$dbname = $config['dbname'];
$constr = $dbhost.'/'.$dbname;
$conn = oci_pconnect($dbuser, $dbpass, $constr, 'XXX');
if ($which == 'table_1'){
$sql = 'SELECT * FROM app.table_1';
$columnsql = 'SELECT column_name FROM app.table_1';
} else if ($which == 'table_2'){
$sql = 'SELECT * FROM app.table_2';
$columnsql = 'SELECT column_name FROM app.table_2';
} else if ($which == 'table_3'){
$sql = 'SELECT * FROM app.table_3';
$columnsql = 'SELECT column_name FROM app.table_3';
}
$stmt = oci_parse($conn, $sql);
$columnstmt = oci_parse($conn, $columnsql);
oci_execute($stmt);
oci_execute($columnstmt);
$columnnames = oci_fetch_array($columnstmt, OCI_ASSOC);
$output = fopen("php://output", "w");
fputcsv($output, $columnnames);
while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
fputcsv($output, $row);
}
fclose($output);
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=$which.csv");
if (!@oci_execute($stmt)) {
$error = oci_error($stmt);
throw new Exception($error['message']);
}
if (!@oci_execute($columnstmt)) {
$error = oci_error($columnstmt);
throw new Exception($error['message']);
}
});
Run Code Online (Sandbox Code Playgroud)
错误 500:以上在我的开发工具网络控制台 -> 预览响应选项卡中返回以下错误:
更新:
我现在已经将所有post实例更新为 ->get哪个固定的post 方法不允许消息,但我仍然收到ORA inconsistent datatypes error......这与我headers在 php 中的内容有关吗?我把它们包括在哪里?我是否还需要在ajax调用中指定数据类型?我如何处理潜在的*ADT*数据类型?
小智 -2
您可以通过获取列名并将其全部转换为创建的查询中的文本字符串(甚至可以将文本转换为文本)来动态创建查询。 https://learn.microsoft.com/en-us/sql/t-sql/spatial-geometry/tostring-geometry-data-type?view=sql-server-ver15
您要将列名称放在第一个 CSV 行中吗?