<?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