2016-07-05 2 views
0

나는 최근에 PHP 스크립트로 새로운 데이터베이스 생성을 자동화하는 데 어려움을 겪고있다. 기본적으로 스크립트는 새 로그인 사용자 이름을 사용하여 데이터베이스를 만든 다음 나중에 PHP 스크립트를 통해 수행되는 일부 테이블과 데이터를 나중에 삽입합니다. 이전에는 데이터베이스를 수동으로 만들어야했지만 지금은 자동화해야합니다."."을 사용하여 mysql 데이터베이스 만들기 (PHP를 사용하여)

문제는 웹 GUI에서 phpadmin "새 데이터베이스"기능을 사용하여 "test1.siteA", "userb.siteB"와 같은 이름으로 새 데이터베이스를 만들 수있었습니다.

그러나 PHP 스크립트를 통해 동일한 작업을 시도 했으므로 마지막 "반향"에서 "구문에 오류가 있습니다 ..."라는 메시지가 나타납니다.

홈페이지 매개 변수는 다음과 같습니다 나는 오류가 한 번 나는 코드에서 .site 부품을 제거 사라질 것으로 나타났습니다

$name = $user->username; 
$servernm = 'localhost'; 
$usnm = 'user'; 
$pasd = 'user'; 
$dbname = $name; 
$dbname .= '.site'; 

(아직도 내가 1 개 라인에 $의 DBNAME을 결합 할 경우에도 존재한다).

내가 온라인에서 찾은 기사에 따르면, 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 우분투 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 –

관련 문제