如何使用php从oracle获取xml格式的数据
如果有人帮助我,我会非常高兴:) 我试图编写php web服务,从Oracle DB读取查询并将结果显示为XML。我花了几天时间寻找解决方案,但不幸的是,它没有奏效 以下是我尝试过的一些问题:如何使用php从oracle获取xml格式的数据,php,xml,web-services,oracle,Php,Xml,Web Services,Oracle,如果有人帮助我,我会非常高兴:) 我试图编写php web服务,从Oracle DB读取查询并将结果显示为XML。我花了几天时间寻找解决方案,但不幸的是,它没有奏效 以下是我尝试过的一些问题: <?php $db ="(DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1530)) ) (CONNECT_DATA=(
<?php
$db ="(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1530))
)
(CONNECT_DATA=(SID=DEV))
)";
$c = oci_connect("uname", "pass", $db);
$q = "select dbms_xmlgen.getxml(
'select user_name
from fnd_user
where user_name = 007144') xml
from dual";
$s = oci_parse($c, $q);
oci_execute($s);
$r = oci_fetch_array($s, OCI_ASSOC);
$mylob = $r['XML']->load(); // Treat column data as a LOB descriptor
echo "<pre>";
echo htmlentities($mylob);
echo "</pre>";
?>
load();//将列数据视为LOB描述符
回声“;
回音音箱($mylob);
回声“;
?>
第二个代码:
<?php
//File: XMLFromSQL.php
$user = 'uname';
$pswd = 'pass';
$db ='(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1530))
)
(CONNECT_DATA=(SID=DEV))
)';
$sql = "SELECT user_name as RESULT FROM fnd_user
WHERE user_name=:deptno";
$deptno = 007144;
//Connect to the database and obtain info on a given department in XML format
$conn = oci_connect($user, $pswd, $db);
$query = oci_parse($conn, $sql);
oci_bind_by_name($query, ":deptno", $deptno, 2);
oci_execute($query);
oci_fetch($query);
$strXMLData = oci_result($query, 'RESULT');
//Create a new DOM document and load XML into its internal XML tree
$doc = new DOMDocument("1.0", "UTF-8");
$doc->loadXML($strXMLData);
//For simplicity, just print out the XML document
print $doc->saveXML();
?>
save(“employees.xml”);
保监处关闭($康涅狄格州);
?>
上面的代码给我没有数据的XML,如下图所示!
第三代码
C:\Apps\PHP>php c:\temp\test.php
PHP Notice: Undefined index: user_name in C:\temp\test.php on line 25
Notice: Undefined index: user_name in C:\temp\test.php on line 25
<?xml version="1.0" encoding="UTF-8"?>
<EMPLOYEES>Root<EMPLOYEE id="">emp</EMPLOYEE></EMPLOYEES>
loadXML($strXMLData);
//为了简单起见,只需打印出XML文档
打印$doc->saveXML();
?>
如果您有其他方法,请帮助我,否则我会发疯的:(我测试了您的文件:
使用$row['user\u name']
C:\Apps\PHP>php c:\temp\test.php
<?xml version="1.0" encoding="UTF-8"?>
<EMPLOYEES>Root<EMPLOYEE id="007144">emp</EMPLOYEE></EMPLOYEES>
这能解决你的问题吗
编辑:
对于解决方案1(PLSQL端)
$s=oci\u parse($c,$q);
oci_执行($s,oci_默认值);
$r=oci\U fetch\U数组($s,oci\U RETURN\U NULLS+oci\U RETURN\U LOB);
回声“;
回音htmlentities($r[“XML”]);
回声“;
或者对元素的名称进行更多的控制
<EMPLOYEES>
<EMPLOYEE>
<EmpName>John Doe</EmpName>
<EmpID>1</EmpID>
<email>d@d.com</email>
</EMPLOYEE>
<EMPLOYEE>
<EmpName>Alan Smith</EmpName>
<EmpID>2</EmpID>
<email>e@e.com</email>
</EMPLOYEE>
</EMPLOYEES>
$q=“选择xmlelement(
\“雇员”,
xmlagg(
xmlelement(
\“雇员\”,
xmlforest(用户名为“EmpName”,
id为“EmpID”,
以“电子邮件”形式发送电子邮件
)
)
)
).getclobval()xml
来自fnd_用户”;
$s=oci_parse($c,$q);
oci_执行($s,oci_默认值);
$r=oci\U fetch\U数组($s,oci\U RETURN\U NULLS+oci\U RETURN\U LOB);
回声“;
回音htmlentities($r[“XML”]);
回声“;
xmlforest版本的输出示例如下:
C:\Apps\PHP>PHP C:\temp\test3.PHP
员工员工员工姓名John Doe/EmpNameEmpID1/EmpIDemaild@d.com/电子邮件/雇员雇员雇员
Empname艾伦·史密斯/Empname Empid2/EmpIDemaile@e.com/电子邮件/员工/员工
C:\Apps\PHP>
即:
无名氏
1.
d@d.com
阿兰·史密斯
2.
e@e.com
最后,我得到了这个XML
save(“employees.xml”);
保监处关闭($康涅狄格州);
?>
结果如下:
现在,我将开始解析这个XML,我希望它最终会成功,否则我会再次回来打扰您,对不起:(
明天我会让你知道,等等我:)在第二个代码中,不应该是
$row['user\u name']
而是$row['user\u name']
?“Oracle默认的、不区分大小写的列名在结果数组中会有大写的关联索引。”谢谢,它现在正在工作:)是的,它解决了我的问题。但我还有另一个问题,如何安排上面提到的XML元素?请参阅PL/SQL方法的编辑答案。这允许xml元素不涉及PHP。
$s = oci_parse($c, $q);
oci_execute($s, OCI_DEFAULT);
$r = oci_fetch_array($s, OCI_RETURN_NULLS+OCI_RETURN_LOBS);
echo "<pre>";
echo htmlentities($r["XML"]);
echo "</pre>";
$q = "select xmlelement(
\"EMPLOYEES\",
xmlagg(
xmlelement(
\"EMPLOYEE\",
xmlforest(user_name as \"EmpName\",
id as \"EmpID\",
email as \"email\"
)
)
)
).getclobval() xml
from fnd_user";
$s = oci_parse($c, $q);
oci_execute($s, OCI_DEFAULT);
$r = oci_fetch_array($s, OCI_RETURN_NULLS+OCI_RETURN_LOBS);
echo "<pre>";
echo htmlentities($r["XML"]);
echo "</pre>";
C:\Apps\PHP>php c:\temp\test3.php
<pre><EMPLOYEES><EMPLOYEE><EmpName>John Doe</EmpName><EmpID>1</EmpID><email>d@d.com</email></EMPLOYEE><EMPLOYEE><
EmpName>Alan Smith</EmpName><EmpID>2</EmpID><email>e@e.com</email></EMPLOYEE></EMPLOYEES></pre>
C:\Apps\PHP>
<EMPLOYEES>
<EMPLOYEE>
<EmpName>John Doe</EmpName>
<EmpID>1</EmpID>
<email>d@d.com</email>
</EMPLOYEE>
<EMPLOYEE>
<EmpName>Alan Smith</EmpName>
<EmpID>2</EmpID>
<email>e@e.com</email>
</EMPLOYEE>
</EMPLOYEES>
<?php
//File: DOM.php
$db="(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)
(HOST=xxx)(PORT=1530)
)
)
(CONNECT_DATA=(SID=DEV))
)";
$conn = OCILogon("uname","pass",$db);
if ($conn) {
//echo "Successfully connected to Oracle.";
} else {
$err = oci_error();
echo "Oracle Connect Error " . $err['text'];
}
//$dept_id = 007144;
$query = "SELECT user_name from fnd_user where user_name = '007144'";
$stmt = oci_parse($conn,$query);
//oci_bind_by_name($stmt, ':deptid', $dept_id);
if (!oci_execute($stmt, OCI_DEFAULT)) {
$err = oci_error($stmt);
trigger_error('Query failed: ' . $err['message'], E_USER_ERROR);
}
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('EMPLOYEES', '');
$dom->appendChild($root);//$root = $dom->appendChild($root);
while ($row = oci_fetch_array($stmt, OCI_RETURN_NULLS))
{
//var_dump($row);
//$emp = $dom->createElement('EMPLOYEE', 'emp');
//$emp = $root->appendChild($emp);
//$emp->setAttribute('id', $row['EMPLOYEE_NUMBER']);
$emp = $dom->createElement('EMPLOYEE', '');
$emp = $root->appendChild($emp);
//$emp->setAttribute('id', $row['FULL_NAME']);
$EmpName = $dom->createElement('EmpName', $row['FULL_NAME']);
$EmpName = $emp->appendChild($EmpName);
$empid = $dom->createElement('EmpID', $row['EMPLOYEE_NUMBER']);
$empid = $emp->appendChild($empid);
$email = $dom->createElement('email', $row['EMAIL_ADDRESS']);
$email = $emp->appendChild($email);
}
echo $dom->saveXML();
$dom->save("employees.xml");
oci_close($conn);
?>