Ankündigung

Einklappen
Keine Ankündigung bisher.

CREATE TABLE als Prepared Statement

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • CREATE TABLE als Prepared Statement

    Hallo zusammen

    Ich versuche erfolglos, per PHP eine neue Datenbank-Tabelle zu erstellen. Oder bessergesagt, solange ich den Namen direkt in der MySQL-Query eintrage, funktioniert es, jedoch sollte natürlich als Name der Wert einer Variable verwendet werden. Folgendes Skript habe ich:
    PHP-Code:
             // Datenbank-Tabelle erstellen
            
    $query 'CREATE TABLE ? LIKE tablexy.default';        
            
    $stmt mysqli_stmt_init($verbindung);
            if (
    mysqli_stmt_prepare($stmt$query)) :
                if (!
    $stmt) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                
                
    mysqli_stmt_bind_param($stmt"s"$newsitename);
                
    mysqli_stmt_execute($stmt);
            else :
                echo 
    'prepare fehlgeschlagen, mysqli error: '.mysqli_error($verbindung);
            endif; 
    Der Prepare schlägt fehl, ich hätte einen Fehler in meinem SQL-Syntax:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? LIKE tablexy.default' at line 1

    Weiss jemand, wie das richtig geht?

  • #2
    Warum sollte man Datenbank-Tabellen auf diese Weise erzeugen?

    Ich nehme an, dass das so nicht geht. Warum fällt Normalisierung hier aus?

    Kommentar


    • #3
      Warum denn nicht so?

      Code:
      query = 'CREATE TABLE '.$newsitename.' LIKE tablexy.default';  
      Gruß

      Claus

      Kommentar


      • #4
        Zitat von rkr Beitrag anzeigen
        Warum sollte man Datenbank-Tabellen auf diese Weise erzeugen? (..) Warum fällt Normalisierung hier aus?
        Ich habe eine Master-Datei, die ich kopiere, um in einem kleinen CMS eine neue Seite anzulegen. Ich möchte für jede Datei eine eigene Tabelle, um später möglichst einfach Seiten individuell erweitern zu können.

        Zitat von rkr Beitrag anzeigen
        Ich nehme an, dass das so nicht geht.
        was meinst du genau geht so nicht?

        Kommentar


        • #5
          Zitat von Thallius Beitrag anzeigen
          Warum denn nicht so?

          Code:
          query = 'CREATE TABLE '.$newsitename.' LIKE tablexy.default'; 
          wäre die Abfrage so gegen Injections geschützt? Ich vermeide bis anhin Variabeln in SQL-Statements...

          Nachtrag:
          Ich habe es probiert, es funktioniert auf jeden Fall schon mal


          PHP-Code:
                  $query 'CREATE TABLE '.$newsitename.' LIKE tablexy.default';        
                  
          $stmt mysqli_stmt_init($verbindung);
                  if (
          mysqli_stmt_prepare($stmt$query)) :
                      if (!
          $stmt) :
                          die(
          'mysqli error: '.mysqli_error($verbindung));
                      endif;
                    
                      
          mysqli_stmt_execute($stmt);
                  else :
                      echo 
          'prepare fehlgeschlagen, mysqli error: '.mysqli_error($verbindung);
                  endif; 
          brauche ich da keine Bedenken zu haben?

          Kommentar


          • #6
            Naja, wenn das keine Daten sind, die direkt von Nutzern generiert werden können, dann ist diese Art DDL-Statements auszuführen 'sicher'.

            Es ist eher so: Sobald deine Anwendung neue Tabellen anlegen muss, um ein Ziel zu erreichen, ist das Ziel falsch definiert. Es ist recht unüblich Tabellen mandantenspezifisch zu erweitern. Dafür erstellt man dann eher 1:1 Erweitungstabellen (einmalig, nicht dynamisch via Skript) oder speichert zusätzliche Attribute in einer Attribut-Tabelle (siehe EAV-Datenhaltung).

            Wahrscheinlich ist ein RDBMS einfach das falsche Werkzeug für ein CMS (siehe Apache Jackrabbit, MongoDB/CouchDB, Neo4J, etc).

            Kommentar


            • #7
              ok, vielen Dank für deine Erläuterung. Ich werde mich wohl tiefer in die DB-Thematik einlesen müssen

              Kommentar


              • #8
                Ich dachte es geht vielleicht um ein Installationsskript. Da ist es natuerlich ok Tabellen anzulegen. Ansonten gebe ich rkr natuerlich recht, dass das kein probates Mittel ist für einen normalen workflow.

                Gruß

                Thallius

                Kommentar


                • #9
                  Geht zwar nicht um MYSQLi, hier MySQL PDO: Validieren und Maskieren von Feld- und Tabellennamen mal reinzuschauen kann jedoch nicht schaden.

                  Kommentar

                  Lädt...
                  X