MySQL表名动态查询是指在SQL查询语句中,表名不是固定的,而是通过变量或参数动态传入的。这种查询方式在某些场景下非常有用,比如需要根据用户输入或配置文件中的信息来决定查询哪个表。
MySQL表名动态查询主要有两种方式:
<?php
$tablename = $_GET['table']; // 假设表名通过GET参数传入
$sql = "SELECT * FROM $tablename WHERE id = 1";
$result = mysqli_query($conn, $sql);
?>
<?php
$tablename = $_GET['table']; // 假设表名通过GET参数传入
$stmt = mysqli_prepare($conn, "SELECT * FROM ? WHERE id = ?");
mysqli_stmt_bind_param($stmt, "si", $tablename, 1);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
?>
原因:传入的表名没有经过严格的验证和过滤,导致恶意用户可以构造恶意SQL语句。
解决方法:
<?php
$allowed_tables = ['table1', 'table2', 'table3'];
$tablename = $_GET['table'];
if (!in_array($tablename, $allowed_tables)) {
die("Invalid table name");
}
$stmt = mysqli_prepare($conn, "SELECT * FROM ? WHERE id = ?");
mysqli_stmt_bind_param($stmt, "si", $tablename, 1);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
?>
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云