用"."创建一个mysql数据库.在名称中(使用php)

Nax*_*x.S 0 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';
Run Code Online (Sandbox Code Playgroud)

我发现一旦从代码中删除.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); 
}
?>
Run Code Online (Sandbox Code Playgroud)

PHP版本:5.6.18 phpmyadmin:4.5.4.1 Ubuntu 14.04

如果我在这里发布了一些帖子错误,请道歉.请让我知道他们,我会尽可能地纠正它.任何帮助是极大的赞赏!

Mar*_*c B 5

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

SELECT foo.bar.baz FROM sometable
         ^---------- database 'foo'
            ^------- table 'bar'
                ^--- field 'baz'
Run Code Online (Sandbox Code Playgroud)

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

SELECT `foo.bar`.baz.qux FROM ...
       ^^^^^^^^^--------- database 'foo.bar'
                  ^------ table 'baz'
                      ^-- field 'qux'
Run Code Online (Sandbox Code Playgroud)

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