为什么我不能将表名传递给准备好的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相关问答推荐

Laravel:当我想更新我的数据库时,参数太少而无法运行

Woocommerce - 如何使用 echo (php) 将字符串识别为数组

PHP - 获取当前进程的打开文件数量

将 m3u8 播放列表文件转换为 XML 列表

laravel Passport 身份验证代码 - 要求授予权限,是否需要?

使用 PHP 判断 gmail 收件箱中的新邮箱

用于防止 CSRF 的令牌在实时服务器上不起作用

PHP Carbon 不计算时差

Laravel 使用参数创建自定义异常并以 JSON 形式返回

为什么我在创建新项目时会收到​​ laravel 错误?

你如何加密和解密 PHP 字符串?

如何将 Blade 模板视图作为原始 HTML 字符串?

PHP Carbon,获取日期范围之间的所有日期?

PHP7中对象数组的函数返回类型提示

如何在没有 Composer 的情况下安装 Composer PHP 包?

PHP错误:致命错误:常量表达式包含无效操作

在 Docker 中安装 GD

PHP 7 接口,返回类型提示和self

无法创建缓存目录.. 或目录不可写.在 Laravel 中进行无缓存

PHP - 为什么使用 Guzzle 而不是 cURL?