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

标签 php mysql mysqli

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

相关文章:

php pdo 递减高于已删除值的值

PHP MYSQL 将字符串字段返回为数字

PHP mysqli 查询检查一行是否存在

mysql - 使用外键创建 mysql 表时出错

mysql - 正则表达式将 PCRE 转换为 POSIX,以便在 MySQL 查询中使用正则表达式

php - 测试 PHP 脚本的 MySQL 用户的权限

php - 为什么我的 or die() 函数不起作用

javascript - 如何使用php在浏览器关闭时更新表值

javascript - 在 JQuery 中比较两个相同的字符串返回 false

插入 MySQL 数据库的 PHP PDO 代码不起作用