2017-06-07 2 views
1

Ich versuche, eine Tabelle mit einem dynamischen Namen zu löschen. Ich generiere und manipuliere Tabellen dynamisch, aber dies ist die einfachste der Abfragen.Laravel - PDO - Dynamische Tabellennamen

Alles funktioniert gut, wenn ich rohen PDO verwenden, etwa so:

// PURE PDO VERSION 
$this->db = new PDO(
    'mysql:host=' . $configParams['db_hostname'] 
    . ';port='  . $configParams['db_port'] 
    . ';dbname=' . $configParams['db_name'] 
    . ';charset=utf8mb4', 
    $configParams['db_username'], 
    $configParams['db_password'] 
); 

$this->ps_DeleteTempTable = $db->prepare(
      "DROP TABLE `:tableName`" 
     ); 

Aber wenn ich die Laravel gleiche tun mit, etwa so:

// LARAVEL VERSION 
$pdo = DB::connection()->getPdo(); 

$this->ps_DeleteTempTable = $pdo->prepare(
      "DROP TABLE `:tableName`" 
     ); 

Ich erhalte den folgenden Fehler:

SQLSTATE [42S02]: Basistabelle oder View nicht gefunden: 1146 Tabelle 'testdb.?' existiert nicht

Ich habe mit ähnlichen Zielen auf SO anderen Fragen gesehen, aber sie alle schlagen die erste Abfrage, die ich schrieb nicht Arbeit sein kann, während ich es seit über einem Jahr verwendet haben.

Danke,

+1

Wenn Sie es tatsächlich funktionierten, kann ich das nicht erklären - weil Platzhalter nur für Werte arbeiten sollten, nicht Spalten- oder Tabellennamen – Qirel

+0

Ich habe es funktioniert mit Backticks, ich erstelle/Einfügen/Update/Löschen ohne Probleme. Es ist nur komisch, wenn es durch Laravel geht, hört es auf zu arbeiten. – mils

+0

Das ist ziemlich mysteriös, wenn Sie es tatsächlich funktionierten ... Weil beim Vorbereiten werden einzelne Werte automatisch um Werte hinzugefügt - sollten Sie eine Abfrage erhalten, die aussieht wie 'DROP TABLE \' testdb.'table '\ '' - was ist ungültig. Welche Version von PHP und MySQL hast du ausgeführt? Können Sie zeigen, wie Sie die Bindungen auch ausführen? – Qirel

Antwort

1

Sie sollten den Tabellennamen als Wert hinzu, wenn die SQL-Bau ...

$pdo = DB::connection()->getPdo(); 

$this->ps_DeleteTempTable = $pdo->prepare(
      "DROP TABLE `".$tableName."`" 
     ); 

Sie einige merkwürdige Ergebnisse erhalten könnte, wenn sie als die Namen reserviert werden können, nicht Zecken mit zurück Wörter. Im Allgemeinen ist es besser, die Datenbank so zu gestalten, dass sie nicht verwendet wird, aber einige sind recht häufig (zB 'Bestellung')