PHP PDO Prepared Statement不起作用

时间:2013-12-02 20:09:15

标签: php pdo

<?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,所以如果我做错了或者做错了,请告诉我。

我正在为我的客户创建一个数据库管理系统,如果用户不存在,他们可以创建一个用户,然后创建一个数据库并查看信息。如果有人有兴趣帮助完成它,我将非常感激!

1 个答案:

答案 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);
}