4

古い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'");

したがって、パラメータがプレースホルダーにバインドされていないことと関係があると思いますが、その理由はわかりません。

これがうまくいかない場合は、クエリを文字列として作成することに戻らなければならず、入力の検証が防弾であることを期待しています。

4

1 に答える 1