1

我有一个相当简单的查询,我想用我的 PDO 连接到远程 MSSQL 服务器运行。

SELECT BookingID, DriverID 
FROM dbo.VehicleJobHistory 
WHERE TimeJobRequired > "02/03/2013" AND VehicleID = $vid

当我编写没有任何变量的查询时,它工作得很好,但是一旦我尝试向查询中添加一个变量,我什么也没有返回。我认为它的类型不匹配,但我不能确定。

如果我将 $vid 更改为“451”,我会得到我正在寻找的结果。

$vid = '451';    
$myServer = "X";
$myUser = "X";
$myPass = "X";
$myDB = "X";

try {
  # MS SQL Server and Sybase with PDO_DBLIB

$DBH = new PDO("dblib:host=$myServer;dbname=$myDB", $myUser, $myPass);

# creating the statement
$STH = $DBH->query('SELECT BookingID, DriverID FROM dbo.VehicleJobHistory WHERE TimeJobRequired > "02/03/2013" AND VehicleID = $vid');

# setting the fetch mode
$STH->setFetchMode(PDO::FETCH_OBJ);

# showing the results
while($row = $STH->fetch()) {
    echo $row->BookingID . "/";
    echo $row->DriverID  ;
echo "<br>";

}

}
catch(PDOException $e) {
    echo $e->getMessage();
}

# close the connection
$DBH = null;
echo "connection closed";

非常感激任何的帮助。

4

1 回答 1

2

这是因为您的查询是在单引号字符串中定义的。该变量$vid不会被插入到单引号字符串中,而是作为文字传递$vid,导致查询语法错误,因为它没有被引用。反转引号,在外面使用双引号。

$STH = $DBH->query("SELECT BookingID, DriverID FROM dbo.VehicleJobHistory WHERE TimeJobRequired > '02/03/2013' AND VehicleID = $vid");

但实际上,这应该通过准备好的语句和bindParam()for来完成VehicleID

$stmt = $DBH->prepare("SELECT BookingID, DriverID FROM dbo.VehicleJobHistory WHERE TimeJobRequired > '02/03/2013' AND VehicleID = :vid");
if ($stmt) {
  $stmt->bindParam(':vid', $vid);
  $stmt->execute();
}

开始阅读PDO 准备好的语句。如果你使用 PDO,你应该确保你得到了他们的安全利益。

于 2013-03-26T02:12:44.343 回答