2012-10-29 38 views
4

我想將一些舊的PHP ODBC查詢轉換爲PDO Prepared語句,並且出現錯誤,我找不到太多的信息。PDO編寫ODBC語句Sybase「PARAM datastream」錯誤

錯誤是:

「[DataDirect的] [ODBC的Sybase Wire Protocol驅動程序] [SQL服務器]有對應於由PARAM數據流中指定的一個沒有主機變量這意味着該變量' '未在前述DECLARE CURSOR或SQL命令中使用(在分機SQLExecute [3801] \ PDO_ODBC \ odbc_stmt.c:254)。」

  • 我使用搜索單個行中的數據庫一個6位數的ID,作爲VARCHAR存儲在數據庫中,但通常是盟友6位數字。

  • 數據庫連接報告成功。

  • 驗證查詢字符串傳遞的ID。

  • 準備的語句導致上述錯誤。

else子句中直接備份的ODBC_EXEC語句返回我正在查找的數據。

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= :id "); 
$query1->execute(array(":id"=>$query1_id)); 

有沒有人有這個錯誤的經驗:

//PDO Driver Connect to Sybase 
try { 
    $pdo = new PDO("odbc:Driver={Sybase ASE ODBC Driver};NA=server,5000;Uid=username;Pwd=password;"); 
    $pdo_status = "Sybase Connected"; 
} catch(PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 


if((isset($_GET['id'])) AND ($_GET['id'] != "")) { 

//Validate ID String 
if(!preg_match("/^[A-Za-z0-9]{5,7}/",$_GET['id'])) { 
    $query1_id = FALSE; 
    echo "Invalid ID"; 
    exit; 
} else { 
    $query1_id = $_GET['id']; 
} 

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= ?"); 
$query1->execute(array($query1_id)); 
if($query1->errorCode() != 0) { 
     $person_data = $query1->fetch(PDO::FETCH_ASSOC);  
     echo "Person Data from PDO: "; 
     print_r($person_data); 
    } else { 
     $errors = $query1->errorInfo(); 
     echo $errors[2]; 
//Try the old way to confirm data is there. 
     $odbc_query1 = "SELECT * FROM People WHERE PersonId='$query1_id' "; 
     $person_result = odbc_exec($conn,$odbc_query1) or die("Error getting Data, Query 1"); 
     $person_data = odbc_fetch_array($person_result); 
     echo "Person Data from ODBC_EXEC: "; 
     print_r($person_data); 
    } 

如果我使用它也沒有?

編輯:的Sybase手冊說,這對錯誤...

錯誤3801:不存在對應於由PARAM數據流指定一個沒有主機變量。這意味着在前面的DECLARE CURSOR或SQL命令中沒有使用這個變量`%。* s'。

說明: Adaptive Server無法執行請求的操作。檢查缺少或不正確的數據庫對象,變量名稱和/或輸入數據的命令。

這很奇怪,因爲我的錯誤(引用頂部)不告訴我哪個變量沒有主機。

如果我用也沒有......

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= :id "); 
$query1->bindParam(':id',$query1_id,PDO::PARAM_STR); //Or PARAM_INT 
$query1->execute(); 

查詢工作,如果我把變量在這樣的查詢...

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= '$query1_id'"); 

所以我認爲這事做與參數不綁定到佔位符,但我不明白爲什麼。

如果我不能解決這個問題,我將不得不恢復爲建立我的查詢作爲一個字符串,並希望我的輸入驗證是防彈的。

+1

你嘗試過鑄造你的$ query1_id爲一個字符串並設置長度? $ query1-> bindParam(':id',(string)$ query1_id,PDO :: PARAM_STR,6); ? –

回答

0

您的問題似乎與PHP分配給佔位符中的變量的默認數據類型。 SQL語句正在尋找一個數字,但PHP將其解釋爲別的。你可以用佔位符變量周圍的引號來防止這種情況。請注意,在工作,你必須圍繞價值撇號(「」)是PHP看到聲明:

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= '$query1_id'"); 

試試這個使用佔位符時,它應該是相同的:

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= ':id'");