使用准备好的语句绑定标识符和关键字
问题:
创建动态查询使用准备好的语句,但尝试绑定表名、字段名或语法关键字会导致一个空数组。
代码:
function search_db($db, $searchTerm, $searchBy, $searchTable){ try{ $stmt = $db->prepare(' SELECT * FROM ? WHERE ? LIKE ? '); $stmt->bindParam(1, $searchTable); $stmt->bindParam(2, $searchBy); $stmt->bindValue(3, '%'. $searchTerm.'%'); $stmt->execute(); } catch(Exception $e) { return array(); } return $stmt->fetchAll(PDO::FETCH_ASSOC); }
预期结果:
来自数据库的结果数组。
实际结果:
空数组。
原因:
准备好的语句只能绑定数据文字,不能绑定标识符(例如表或字段名称)或语法关键字。
解决方案:
要使用动态标识符或关键字,请按照以下步骤操作步骤:
格式标识符:
白名单动态值:
修改代码:
$field = "`" . str_replace("`", "``", $field) . "`"; $table = "`" . str_replace("`", "``", $table) . "`"; $sql = "SELECT * FROM $table WHERE $field = ?";
关键字:
如果必要时,还可以将动态关键字列入白名单并验证动态关键字。通过遵循这些准则,您可以安全地在准备好的语句中包含动态标识符和关键字。
以上是如何在准备好的语句中安全地使用动态表和字段名称?的详细内容。更多信息请关注PHP中文网其他相关文章!