【发布时间】:2018-07-31 18:51:38
【问题描述】:
<?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" LINE 1 或附近的语法错误: SELECT * FROM $1 WHERE id = 1 ^
当我只有直接的 PHP 变量时,它工作正常,所以我知道它可以工作,但是当我想绑定多个时,它似乎失败并给出一个变量号,如上所述。
如果我只是绑定了一个变量,例如代码中的第二个注释掉的查询,我也可以让它工作 - 这只有在我最后有我想要的变量而不是如果我想查找时才有效表点。 (IE。
$query = "SELECT * FROM :tableName WHERE id = $idNum"; does not work)
我需要清理变量以防止 SQL 注入,但如果不将变量绑定在准备好的语句中,我就无法做到这一点。任何帮助将不胜感激!
【问题讨论】:
标签: php postgresql select prepared-statement