2016-07-05 4 views
0

Ich hatte in letzter Zeit einige Probleme mit dem Versuch, neue Datenbank-Kreationen mit einem PHP-Skript zu automatisieren. Grundsätzlich nimmt das Skript den neuen Login-Benutzernamen an und erstellt eine Datenbank (und fügt später einige Tabellen und Daten ein, was ebenfalls über ein PHP-Skript erfolgt). Früher musste ich die Datenbank manuell erstellen, aber jetzt muss sie automatisiert werden.Erstellen einer MySQL-Datenbank mit "." im Namen (mit PHP)

Das Problem ist, dass ich in der Lage war, einfach eine neue Datenbank mit der phpadmin "new database" -Funktion von der Web-GUI zu erstellen und Namen wie "test1.siteA", "userb.siteB" einzufügen.

Allerdings habe ich versucht, das gleiche über PHP-Skript zu tun, es hält mir die "Sie haben einen Fehler in der Syntax ..." von meinem letzten "Echo".

Hauptparameter sind:

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

ich gefunden habe, dass der Fehler einmal verschwinden würde ich den .Site Teil aus dem Code entfernen (es gibt sie noch, auch wenn ich die $ dbname in 1 Zeile kombinieren).

Laut einigen Artikeln, die ich online gefunden habe, scheint es, dass MySQL keine Sonderzeichen wie "." in den Datenbanknamen aufgenommen werden.

Es scheint mir sehr seltsam, dass die ".site" manuell über phpMyadmin hinzugefügt werden kann, während das php/mysqli Skript dies nicht erlaubt.

Das vollständige Skript ist wie folgt (ich bin sicher, es kann stark verbessert werden, so in Bezug auf irgendwelche Vorschläge, die auch willkommen sind):

<?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-Version: 5.6.18 phpMyAdmin: 4.5.4.1 Ubuntu 14.04

Entschuldigung, wenn ich hier einige Buchungsfehler gemacht habe. Lass es mich wissen und ich werde versuchen, es so gut wie möglich zu korrigieren. Jede Hilfe wird sehr geschätzt!

+1

Wenn Sie sich nicht selbst kümmern, denken Sie an andere Entwickler, die Ihren Code mit solch einer seltsamen Benennung unterstützen müssen. –

+0

@aynber Danke! Das erklärt die Situation ziemlich genau. Das habe ich vorher nicht bemerkt. Wird die Frage jetzt schließen. –

+0

@YourCommonSense Wäre ein großartiger Ratschlag, wenn Sie auch vorschlagen, wie ich das ändern sollte. Ich bin nicht sicher, ob ich in der Lage sein werde, die gesamte Struktur zu ändern, da ich nur an einem Teil davon arbeite, aber wenn es wirklich geändert werden muss, werde ich es definitiv versuchen. –

Antwort

1

versuchen, den Datenbanknamen mit Back-Ticks zu umhüllen.

$dbname .= '`.site`'; 
5

. ist ein Meta-Zeichen in SQL verwenden db/Tabelle/Feldnamen zu trennen:

SELECT foo.bar.baz FROM sometable 
     ^---------- database 'foo' 
      ^------- table 'bar' 
       ^--- field 'baz' 

sollten Sie NICHT in beliebigen Bezeichner verwenden Metazeichen sein. Es führt nur später zu Schmerzen, und mit Sachen wie zu tun:

SELECT `foo.bar`.baz.qux FROM ... 
     ^^^^^^^^^--------- database 'foo.bar' 
        ^------ table 'baz' 
         ^-- field 'qux' 

So können Sie Backticks verwenden, wenn Sie unbedingt haben, aber man sollte dies nicht in erster Linie tun.

+0

Danke. Ich werde das ausprobieren. Allerdings in Bezug auf nicht zu empfehlen zu verwenden "."Was wäre der geeignete Weg, um den zweiten Teil der Datenbanknamen zu trennen (in meinem Fall nach Standort?) –

+0

Angenommen, DB' foo', Tabelle 'bar' und Feld' baz', ist die Syntax tatsächlich so : 'SELECT baz FROM foo.bar' (wird verwendet, um Elemente aus einer anderen Datenbank als der aktuellen auszuwählen) oder' SELECT bar.baz FROM foo.bar' (wird verwendet, um Tabellen mit identischen Spaltennamen zu disambiguieren.) Unabhängig davon, Ihre Diagnose und Lösung ist korrekt – miken32

+0

@ Nax.S: Verwenden Sie einen _ _ Unterstrich oder etwas. Hier ist, was mysql ermöglicht: http://dev.mysql.com/doc/refman/5.7/en/identifiers.html –

Verwandte Themen