2016-07-05 13 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'; 

私は(それはまだ私が1行に$ dbnameのを組み合わせた場合でも存在)コードから.site一部を削除すると、エラーが消えてしまうことを、私を見つけました。

私がオンラインで見つけた記事によると、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

.別々のDB /テーブル/フィールド名に使用し、SQL内のメタ文字である:

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

ありがとうございます。私はそれを試してみる。しかし、使用を推奨しないことに関しては、 "。"、データベース名の2番目の部分を分ける適切な方法は何ですか(私の場合、サイト単位で) –

+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 –

関連する問題