用于表和列的PDO bindValue

时间:2013-12-07 17:38:56

标签: php pdo bindvalue

好的,我发现我不能使用占位符来表名和列

$table = 'users';

$stmt = $db->prepare('SELECT * from ?');
$stmt->bindValue(1, $rable, ??);

那么什么才能真正替代动态表名?

$stmt = $db->prepare('SELECT * from '.$table);

这很容易受到攻击。 escape_string是否有PDO方法?我查看了手册,但似乎没有抓到一本。我发现的只有quote,但这对表和列不起作用。有什么方法可以安全地实现此功能,还是我必须切换回使用mysqli

3 个答案:

答案 0 :(得分:0)

对于转义字符串

从链接:http://php.net/manual/en/pdo.prepare.php

为将使用不同参数值多次发出的语句调用PDO :: prepare()和PDOStatement :: execute()通过允许驱动程序协商客户端和/或服务器端缓存来优化应用程序的性能查询计划和元信息,并通过消除手动引用参数的需要,有助于防止SQL注入攻击。

准备值仅适用于字段。

关于动态表名称

将表名附加到查询中,就像你在第二个语句中所做的那样。

示例

$pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS);

$query = $pdo->prepare("DESCRIBE :table");

$query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table));

$query->execute();

while($field = $query->fetch(PDO::FETCH_NUM)){
    var_dump($field);
    //do something
}

unset($pdo);

答案 1 :(得分:0)

Bindable Marks(?)或Bindable named Marks(:foo)无法显示为表名或(伪动态)字段名。两者都限于字段值。

您应避免在应用程序内部使用动态表。只需将数据库规范化为更灵活,更智能的结构。

答案 2 :(得分:0)

如果您使用刻度线,那么您可以简单地替换用户输入中的刻度,您应该没问题:

$column = 'foo';
$table = 'bar';

$query = 'SELECT ' . $column . ' FROM ' . $table; // Insecure!

$query = 'SELECT `' . str_replace('`', '', $column) . '` FROM `' . str_replace('`', '', $table) . '`'; // Not insecure