2

我以前从未使用过 PDO,但最终决定将安全性放在首位,我必须从熟悉的内置 mysql 语句切换到更安全的语句。dbconn.php 中的 db_connect() 函数工作得很好,几乎是从 PDO 教程中复制和粘贴的,并成功地使用多个 SELECT 语句进行了测试。

    include "dbconn.php";

    db_connect();

    //INSERT INTO  `a4331098_VAtest`.`VA_GPS` (`gID` , 'gtruck' , `gLat` , `gLong` , `gAlt` , `gTime`) VALUES (NULL , '434' , '47.558',  '-76.557',  '543',  '0111588448');
    $pTruck = $_POST['gTruck'];
    $pLat = $_POST['gLat'];
    $pLong = $_POST['gLong'];
    $pAlt = $_POST['gAlt'];
    $pTime = $_POST['gTime'];

    //echo $pTruck . "<br />" . $pLat . "<br />" . $pLong . "<br />" . $pAlt . "<br />" . $pTime . "<br /><br />";

    $stmt = $dbconn->prepare("INSERT INTO a4331098_VAtest.VA_GPS VALUES (NULL , ':fTruck' , ':fLat' , ':fLong' , ':fAlt' , ':fTime')");
    $stmt->execute(array(':fTruck' => $pTruck , ':fLat' => $pLat , ':fLong' => $pLong , ':fAlt' => $pAlt , ':fTime' => $pTime));
    $affected_rows = $stmt->rowCount();
    echo $affected_rows;

我知道正确的值被传递给脚本(注释掉的回声告诉我)但由于某种原因 $affected_rows 一直返回 0。数据库的结构是 gID(被传递为 NULL,因为它自动递增)、gTruck、gLat ,gLong,gAlt,gTime。我究竟做错了什么?

4

2 回答 2

5

尝试删除语句中变量周围的引号。PDO 将根据值的类型插入或不插入它们。

于 2012-11-15T14:00:44.687 回答
0

您不必在 PDO :variables 中使用简单的引号。如果你这样做,pdo 将寻找一个名为的列':variable'并且不会使用分配的值。

试试这个 :

 $stmt = $dbconn->prepare("INSERT INTO a4331098_VAtest.VA_GPS VALUES (NULL , :fTruck , :fLat , :fLong , :fAlt , :fTime)");

告诉我们发生了什么$stmt->errorInfo()

祝你好运

编辑

不要忘记,默认情况下,PDO 的变量是用引号插入的,因此它可以防止任何 sql 注入风险并保护您的数据库。

这就是为什么您不需要自己插入引号。

于 2012-11-15T14:04:24.430 回答