古いPHPODBCクエリをPDOプリペアドステートメントに変換しようとしていますが、多くの情報が見つからないというエラーが発生します。
エラーは次のとおりです。
"[DataDirect] [ODBC SybaseWireProtocolドライバー][SQLServer]PARAMデータストリームで指定されたものに対応するホスト変数がありません。これは、この変数''が前のDECLARECURSORまたはSQLコマンドで使用されなかったことを意味します。 SQLExecute [3801] at ext \ pdo_odbc \ odbc_stmt.c:254) "
データベースにVARCHARとして保存されている6桁のIDを使用して、データベース内の1つの行を検索していますが、通常は6桁の数字です。
データベース接続は成功を報告しています。
クエリ文字列によって渡されたIDが検証されます。
プリペアドステートメントは、上記のエラーになります。
else句のバックアップストレートODBC_EXECステートメントは、探しているデータを返します。
//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);
}
私が使用した場合も失敗します:
$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= :id ");
$query1->execute(array(":id"=>$query1_id));
誰かがこのエラーの経験がありますか?
編集:SybaseManualはエラーについてこれを述べています...
エラー3801:PARAMデータストリームで指定されたものに対応するホスト変数がありません。これは、この変数 `%。*s'が前のDECLARECURSORまたはSQLコマンドで使用されなかったことを意味します。
説明: AdaptiveServerは要求されたアクションを実行できませんでした。コマンドで、データベースオブジェクト、変数名、入力データが欠落していないか、正しくないかどうかを確認してください。
私のエラー(上部に引用)では、どの変数にホストがないかがわからないため、これは奇妙なことです。
使用すると失敗します...
$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'");
したがって、パラメータがプレースホルダーにバインドされていないことと関係があると思いますが、その理由はわかりません。
これがうまくいかない場合は、クエリを文字列として作成することに戻らなければならず、入力の検証が防弾であることを期待しています。