【问题标题】:Postgresql not binding in prepared statement for SELECT in PHPPostgresql 在 PHP 中的 SELECT 准备语句中没有绑定
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2014-09-27
      相关资源
      最近更新 更多