我想將一些舊的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'");
所以我認爲這事做與參數不綁定到佔位符,但我不明白爲什麼。
如果我不能解決這個問題,我將不得不恢復爲建立我的查詢作爲一個字符串,並希望我的輸入驗證是防彈的。
你嘗試過鑄造你的$ query1_id爲一個字符串並設置長度? $ query1-> bindParam(':id',(string)$ query1_id,PDO :: PARAM_STR,6); ? –