2016-07-05 92 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 –