gpt4 book ai didi

php - MYSQLi 创建数据库用 ?作为名字

转载 作者:行者123 更新时间:2023-11-29 04:32:26 25 4
gpt4 key购买 nike

我为我自己的 CMS 写了一个安装文件,我在 atm 上工作。我更改了 SQL 语句以使其更省事,但现在没有任何效果,而且我不明白为什么...

我更改我的代码:

$db = new mysqli($_POST['db_ip'], $_POST['db_user'], $_POST['db_key'], '', $_POST['db_port']);
if(!$db) {
exit('Connection error to database');
}
$query = "CREATE DATABASE IF NOT EXISTS $db_name;";
$ergebnis = mysqli_query($db, $abfrage);

到:

$db = new mysqli($_POST['db_ip'], $_POST['db_user'], $_POST['db_key'], '', $_POST['db_port']);
if(!$db) {
exit('Error connecting to database'); //Should be a message a typical user could understand in production
}
$db_name = $_POST['db_name'];
$query = "CREATE DATABASE IF NOT EXISTS ?;";
$stmt->bind_param('s', $db_name);
$stmt = $db->prepare($query);
$stmt->execute();

我什至试过:

$db = new mysqli($_POST['db_ip'], $_POST['db_user'], $_POST['db_key'], '', $_POST['db_port']);
if(!$db) {
exit('Error connecting to database'); //Should be a message a typical user could understand in production
}
$db_name = $_POST['db_name'];
$query = mysqli_prepare "CREATE DATABASE IF NOT EXISTS ?;";
mysqli_stmt_bind_param($query, 's', $db_name);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);

最后一个给我添加了一个数据库,但是带有 ?作为名字...

我希望这里有人可以帮助我。

最佳答案

并非每个 SQL 语句都支持准备好的语句。 CREATE DATABASE 就是其中之一。

因此,作为一般规则,您应该从白名单 中选择数据库/表名称。

然而,在您的特定情况下,当用户显然是数据库所有者时,保护他们免受 SQL 注入(inject)没有多大意义,因为他们显然拥有数据库密码并且可以运行任何 SQL 语句都更方便。 因此您无需更改代码。只需将其恢复为常规 query() 调用即可。

我只会在表名周围添加 反引号,这样它就会始终生成正确的标识符名称。并且还可以添加正则表达式验证,只是为了避免人为错误。

关于php - MYSQLi 创建数据库用 ?作为名字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947750/

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