首页 >后端开发 >php教程 >准备好的语句可以参数化 SQL 中的表名吗?

准备好的语句可以参数化 SQL 中的表名吗?

Barbara Streisand
Barbara Streisand原创
2024-12-24 21:17:37311浏览

Can Prepared Statements Parameterize Table Names in SQL?

参数化语句可以处理表名称吗?

您在尝试在准备好的语句中参数化表名称时遇到了问题。分隔旨在防止 SQL 注入的变量会导致错误。

您提供的代码包含函数 insertRow,该函数尝试将新表名绑定为问号语句。

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
    $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}

不幸的是,在准备好的语句中参数化表名是不可能的。准备好的语句仅允许将参数绑定到 SQL 语句的“值”元素。表名不是运行时值,会改变语句的有效性,从而可能改变其含义。

即使像 PDO 这样的数据库接口允许在任何地方进行占位符替换,表占位符的值也将是包含在SQL,导致无效的 SQL。

为了防止 SQL 注入,必须使用表白名单并根据此列表检查用户输入。您的代码应类似于以下内容:

if (in_array($mytable, $whitelist)) {
    $result = $db->query("SELECT * FROM {$mytable}");
}

以上是准备好的语句可以参数化 SQL 中的表名吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn