我为我自己的 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/