2013-03-26 121 views
1

我有一個合理簡單的查詢,我想用我的PDO連接運行到遠程MSSQL服務器。PHP PDO - dblib 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"; 

任何幫助將非常感激。

回答

2

這是由於您的查詢是用單引號字符串定義的。變量$vid沒有在單引號字符串中插入,而是作爲文字$vid傳遞,導致查詢語法錯誤,因爲它沒有被引用。反轉引號,在外部使用雙引號。

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

真的不過,這應該是用事先準備好的聲明,bindParam()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 prepared statements。如果你正在使用PDO,你應該確保你獲得他們的安全利益。