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

时间:2019-07-09 07:50:06

标签: php mysql mysqli

我正在为atm工作的自己的CMS编写了一个安装文件。我更改了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);

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

我只会在表名周围添加backticks,因此它将始终生成正确的标识符名称。并且也可以添加正则表达式验证,以避免人为错误。

相关问题