我正在尝试将一些旧的PHP ODBC查询转换为PDO Prepared语句,并且收到错误,我找不到太多的信息。
错误是:
“[DataDirect] [ODBC Sybase Wire协议驱动程序] [SQL Server]没有与PARAM数据流指定的主机变量对应的主机变量。这意味着此变量''未在前面的DECLARE CURSOR或SQL中使用命令。(SQLExecute [3801]在\ text \ pdo_odbc \ odbc_stmt.c:254)“
我在数据库中使用6位ID搜索单行,该ID作为VARCHAR存储在数据库中,但通常是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));
有没有人遇到过这个错误?
编辑: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'");
所以我认为这与参数没有绑定到占位符有关,但我无法弄清楚原因。
如果我无法解决这个问题,我将不得不恢复将我的查询构建为字符串,并希望我的输入验证是防弹的。
答案 0 :(得分:0)
您的问题似乎与PHP分配给占位符中的变量的默认数据类型有关。 SQL语句正在寻找一个数字,但PHP正在将其解释为其他内容。您可以使用占位符变量周围的引号来阻止此操作。请注意,在有效的语句中,您可以围绕PHP看到的值包含撇号(''):
$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= '$query1_id'");
使用占位符时尝试使用它应该是相同的:
$query1 = $pdo->prepare("SELECT * FROM People WHERE PersonId= ':id'");