1

リモートMSSQLサーバーへのPDO接続で実行したいかなり単純なクエリがあります。

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()ます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 に答える