Postgresql 未在 PHP 中的 SELECT 的准备语句中绑定

Postgresql not binding in prepared statement for SELECT in PHP

<?php
try 
{
   global $db;
   $user = 'postgres';
   $password = '*****'; //For security
   $db = new PDO('pgsql:host=localhost;dbname=dnd', $user, $password);
   $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch (PDOException $ex)
{
   echo 'ERROR!!: ' . $ex->getMessage();
   die();
}

   $table = htmlspecialchars($_REQUEST['table']);
   $idNum = htmlspecialchars($_REQUEST['id']);

try {
   //$query = "SELECT * FROM $table WHERE id = $idNum";  This works
   //$query = "SELECT * FROM $table WHERE id = :number"; This works 

   $query = "SELECT * FROM :tableName WHERE id = :number";
   $statement = $db->prepare($query);
   $statement->bindValue(":tableName", $table, PDO::PARAM_STR);
   $statement->bindValue(":number", $idNum, PDO::PARAM_INT); 
   $statement->execute();
   $info = $statement->fetchAll(PDO::FETCH_ASSOC);

} catch (PDOException $excep) {
   echo "Opps: " . $excep->getMessage();
   die();
}

好吧,我要发疯了,试图让它发挥作用。 我有一个数据库设置,我需要从中查询。我收到来自 AJAX 请求的查询,其中包含我想要的 table 的名称和项目的 ID。当我尝试使用这两个变量进行查询时,绑定不会出现在准备好的语句中,而是出现此错误代码

Opps:SQLSTATE[42601]:语法错误:7 错误:“$1”处或附近的语法错误 第 1 行:SELECT * FROM $1 WHERE id = 1 ^

当我只有直接的 PHP 变量时,它工作正常,所以我知道它可以工作,但是当我想绑定多个时,它似乎失败并给出一个变量号,如上。 如果我只是绑定了一个变量,例如代码中第二个注释掉的查询,我也可以让它工作——这只适用于我最后有我想要的变量,而不是如果我想查找table现货。 (IE。 $query = "SELECT * FROM :tableName WHERE id = $idNum"; does not work) 我需要清理变量以防止 SQL 注入,但如果不在准备好的语句中绑定变量,我就无法做到这一点。如有任何帮助,我们将不胜感激!

根据 PHP 手册,您不能绑定表名。正如您提到的,您可以用变量替换它,但不能用占位符替换它。

所以唯一适合您的解决方案是您上面的查询:

$query = "SELECT * FROM $table WHERE id = :number"

这就是您要找的。如果你想让它安全注射,你必须找到另一种方法。 (例如正则表达式)。

参考:http://us3.php.net/manual/en/book.pdo.php#69304