<?php
function CreateDatabase($username, $database)
{
global $con;
if($con) {
$createdatabase = $con -> prepare("
CREATE DATABASE ?");
$createdatabase -> execute(array($database));
$createdatabase = $con -> prepare("
GRANT ALL
ON
?.*
TO
?@'localhost'");
$createdatabase -> execute(array($database, $username));
$createdatabase = $con -> prepare("
FLUSH PRIVILEGES");
$createdatabase -> execute();
return true;
}
return false;
}
由于某种原因,这段代码不会以应有的方式运行。我四倍检查字符串$ username和$ database是否正确传递。
你能在这里看到任何错误吗?有关如何解决此问题的任何提示,提示? 刚刚开始学习PDO,所以如果我做错了或者做错了,请告诉我。
我正在为我的客户创建一个数据库管理系统,如果用户不存在,他们可以创建一个用户,然后创建一个数据库并查看信息。如果有人有兴趣帮助完成它,我将非常感激!
答案 0 :(得分:0)
正如其他评论所述,参数仅适用于动态值,而不适用于数据库/表/列名称的标识符。可以这样想:如果您可以想象代替参数的单引号字符串文字,引用数据文字或数字文字,那么它就是参数的好地方。
如果要避免SQL注入数据库名称,请根据规则过滤用户的输入。例如,告诉他们他们的数据库名称必须只包含字母数字字符和下划线。然后通过剥离不在该集合中的任何字符强制该规则:
$database = preg_replace('/[^\w]/', '', $_POST['database']);
还要确保他们不能放弃其他人的数据库或系统数据库!
$system_dbs = ['mysql', 'information_schema', 'performance_schema'];
if (array_search($database, $system_dbs)) {
trigger_error("You can't do that.", E_USER_ERROR);
}