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"
这就是您要找的。如果你想让它安全注射,你必须找到另一种方法。 (例如正则表达式)。
<?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"
这就是您要找的。如果你想让它安全注射,你必须找到另一种方法。 (例如正则表达式)。