php - 将 oci_fetch_assoc 数据转换为 json 时出现问题
问题描述
我正在尝试从 Oracle 表中获取数据并转换为 JSON 对象,以便可以在 Jquery Datatable 上读取它。这是我的 PHP 代码 -
<?php
$db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521)(SEND_BUF_SIZE=)(RECV_BUF_SIZE=))(LOAD_BALANCE=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)))" ;
if($c = OCILogon("test", "test", $db))
{
$rowfetch = oci_parse($c, "select * from table" );
oci_execute($rowfetch);
while($row=oci_fetch_assoc($rowfetch))
{
$arr['data'][]= $row;
$senddata= json_encode($arr, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
echo $senddata;
}
}
else
{
$err = OCIError();
echo "Connection failed." . $err[text];
}
OCILogoff($c);
?>
我收到这样的 JSON 响应 -
{"data":[{"SCHEMA":"TEST","TABLE_NAME":"TEST_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME" :"27-JUN-18"}]}{"data":[{"SCHEMA":"TEST","TABLE_NAME":"TEST_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK", "CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"27-JUN-18"},{"SCHEMA":"TEST","TABLE_NAME":"ART_CM3_T","CUSTOMFIELD10":"平均 DWP","CUSTOMFIELD5" :null,"CUSTOMFIELD9":"BILLING","LAST_UPD_TIME":"05-FEB-19"}]}{"data":[{"SCHEMA":"TEST","TABLE_NAME":"TEST_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"27-JUN-18"},{" SCHEMA":"TEST","TABLE_NAME":"ART_CM3_T","CUSTOMFIELD10":"平均 DWP","CUSTOMFIELD5":null,"CUSTOMFIELD9":"BILLING","LAST_UPD_TIME":"05-FEB-19"} ,{"SCHEMA":"TEST","TABLE_NAME":"ART_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"09-FEB -19"}]}{"数据":[{"SCHEMA":"TEST","TABLE_NAME":"TEST_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"27-JUN-18"},{"SCHEMA":"TEST","TABLE_NAME":" ART_CM3_T","CUSTOMFIELD10":"Average DWP","CUSTOMFIELD5":null,"CUSTOMFIELD9":"BILLING","LAST_UPD_TIME":"05-FEB-19"},{"SCHEMA":"TEST","TABLE_NAME ":"ART_T","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"09-FEB-19"},{"SCHEMA":"TEST ","TABLE_NAME":"ART_CUST","CUSTOMFIELD10":"CREATING","CUSTOMFIELD5":"NIK","CUSTOMFIELD9":"NIK","LAST_UPD_TIME":"09-FEB-19"}]}
但这不是 Datatable 可以读取和接受的正确格式。对于 Jquery 数据表,JSON 响应应该是这样的 -
{“数据”:[[“Tiger Nixon”,“系统架构师”,“爱丁堡”,“5421”,“2011/04/25”,“320,800 美元”],[“Garrett Winters”,“会计”,“东京”、“8422”、“2011/07/25”、“170,750 美元”]、[“赫罗德·钱德勒”、“销售助理”、“旧金山”、“9608”、“2012 年 8 月 6 日”、“137,500 美元” ]、[“Rhona Davidson”、“集成专家”、“东京”、“6200”、“2010/10/14”、“$327,900”]、[“科琳·赫斯特”、“Javascript 开发人员”、“旧金山”、“2360”、“2009 年 9 月 15 日”、“205,500 美元”]、[“海莉·肯尼迪”、“高级营销设计师”、“伦敦”、“ 3597”、“2012/12/18”、“$313,500”]、[“Tatyana Fitzpatrick”、“区域总监”、“伦敦”、“1965”、“2010/03/17”、“$385,750”]]}],[“Haley Kennedy”,“高级营销设计师”,“伦敦”,“3597”,“2012/12/18”,“$313,500”],[“Tatyana Fitzpatrick”,“区域总监”,“伦敦”, “1965 年”、“2010 年 3 月 17 日”、“385,750 美元”] ] }],[“Haley Kennedy”,“高级营销设计师”,“伦敦”,“3597”,“2012/12/18”,“$313,500”],[“Tatyana Fitzpatrick”,“区域总监”,“伦敦”, “1965 年”、“2010 年 3 月 17 日”、“385,750 美元”] ] }750"]]}750"]]}
我在这里做错了什么?如何将此 JSON 格式更改为所需的 Datatable 格式?
解决方案
在附加返回记录后的 while 循环中,它被回显。
除了返回错误的格式外,还会返回重复的记录。
您可以在对它们进行编码后输出单个行,并输出它们所包含的编码 JSON 数组。
echo '{"data": [';
$row = oci_fetch_row($rowfetch);
while ($row) {
$senddata = json_encode($row, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
echo $senddata;
$row = oci_fetch_row($rowfetch);
if ($row === FALSE) break;
echo ',';
}
echo ']}';
// Remember to free the statement and close the connection.
您还可以构建编码记录数组并完全输出。
$records = [];
oci_fetch_all($rowfetch, &$records, null, null, OCI_FETCHSTATEMENT_BY_ROW + OCI_NUM);
$resp = ["data" => $records];
echo json_encode($resp, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
// Remember to free the statement and close the connection.
推荐阅读
- php - 只有工作日的 PHP Carbon 日期差异
- sql - 在两个条件下连接两个表,如果它无法连接到空白单元格的行
- windows - Windows 批处理脚本中的空间 (xcopy)
- html - 元素未显示并且 :hover 无法在 .svg 上工作
- python - AttributeError:类型对象“MyUser”没有属性“USERNAME_FIELD”
- django - 有没有办法用 Django 发送推送通知
- graph - 基于关键字的 OneDrive API 搜索仅提供部分信息,不提供有关页面详细信息的任何信息
- apache-kafka - Kafka最大连接数
- sql - 我可以用 R 或 Python 中的正则表达式替换 SQL 中的值吗?
- java - 获取“java.lang.NoClassDefFoundError:org/junit/platform/engine/DiscoverySelector”试图运行Serenity JBheave