Php PDO通过ODBC Sybase编写的语句;“参数数据流”;错误

Php PDO通过ODBC Sybase编写的语句;“参数数据流”;错误,php,pdo,odbc,sap-ase,Php,Pdo,Odbc,Sap Ase,我试图将一些旧的PHP ODBC查询转换为PDO准备的语句,但遇到了一个错误,我找不到太多相关信息 错误是: “[DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]没有与PARAM datastream指定的主机变量相对应的主机变量。这意味着在前面的DECLARE CURSOR或SQL命令中未使用此变量”“。(ext\pdo_ODBC\ODBC_stmt.c:254上的SQLExecute[3801]” 我正在使用6位ID搜索数据

我试图将一些旧的PHP ODBC查询转换为PDO准备的语句,但遇到了一个错误,我找不到太多相关信息

错误是:

“[DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]没有与PARAM datastream指定的主机变量相对应的主机变量。这意味着在前面的DECLARE CURSOR或SQL命令中未使用此变量”“。(ext\pdo_ODBC\ODBC_stmt.c:254上的SQLExecute[3801]”

  • 我正在使用6位ID搜索数据库中的一行,该ID作为VARCHAR存储在数据库中,但通常是6位数字

  • 数据库连接报告成功

  • 验证查询字符串传递的ID

  • 准备好的语句导致上述错误

else子句中的backup\u 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));
有人有过这种错误的经验吗

编辑:Sybase手册中有关于错误的说明

错误3801:没有与PARAM datastream指定的主机变量对应的主机变量。这意味着在前面的DECLARE CURSOR或SQL命令中未使用此变量“%s”

说明: 自适应服务器无法执行请求的操作。检查命令是否缺少或不正确的数据库对象、变量名和/或输入数据

这很奇怪,因为我的错误(在顶部引用)没有告诉我哪个变量没有宿主

如果我使用

$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'");
所以我认为这与参数没有绑定到占位符有关,但我不知道为什么


如果我不能解决这个问题,我将不得不恢复以字符串形式构建查询,并希望我的输入验证是防弹的。

您的问题似乎是PHP分配给占位符中变量的默认数据类型。SQL语句正在查找一个数字,但PHP将其解释为其他内容。您可以在占位符变量周围使用引号来防止这种情况。请注意,在有效的语句中,PHP看到的值周围有撇号(“”):

$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= '$query1_id'");
使用占位符时请尝试此操作,占位符应相同:

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

您是否尝试将$query1_id转换为字符串并设置长度$query1->bindParam(':id',(字符串)$query1_id,PDO::PARAM_STR,6)?