2012-11-22 40 views
2

,我會很高興,如果有人幫我:)如何從Oracle XML格式使用PHP

我嘗試寫讀取Oracle數據庫查詢PHP的Web服務,結果顯示爲XML獲取數據。我花了幾天在尋找解決方案,但遺憾的是它沒有工作

下面是一些查詢我試了一下:

<?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>"; 
?> 

第二個代碼:

<?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']; 
} 
$query = "SELECT user_name from fnd_user where user_name = '007144'"; 
$stmt = oci_parse($conn,$query); 

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', 'Root'); 
$dom->appendChild($root);//$root = $dom->appendChild($root); 
while ($row = oci_fetch_array($stmt, OCI_RETURN_NULLS)) 
{ 
$emp = $dom->createElement('EMPLOYEE', 'emp'); 
$emp = $root->appendChild($emp); 
$emp->setAttribute('id', $row['user_name']); 

/* 
$emp = $dom->createElement('EMPLOYEE', ''); 
       $emp = $root->appendChild($emp); 
       $emp->setAttribute('id', $row['user_name']); 
       $ename = $dom->createElement('ENAME', $row['user_name']); 
       $ename = $emp->appendChild($ename); 
       $salary = $dom->createElement('SALARY', $row['user_name']); 
       $salary = $emp->appendChild($salary); 
*/ 
} 
     echo $dom->saveXML(); 
     //$dom->save("employees.xml"); 
oci_close($conn); 
?> 

上面的代碼給我XML沒有數據如下圖所示! http://i48.tinypic.com/2lnv5eo.jpg

第三碼

<?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(); 
?> 

如果您有其他的方式,請幫助我,否則我會瘋:(

+0

在第二個代碼,不應該'$ row ['user_name']'是'$ row ['USER_NAME']'而不是? http://php.net/manual/en/function.oci-fetch-array.php「Oracle的默認,非區分大小寫的列名將在結果數組中包含大寫關聯索引。」 – DazzaL

+0

謝謝,它現在正在工作:) –

回答

0

我測試你的文件:

$row['user_name']

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> 

$row['USER_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_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>"; 

例如輸出與XMLFOREST版本的名稱的更多控制是:

C:\Apps\PHP>php c:\temp\test3.php 
<pre>&lt;EMPLOYEES&gt;&lt;EMPLOYEE&gt;&lt;EmpName&gt;John Doe&lt;/EmpName&gt;&lt;EmpID&gt;1&lt;/EmpID&gt;&lt;email&gt;[email protected]&lt;/email&gt;&lt;/EMPLOYEE&gt;&lt;EMPLOYEE&gt;&lt; 
EmpName&gt;Alan Smith&lt;/EmpName&gt;&lt;EmpID&gt;2&lt;/EmpID&gt;&lt;email&gt;[email protected]&lt;/email&gt;&lt;/EMPLOYEE&gt;&lt;/EMPLOYEES&gt;</pre> 
C:\Apps\PHP> 

ie:

<EMPLOYEES> 
    <EMPLOYEE> 
     <EmpName>John Doe</EmpName> 
     <EmpID>1</EmpID> 
     <email>[email protected]</email> 
    </EMPLOYEE> 
    <EMPLOYEE> 
     <EmpName>Alan Smith</EmpName> 
     <EmpID>2</EmpID> 
     <email>[email protected]</email> 
    </EMPLOYEE> 
</EMPLOYEES> 
+0

是的,它解決了我的問題。但我有另一個問題我如何安排XML元素,如上所述? –

+0

請參閱PL/SQL方法的編輯答案。它允許不涉及PHP的xml元素。 – DazzaL

0

最後,我得到這個XML

<?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); 
?> 

而且這裏的結果: http://filedb.experts-exchange.com/incoming/2012/11_w47/617768/XMLinPHP4.jpg

現在,我將開始解析這個XML,我希望它會在結束工作了,否則我會再來打擾你,對不起:(

明天我會讓你知道,等我:)