PDO bindParam / Value无效

时间:2014-05-08 15:19:35

标签: php mysql pdo

我试图让数据库查询页面起作用,但似乎无法这样做。

我的代码到目前为止(这里我尝试了bindValue,但之前尝试过bindParam并得到了相同的结果):

    var_dump($_POST);


    $dbh = new PDO ("mysql:host=$myServer;dbname=$myDB", $myUser, $myPw);
    $columName = $_POST["columName"];
    $tblName = $_POST["tblName"];
    $valueName = $_POST["valueName"];
    $specificValue = $_POST["specificValue"];

    $stmt = $dbh->prepare("SELECT :columName FROM :tblName Where :valueName = :specificValue");
    $stmt->bindValue(":columName", $columName);
    $stmt->bindValue(":valueName", $valueName);
    $stmt->bindValue(":tblName", $tblName);
    $stmt->bindValue(":specificValue", $specificValue);
    $stmt->execute();

    $result = $stmt->fetch();

    if(empty($result)){echo "empty";}
    print_r ($stmt);
    print_r($result);

打印结果和$ stmt带来以下结果:

空 PDOStatement对象([queryString] => SELECT:columName FROM:tblName其中:valueName =:specificValue)

我做错了什么?我有什么办法让它起作用? 我是整个编码的新手,所以请问我是否忘记了任何代码或其他重要信息! 谢谢!

3 个答案:

答案 0 :(得分:2)

占位符参数只能代表查询中的 VALUES 。表,字段名,sql关键字等都不可能使用占位符。

如果你需要构建一个动态查询并替换字段/表名,那么你将不得不使用好的旧字符串构造方法,并且要知道你将再次向SQL injection attacks开放:< / p>

$sql = "SELECT * FROM $foo WHERE $bar = :baz";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':baz', $baz);

答案 1 :(得分:1)

我担心您需要重新考虑参数化查询的工作原理。这不仅仅是以安全的方式神奇地插入数据的情况。它是关于查询的结构数据之间的distingushing。

因此,数据库名称,列名称,表名称和任何SQL关键字都是查询结构的一部分。每次运行查询时,它们都是相同的。

但是,数据可以在运行查询之间发生变化。

因此,在准备查询时,结构需要到位。但是,由于SQL注入原因,您显然不能将$columName变量等插入查询中。如果你真的需要这样的灵活查询(你可能不这样做),你需要在你的代码中创建一个允许值的白名单,或者从数据库中检索。

答案 2 :(得分:0)

您的查询无效(您正在使用对象标识符的参数),但您没有收到任何通知,因为您既没有配置PDO来抛出异常也没有手动调用错误检查功能。

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION选项添加到PDO的构造函数:

$dbh = new PDO ("mysql:host=$myServer;dbname=$myDB", $myUser, $myPw, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

一旦你这样做,你就会在确切的问题上得到一个例外的例外:

  

PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064   您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   ''user'附近'[=]

中第1行的'login'='john''

正如您所看到的,这是尝试运行类似(例如)的查询:

SELECT 'user_id'
FROM 'user'
Where 'login' = 'john'

此外,请注意SQL注入。使用$_POST中的数据撰写SQL查询非常不安全。