gpt4 book ai didi

php - 使用 MySQLi 的动态表名称和预准备语句

转载 作者:行者123 更新时间:2023-11-29 06:28:13 25 4
gpt4 key购买 nike

我需要在查询中使表名动态化。我读到你不能像使用参数那样绑定(bind)它们,所以我想我会做这样的事情:

$table_unsafe = $_GET['table'];
$table_safe = get_safe_table($mysqli, $table_unsafe);
$query = "SELECT * FROM " . $table_safe . " WHERE user=?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $user_id);

function get_safe_table($mysqli, $table)
{
$query = "SELECT table_name FROM tables WHERE table_name=?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('s', $table);
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_row();
if ($result) {
return $result[0];
} else {
exit;
}
}

tables只是一个包含所有可用表名称的表:

+-----+------------------+
| id | table_name |
+-----+------------------+
| 1 | user_statistics |
| 2 | user_information |
| ... | ... |
+-----+------------------+

这种做法安全吗?如果没有,我该怎么做才能使其更安全?我之所以将可用表放在一个表中,是因为我拥有的表数量(+300)。每次创建新表时,我只需向 tables 添加一行,而不必一直更新我的代码。没有可以插入或更新的公共(public)代码。

最佳答案

是的,这是可能的,但是你不必创建一个表来保存表名并手动维护它——当然mysql已经有这样的表了。所以可能只是

$sql = "SELECT 1 FROM information_schema.TABLES 
WHERE TABLE_NAME = ? AND TABLE_SCHEMA IN (SELECT DATABASE())";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $table);
$stmt->execute();
return (bool)$stmt->get_result()->fetch_row();

但是,用法应该有点不同。仅使用空表名运行诸如 SELECT * FROM WHERE 之类的查询是没有意义的。您应该只验证函数的结果,并在结果为空时抛出错误。

关于php - 使用 MySQLi 的动态表名称和预准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58282933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com