Heim  >  Fragen und Antworten  >  Hauptteil

Können PHP-PDO-Anweisungen Tabellen- oder Spaltennamen als Parameter akzeptieren?

Warum kann ich keinen Tabellennamen an eine vorbereitete PDO-Anweisung übergeben?

$stmt = $dbh->prepare('SELECT * FROM :table WHERE 1');
if ($stmt->execute(array(':table' => 'users'))) {
    var_dump($stmt->fetchAll());
}

Gibt es eine andere sichere Möglichkeit, Tabellennamen in SQL-Abfragen einzufügen? Mit Sicherheit meine ich, dass ich es nicht tun möchte

$sql = "SELECT * FROM $table WHERE 1"


P粉702946921P粉702946921389 Tage vor619

Antworte allen(2)Ich werde antworten

  • P粉138711794

    P粉1387117942023-10-18 11:56:39

    要了解为什么绑定表(或列)名称不起作用,您必须了解准备好的语句中的占位符如何工作:它们不是简单地替换为(适当转义的)字符串,并执行生成的 SQL。相反,要求“准​​备”语句的 DBMS 会针对如何执行该查询提出完整的查询计划,包括将使用哪些表和索引,无论您如何填写占位符,这些计划和索引都是相同的。< /p>

    SELECT name FROM my_table WHERE id = :value 的计划将与您替换 :value 的内容相同,但表面上相似的 SELECT name FROM :table WHERE id = :value 无法计划,因为 DBMS 不知道您实际要从中选择哪个表。

    这也不是像 PDO 这样的抽象库可以或应该解决的问题,因为它会破坏准备好的语句的 2 个关键目的:1)允许数据库提前决定如何运行查询,以及多次使用同一个计划; 2) 通过将查询逻辑与变量输入分离来防止安全问题。

    Antwort
    0
  • P粉978742405

    P粉9787424052023-10-18 09:40:36

    表名和列名不能用 PDO 中的参数替换。

    在这种情况下,您只需手动过滤和清理数据。实现此目的的一种方法是将简写参数传递给将动态执行查询的函数,然后使用 switch() 语句创建用于表名称的有效值白名单或列名。这样,用户输入就不会直接进入查询。例如:

    function buildQuery( $get_var ) 
    {
        switch($get_var)
        {
            case 1:
                $tbl = 'users';
                break;
        }
    
        $sql = "SELECT * FROM $tbl";
    }

    通过不保留默认情况或使用返回错误消息的默认情况,您可以确保只使用您想要使用的值。

    Antwort
    0
  • StornierenAntwort