用“。”创建一个mysql数据库。在名称中(使用php)

时间:2016-07-05 16:06:33

标签: php mysql

我最近遇到了一些麻烦,试图用PHP脚本自动化新的数据库创建。 基本上,脚本获取新的登录用户名并创建一个数据库(然后稍后插入一些表和数据,这也是通过php脚本完成的)。 我曾经不得不手动创建数据库,但现在需要使其自动化。

问题是我以前只能使用web GUI中的phpadmin“new database”函数创建一个新数据库,并输入“test1.siteA”,“userb.siteB”等名称。

然而,既然我已经尝试通过php脚本做同样的事情了,它会不断给我“你的语法错误......”来自我上一次的“回声”。

主要参数是:

$name = $user->username;
$servernm  = 'localhost';
$usnm = 'user';
$pasd  = 'user';
$dbname  = $name;
$dbname .= '.site';

我发现一旦从代码中删除.site部分,错误就会消失(即使我将$ dbname合并为1行,它仍然存在)。

根据我在网上发现的一些文章,似乎MySQL不允许使用像“。”这样的特殊字符。要包含在数据库名称中。

对我来说,似乎很奇怪,“。site”可以通过phpMyadmin手动添加,而php / mysqli脚本不允许这样做。

完整的脚本如下(我确信它可以大大改进,所以也欢迎任何有关这方面的建议):

<?php
define("_VALID_PHP", true);
require_once(APPPATH. "/libraries/init.php");
include (BASEPATH . "/database/DB_temp.php");
$row = $user->getUserData();

$name = $user->username;
$servernm  = 'localhost';
$usnm = 'user';
$pasd  = 'user';
$dbname  = $name;
$dbname .= '.site';


// Create connection
$conn = mysqli_connect($servernm, $usnm, $pasd);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// Check if DB exist 
$sql = "SELECT count(SCHEMA_NAME) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$dbname'";

$check = mysqli_query($conn,$sql)
or die("Connection failed: " . mysqli_connect_error()); 

while($row = mysqli_fetch_array($check,MYSQLI_NUM))
       {
        $dbval = $row[0];
    }   

if ($dbval == "0") 
{
    $createsql = "CREATE DATABASE '$dbname' ";
}
if ($dbval == "1") 
{
    $createsql = "SELECT count(SCHEMA_NAME) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$dbname'";
}
if (mysqli_query($conn, $createsql)) {
Echo "Completed. DBVAL= " .$dbval ;
}
else
{
echo "Error creating database: " . mysqli_error($conn); 
}
?>

PHP版本:5.6.18 phpmyadmin:4.5.4.1 Ubuntu 14.04

如果我在这里发布了一些帖子错误,请道歉。请让我知道他们,我会尽可能地纠正它。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

.是SQL中的元字符,用于分隔db / table / field名称:

SELECT foo.bar.baz FROM sometable
         ^---------- database 'foo'
            ^------- table 'bar'
                ^--- field 'baz'

您应 NOT 在任何标识符中使用元字符。它只会导致以后的痛苦,并且必须做以下事情:

SELECT `foo.bar`.baz.qux FROM ...
       ^^^^^^^^^--------- database 'foo.bar'
                  ^------ table 'baz'
                      ^-- field 'qux'

所以如果你绝对必须使用反引号,但你不应该首先这样做。

答案 1 :(得分:1)

尝试用后面的刻度包装数据库名称。

$dbname .= '`.site`';