我正在为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);
最后一个为我添加了一个数据库,但带有?作为名字...
我希望这里有人可以帮助我。
答案 0 :(得分:4)
并非每个SQL语句都支持预备语句。而CREATE DATABASE就是其中之一。
因此,作为一般规则,应该从白名单中选择数据库/表名。
但是,在您的特定情况下,当用户显然是数据库所有者时,保护他们免受SQL注入没有多大意义,因为他们显然具有数据库密码并且可以运行任何SQL语句都更加便捷。因此,您将代码更改为零。只需将其恢复为常规的query()
调用即可。
我只会在表名周围添加backticks
,因此它将始终生成正确的标识符名称。并且也可以添加正则表达式验证,以避免人为错误。