2016-07-05 84 views
0

我一直在尝试使用php脚本自动化新数据库创建时遇到了一些麻烦。 基本上,脚本采用新的登录用户名并创建一个数据库(然后稍后插入一些表和数据,这也是通过php脚本完成的)。 我曾经不得不手动创建数据库,但现在需要使其自动化。使用“。”创建mysql数据库在名称(使用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

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

+1

如果你不关心自己,想想其他的开发人员将不得不支持你的代码与这样一个怪异的命名。 –

+0

@aynber谢谢!这很好的解释了这种情况。我以前没有意识到这一点。现在将解决问题。 –

+0

@YourCommonSense如果你也建议我应该如何改变这一点,那么这将是一个很好的建议。我不确定我是否能够改变整个结构,因为我只是在其中一部分工作,但如果真的需要改变,那么我一定会努力。 –

回答

1

尝试用反标记包装数据库名称。

$dbname .= '`.site`'; 
5

.是SQL元字符,使用分隔DB /表/字段名:

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

你应该在任何标识使用的元字符。它只是导致疼痛以后,和不得不做的东西,如:

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

所以,你可以使用反引号,如果你绝对必须的,但你不应该摆在首位做这个。

+0

谢谢。我会试试看。但是,关于不建议使用“。“,将数据库名称的第二部分分开的适当方法是什么(在我的情况下,通过站点) –

+0

假设DB'foo',表'bar'和字段'baz',语法实际上是这样的:'SELECT baz FROM foo.bar'(用于从当前数据库以外的数据库中选择项目)或'SELECT bar.baz FROM foo.bar'(用于消除具有相同列名的表的歧义)。无论如何,您的诊断和解决方案是正确的 – miken32

+0

@ Nax.S:使用'_'下划线或以下内容是mysql允许的:http://dev.mysql.com/doc/refman/5.7/en/identifiers.html –

相关问题