MySQL 动态表名是指在 SQL 查询中,表名不是固定的,而是根据某些条件或变量动态生成的。这种技术在处理大量数据、多租户系统或需要灵活切换数据源的场景中非常有用。
以下是一个基于变量的动态表名示例:
SET @tablename = 'users_2023';
SELECT * FROM @tablename WHERE id = 1;
原因:直接将用户输入拼接到 SQL 查询中,可能导致 SQL 注入攻击。
解决方法:使用预处理语句(Prepared Statements)来防止 SQL 注入。
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 用户输入的表名
$tableName = $_GET['table'];
// 预处理语句
$stmt = $conn->prepare("SELECT * FROM ? WHERE id = ?");
$stmt->bind_param("si", $tableName, $id);
// 绑定参数并执行
$id = 1;
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
$stmt->close();
$conn->close();
?>
注意:MySQL 不支持直接在 PREPARE
语句中使用变量作为表名。因此,这种方法在某些情况下可能不适用。更安全的做法是使用白名单机制,只允许特定的表名。
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云