参数化语句可以处理表名称吗?
您在尝试在准备好的语句中参数化表名称时遇到了问题。分隔旨在防止 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中文网其他相关文章!