我最近遇到了一些麻烦,试图用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
如果我在这里发布了一些帖子错误,请道歉.请让我知道他们,我会尽可能地纠正它.任何帮助是极大的赞赏!
. 是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)
所以如果你绝对必须使用反引号,但你不应该首先使用反引号.