我最近遇到了一些麻烦,试图用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
如果我在这里发布了一些帖子错误,请道歉。请让我知道他们,我会尽可能地纠正它。非常感谢任何帮助!
答案 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`';