2014-07-14 52 views
1

我可以使用PHP與Oracle 11g數據庫進行通信。此代碼旨在供用戶上傳.xls或.csv文件。如果.xls,然後轉換爲.csv。如果.csv,繼續。之後,它需要csv並更新一個oracle數據庫。在過去,我使用了SQL注入,卻沒有意識到與之相關的安全缺點。所以,我開始學習使用PDO。不過,我很新。我設計的代碼(如下)得到這個錯誤:使用PHP調用成員函數prepare()在PDO中的非對象使用PHP

Fatal error: Call to a member function prepare() on a non-object in /opt/apache/servers/planninganddesign/htdocs/JointUse/update_handler.php on line 89 

89行被標記在下面。

代碼:

<?php 
require_once('Classes/PHPExcel/IOFactory.php'); 
require_once("mcl_Oci.php"); 
?> 

<br> 

<?php 

    $filename = $_FILES['uploaded']['name']; 
    $file = $_FILES['uploaded']['tmp_name']; 
    $ext = pathinfo($filename, PATHINFO_EXTENSION); 
    if($ext='xls') { 



     $inputFileType = 'Excel5'; 
     $inputFileName = $file; 

     $objReader = PHPExcel_IOFactory::createReader($inputFileType); 
     $objPHPExcelReader = $objReader->load($inputFileName); 

     $loadedSheetNames = $objPHPExcelReader->getSheetNames(); 

     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcelReader, 'CSV'); 

     foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) { 
       $objWriter->setSheetIndex($sheetIndex); 
       $objWriter->save('abc.csv');} 
     $files = fopen('abc.csv', 'r'); 
      if($files) { 
        while (($line = fgetcsv($files)) !== FALSE) { 
        $csv_array[] = array_combine(range(1, count($line)), array_values($line)); 
      }   echo 'Your .xls file was uploaded successfully. Have a nice day.'; 
     } 
     elseif ($ext='csv'){ 
      while (($line = fgetcsv($files)) !== FALSE) { 
        $csv_array[] = array_combine(range(1, count($line)), array_values($line)); 
      } echo 'Your .csv file was uploaded successfully. Have a nice day.'; 
     } 
     else { 
      echo "This is not an accepted file type. Please save as either '*.csv' or '*.xls' and re-upload."; 
     } 
    } 


    $ArrayNumber = 0; 

    while ($csv_array["$ArrayNumber"] != NULL) { 

    $ArrayNumber = $ArrayNumber + 1; 
    $RECEIVED=$csv_array["$ArrayNumber"]["1"]; 
    $REGION=$csv_array["$ArrayNumber"]["2"]; 
    $PERMIT=$csv_array["$ArrayNumber"]["3"]; 
    $CUSTOMER=$csv_array["$ArrayNumber"]["4"]; 
    $TO_BUSINESS=$csv_array["$ArrayNumber"]["5"]; 
    $TO_PERMIT=$csv_array["$ArrayNumber"]["6"]; 
    $POWER_ADDRESS=$csv_array["$ArrayNumber"]["7"]; 
    $COMPANY=$csv_array["$ArrayNumber"]["8"]; 
    $MAP_SECTION = $csv_array["$ArrayNumber"]["9"]; 
    $POLES = $csv_array["$ArrayNumber"]["10"]; 
    $FEE = $csv_array["$ArrayNumber"]["11"]; 
    $INVOICE = $csv_array["$ArrayNumber"]["12"]; 
    $DATE_LARRY = $csv_array["$ArrayNumber"]["13"]; 
    $DAYS_LARRY = $csv_array["$ArrayNumber"]["14"]; 
    $PI_PON = $csv_array["$ArrayNumber"]["15"]; 
    $DATE_PD = $csv_array["$ArrayNumber"]["16"]; 
    $DATE_LARRY_PD = $csv_array["$ArrayNumber"]["17"]; 
    $RETURNED = $csv_array["$ArrayNumber"]["18"]; 
    $DAYS_PD = $csv_array["$ArrayNumber"]["19"]; 
    $ERRORS_PD = $csv_array["$ArrayNumber"]["20"]; 
    $ERRORS_MULTIPLE = $csv_array["$ArrayNumber"]["21"]; 
    $DATE_MAKEREADY_JU = $csv_array["$ArrayNumber"]["22"]; 
    $DATE_MAKEREADY_COMPLETE = $csv_array["$ArrayNumber"]["23"]; 
    $DAYS_MAKEREADY = $csv_array["$ArrayNumber"]["24"]; 
    $DAYS_JU_PROCES = $csv_array["$ArrayNumber"]["25"]; 
    $APPROVAL = $csv_array["$ArrayNumber"]["26"]; 
    $DAYS_PERMIT_IN_JU = $csv_array["$ArrayNumber"]["27"]; 
    $DATE_PLANNING = $csv_array["$ArrayNumber"]["28"]; 
    $DAYS_OPEN = $csv_array["$ArrayNumber"]["29"]; 
    $DATE_ROUTED = $csv_array["$ArrayNumber"]["30"]; 
    $DAYS_TOTAL = $csv_array["$ArrayNumber"]["31"]; 
    $COMMENTS = $csv_array["$ArrayNumber"]["32"]; 

    $conn = oci_connect("user", "pass", "(description=(address=(protocol=tcp)(host=host)(port=1533))(connect_data=(service_name=name)))"); 
    $sql = 'INSERT INTO INTOXDM.JOINT_USE (RECEIVED, REGION, PERMIT, CUSTOMER, TO_BUSINESS, TO_PERMIT, POWER_ADDRESS, COMPANY, MAPSECTION, POLES, FEE, INVOICE, DATE_LARRY, DAYS_LARRY, PI_PON, DATE_PD, DAYS_LARRY_PD, RETURNED, DAYS_PD, ERRORS_PD, ERRORS_MULTIPLE, DATE_MAKEREADY_JU, DATE_MAKEREADY_COMPLETE, DAYS_MAKEREADY, DAYS_JU_PROCES, APPROVAL, DAYS_PERMIT_IN_JU, DATE_PLANNING, DAYS_OPEN, DATE_ROUTED, DAYS_TOTAL, COMMENTS) 
     VALUES (:RECEIVED, :REGION, :PERMIT, :CUSTOMER, :TO_BUSIENSS, :TO_PERMIT, :POWER_ADDRESS, :COMPANY, :MAP_SECTION, :POLES, :FEE, :INVOICE, :DATE_LARRY, :DAYS_LARRY, :PI_PON, :DATE_PD, :DATE_LARRY_PD, :RETURNED, :DAYS_PD, :ERRORS_PD, :ERRORS_MULTIPLE, 
     :DATE_MAKEREADY_JU, :DATE_MAKEREADY_COMPLETE, :DAYS_MAKEREADY, :DAYS_JU_PROCES, :APPROVAL, :DAYS_PERMIT_IN_JU, :DATE_PLANNING, :DAYS_OPEN, :DATE_ROUTED, :DAYS_TOTAL, :COMMENTS)'; 
    *****$stmt = $conn->prepare($sql);***** line 89 
    $sql->bindValue(':RECEIVED',$RECEIVED); 
    $sql->bindValue('REGION',$REGION); 
    $sql->bindValue(':PERMIT',$PERMIT); 
    $sql->bindValue(':TO_BUSINESS',$TO_BUSINESS); 
    $sql->bindValue(':TO_PERMIT',$TO_PERMIT); 
    $sql->bindValue(':POWER_ADDRESS',$POWER_ADDRESS); 
    $sql->bindValue(':MAP_SECTION',$MAP_SECTION); 
    $sql->bindValue(':POLES',$POLES); 
    $sql->bindValue(':FEE',$FEE); 
    $sql->bindValue(':INVOICE',$INVOCE); 
    $sql->bindValue(':$DATE_LARRY',$DATE_LARRY); 
    $sql->bindValue(':$DAYS_LARRY',$DAYS_LARRY); 
    $sql->bindValue(':$PI_PON',$PI_PON); 
    $sql->bindValue(':$DATE_PD',$DATE_PD); 
    $sql->bindValue(':$DATE_LARRY_PD',$DATE_LARRY_PD); 
    $sql->bindValue(':RETURNED',$RETURNED); 
    $sql->bindValue(':DAYS_PD',$DAYS_PD); 
    $sql->bindValue(':ERRORS_PD',$ERRORS_PD); 
    $sql->bindValue(':ERRORS_MULTIPLE',$ERRORS_MULTIPLE); 
    $sql->bindValue(':DATE_MAKEREADY_JU',$DATE_MAKEREADY_JU); 
    $sql->bindValue(':DATE_MAKEREADY_COMPLETE',$DATE_MAKEREADY_COMPLETE); 
    $sql->bindValue(':DAYS_MAKEREADY',$DAYS_MAKEREADY); 
    $sql->bindValue(':DAYS_JU_PROCES',$DAYS_JU_PROCES); 
    $sql->bindValue(':DATE_PERMIT_IN_JU',$DATE_PERMIT_IN_JU); 
    $sql->bindValue(':DATE_PLANNING',$DATE_PLANNING); 
    $sql->bindValue(':DAYS_OPEN',$DAYS_OPEN); 
    $sql->bindValue(':DATE_ROUTED',$DATE_ROUTED); 
    $sql->bindValue(':DAYS_TOTAL',$DAYS_TOTAL); 
    $sql->bindValue(':COMMENTS',$COMMENTS); 
    $stmt->execute(); 

    $exec = execute(); 

    } 
?> 

可能會導致什麼這個問題,是有它周圍的一個簡單的方法? TIA!

+4

可能的重複[參考 - 這個錯誤在PHP中意味着什麼?](http://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php/12769983#12769983 )。您不能將'oci_'函數與'PDO'函數混合使用。使用100%'oci'或100%PDO(使用['PDO_OCI'](http://php.net/manual/en/ref.pdo-oci.php))。 – h2ooooooo

+0

在我看來,它看起來像'oci_connect'的調用失敗,'$ conn'沒有引用有效的連接。祝你好運。 –

+0

@BobJarvis感謝您的幫助,但連接絕對成功。我有其他頁面使用完全相同的連接字符串從數據庫中提取數據。 –

回答

2

oci擴展沒有面向對象的用法。 oci_connect()返回一個資源,而不是一個對象。資源沒有方法。

來自@ h2ooooooo的評論是正確的。你似乎在混合使用oci和使用PDO。選擇一個或另一個,最好是PDO。

,而不是調用oci_connect()換句話說,這樣做:

$dsn = 'oci:dbname=host:1533/name'; 
$user = 'user'; 
$password = 'pass'; 

try { 
    $conn = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

如果成功,你應該能夠使用$conn爲PDO對象。

但是在你的代碼中還有一些其他的錯誤。

$sql->bindValue(':RECEIVED',$RECEIVED); 

如果使用bindValue(),這是你的陳述對象,而不是$sql字符串的方法。字符串沒有方法。做到這一點,而不是:

$stmt->bindValue(':RECEIVED',$RECEIVED); 

27:11所有其他調用bindValue()

您還可以出現在你的代碼的最後什麼也不做一個多餘的線:

$exec = execute(); 

除非你在你的應用程序中的功能​​,我不知道這是什麼應該做的。

另一個錯誤:您的while循環測試如果當前索引$ArrayNumber有條目,那麼您在獲取值之前增加$ArrayNumber。您保證會導致錯誤,因爲您的代碼將嘗試讀取數組的末尾。您應該在之後增加$ArrayNumber您讀取該數組元素中的數據。

或者使用一個for循環,而不是while

$count = count($csv_array); 
for ($ArrayNumber = 0; $ArrayNumber < $count; ++$ArrayNumber) { 
    ... 

或者更簡單:

foreach ($csv_array as $row) { 
    ... 

關於使用預處理語句的一些技巧。如果您只是將數組傳遞給PDOStatement::execute(),則可以跳過所有繁瑣的bindValue()調用。你已經有了你的數據在一個數組中!你甚至不需要創建所有這些局部變量。

由於您的數據使用整數而不是列名進行索引,因此應該使用序號參數(以?作爲佔位符)而不是命名參數。

此外,您不需要爲循環的每次迭代準備語句。準備好的語句的最大優點之一是,您可以準備一次,並在循環中以不同的值重新使用它。

下面是一個例子:

$sql = 'INSERT INTO INTOXDM.JOINT_USE (RECEIVED, REGION, PERMIT, CUSTOMER, TO_BUSINESS, TO_PERMIT, POWER_ADDRESS, COMPANY, MAPSECTION, POLES, FEE, INVOICE, DATE_LARRY, DAYS_LARRY, PI_PON, DATE_PD, DAYS_LARRY_PD, RETURNED, DAYS_PD, ERRORS_PD, ERRORS_MULTIPLE, DATE_MAKEREADY_JU, DATE_MAKEREADY_COMPLETE, DAYS_MAKEREADY, DAYS_JU_PROCES, APPROVAL, DAYS_PERMIT_IN_JU, DATE_PLANNING, DAYS_OPEN, DATE_ROUTED, DAYS_TOTAL, COMMENTS) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; 
$stmt = $conn->prepare($sql); 

foreach ($csv_array as $row) { 
    $stmt->execute($row); 
} 

最後一個小貼士:你做這個數據後,已被閱讀:

echo 'Your .csv file was uploaded successfully. Have a nice day.'; 

但我願意在數據後的消息已成功導入輸出數據庫。如果在數據庫中插入任何問題,肯定的消息可能不會成立。

+0

首先,謝謝你的詳細解答,這個答案讓我有點相當瞭解。我很感激!當我更新我的連接字符串,我得到以下內容:'連接失敗:找不到驅動程序'。以前也出現同樣的錯誤,但我想這可能是由於上面發佈的錯誤。這是否意味着我需要安裝PDO?我怎樣才能做到這一點? –

+0

您的PHP實例似乎沒有安裝OCI驅動程序。有關該問題的答案,請參閱http://stackoverflow.com/search?q=pdo+oci+could+not+find+driver。 –

相關問題