postgresql在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请求中收到查询,其中包含我想要的表格和该项目的ID。当我尝试使用两个变量查询时,绑定不会在准备好的语句中发生,而是获得此错误代码

opps:sqlstate [42601]:语法错误:7错误:" $ 1"行1:从$ 1中选择 *,其中ID = 1 ^

从$ 1中选择 *

当我只有直php变量时,它可以正常工作,因此我知道它可以起作用,但是当我想绑定多个多个,它似乎失败并给出以上的变量数字。如果我只是只有一个变量之一,例如代码中的第二个查询,我也可以使它起作用 - 如果我最终拥有想要的变量,而不是我想查找,则只有餐桌点。(IE。 $query = "SELECT * FROM :tableName WHERE id = $idNum"; does not work)我需要清洁变量以防止SQL注入,但是在准备好的语句中将变量绑定而不能这样做。任何帮助将不胜感激!

根据您无法绑定tablename的PHP手册。正如您提到的那样,您可以用变量替换它,但是您不能用占位符替换它。

因此,唯一适合您的解决方案是您上述的查询:

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

这将是您想要的。如果您想使注射安全,则必须找到另一种方法。(例如,正则(。

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

最新更新