为什么我不能将表名传递给准备好的PDO语句?

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

有没有其他安全的方法将表名插入到SQL查询中?有了保险箱,我的意思是我不想这么做

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

推荐答案

Table and Column names CANNOT be replaced by parameters in PDO.

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

function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
            $tbl = 'users';
            break;
    }

    $sql = "SELECT * FROM $tbl";
}

通过不保留默认大小写或使用返回错误消息的默认大小写,您可以确保只使用您希望使用的值.

Php相关问答推荐

尽管包含目标日期,但日期范围比较仍有意外输出

具有重叠捕获组的PHP正则表达式

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

PHP从响应应用程序json获取文件代码和URL

WHERE方法不能与有效查询Laravel一起使用

将下拉 Select 的值从WooCommerce后端保存并显示到前端

Codeigniter 3中SMTP.office 365.com的截断问题

在WooCommerce上克隆订单时使用`add_product()`添加产品元数据

即使在WooCommerce购物车中添加了两次产品,也要将所有项目设置为空白行

Laravel Http::get not working on controller

根据类别的数量折扣更改WooCommerce购物车商品价格

未检测到laravel控制器

使用帖子 ID 更新 wp 帖子

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

WordPress 分页无法正常工作

将 WooCommerce 0 销售价格替换为自定义文本,并保留常规价格删除线

在WooCommerce我的账户单个订单页面中添加订单商品部分和按钮

Laravel auth()->id() 在生产服务器中不工作

标头内容类型:image/jpeg 无效

如何在不复制的情况下在php中重新索引数组