Ankündigung

Einklappen
Keine Ankündigung bisher.

Setup erstellen

Einklappen

Neue Werbung 2019

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

  • Setup erstellen

    Hallo zusammen,
    Ich erstell mir gerade ein Setup für den Abschluss meines Projektes (was nun in PDO ist).
    Nun habe ich die Funktionen für Tabellen erstellen, löschen und bearbeiten verstanden.
    Auch wie ich eine neue Datenbank erstelle mit hilfe eines Inputs.
    Nun möchte ich eine Tabelle in den neuen erstellten Datenbank erstellen.
    Ich weiß nur nicht wie ich durch den ersten POST (wo die Datenbank erstellt wird) die ausgabe weitergeben kann
    So sieht es momentan aus
    PHP-Code:
    if(isset($_POST['setup1']))
        {
            
    $datenbank $_POST['add_datenbank'];
            
    $strSQL "CREATE DATABASE `".$datenbank."`";
            
    $st $db->prepare($strSQL);
            
    $st->execute();
        } 
    PHP-Code:
    $db_kartenliste = new Database($DB_TYPE$DB_HOST$DB_NAME$DB_PASS$DB_USER
    Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
    Aber ich nutze diese Version nur auf meinem Rechner.

  • #2
    Du solltest die Datenbank nicht durch dein Installationsskript erstellen lassen, da viele Webhoster keine Berechtigung erteilen direkt über MySQL eine Datenbank zu erstellen.

    Du solltest eher den Datenbankname abfragen und diesen entsprechend verwenden (mit optionalem Tabellenprefix).

    Was meinst du mit Ausgabe weitergeben?
    Hier hast du die Syntax für das erstellen von Tabellen in mySQL: http://dev.mysql.com/doc/refman/5.7/...ate-table.html
    "Software is like Sex, it's best if it's free." - Linus Torvalds

    Kommentar


    • #3
      mach dir darüber keine gedanken.
      Dies soll nur auf meinem Rechner bleiben

      Also wenn ich den Namen duch $_POST['add_datenbank'] erstellt habe.
      Wie kann ich es in new Database einfügen lassen, bez so das der $DB_NAME den namen vom Post bekommt.
      Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
      Aber ich nutze diese Version nur auf meinem Rechner.

      Kommentar


      • #4
        Naja, du musst den Namen der Datenbank irgendwie "speichern"...

        Dazu hast du verschiedene Möglichkeiten. Die Variable $DB_NAME muss ja auch irgendwo her kommen. Ich vermute mal, dass du sie in einer Art config.php oder so definiert hast. Ich erklär mal den typischen Ablauf eines Setups:

        1.) Deine Anwendung wird aufgerufen
        2.) Es wird erkannt, dass die Anwendung noch nicht "installiert" wurde (z.B. durch das fehlen einer config.php, einer config.json oder was auch immer)
        3.) Jetzt wird auf das Setup-Script weiter geleitet
        4.) Die Daten im Setup-Script werden ausgefüllt und dann speichert das Script die Konfiguration ab (config.php)
        5.) Beim nächsten Aufruf erkennt die Anwendung anhand der jetzt vorhandenen config.php, dass sie schon installiert wurde, und leitet nicht mehr auf das Setup, sondern wird gestartet.

        Wahlweise kannst du dann das Setup-Script noch entfernen oder andere Sicherheitsmaßnahmen ergreifen, aber typischerweise läuft es so oder so ähnlich ab.

        Wichtige Aspekte:
        Wenn dein Programm eine Datenbank verwendet, musst du die Zugangsdaten dafür irgendwie anders speichern (also nicht auch in einer Datenbank, die Session reicht auch nicht, denn die ist ja nach Ablauf weg, also muss eine Datei her, das Format der Datei ist dabei egal, solange du es mit PHP einlesen kannst). Wichtig: Falls du nicht php verwendest, achte darauf, dass man die Datei nicht runterladen kann, sonst kann man ganz leicht die Zugangsdaten zur Datenbank abgreifen)

        Noch ein gut gemeinter Rat:
        Dein "Argument", dass das ganze nur auf DEINEM Rechner läuft, ist kein wirkliches Argument. Weder für die Tatsache, dass man eine Datenbank so anlegen kann, wie man möchte, noch dafür, dass du die alte MySQL API verwendest. Ich persönlich fasse das eher als Provokation auf... das ist einer dieser Sprüche, über die man sich wahrscheinlich, wenn man taktlos ist, eher lustig machen würde...
        Tutorials zum Thema Technik:
        https://pilabor.com
        https://www.fynder.de

        Kommentar


        • #5
          Einfach dem Konstruktur übergeben?!
          Btw. ist das oben anfällig für SQL-Injections. Wenn du schon Prepared Statements nutzt, dann doch bitte richtig und nicht als Ersatz für die exec() Methode.
          "Software is like Sex, it's best if it's free." - Linus Torvalds

          Kommentar


          • #6
            1) Hier ist die exec-Methode wohl besser als prepare()->execute();
            1.1) Der Datenbankname ist im Sinne des Topics 'SQL-Injection' ungeschützt.
            2) Praktisch kein Setup, dass ich kenne, erstellt Datenbanken. Vielleicht hat das ja einen Grund!? (Userrechte, Zeichensatz, Namenskollision, ...)
            2.1) Wenn du eine Datenbank erstellst und dabei keinen Zeichensatz angibst, wirst du in vielen Standardkonfigurationen Probleme mit Sonderzeichen bekommen.
            2.1.1) Den Zeichensatz, den du bei der PDO-Verbindung (DSN) zur DB übergibst, gibt nur an, in welchem Zeichensatz die Daten in deiner Applikation vorliegen (sollen). Mysql übersetzt diese dann in den jeweiligen Zeichensatz der Tabelle, bzw. des Feldes. Wenn deine Tabellen und/oder deine Felder keine expliziten Zeichensätze zugewiesen bekommen haben, wird als Fallback der Standardzeichensatz der Datenbank verwendet (das allerdings schon beim Erstellen einer Tabelle).

            Kommentar


            • #7
              wie geschrieben.
              Dieser Setup ist nur für mich und will die Alpha und die momentane Version verknüpfen.
              Ohne jedesmal in den MyAdmin zu gehn und von dort die Tabellen und Spalten erstellen

              rkr
              ich werd das mal versuchen mit der Methode
              Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
              Aber ich nutze diese Version nur auf meinem Rechner.

              Kommentar


              • #8
                Zitat von Germanikus Beitrag anzeigen
                wie geschrieben.
                Dieser Setup ist nur für mich und will die Alpha und die momentane Version verknüpfen.
                Ohne jedesmal in den MyAdmin zu gehn und von dort die Tabellen und Spalten erstellen
                Warum legst du nicht einfach eine SQL-Datei dafür an?

                Kommentar


                • #9
                  Ich hab ein wenig weiter gemacht und hab nun folgende Porbleme.
                  Also ich hab nur ein Update erstellt, wo bestimmte Inhalte wo anders eingetragen werden.

                  1.
                  Hier soll es via WHERE vergleichen ob der Preis bei Briefmarke und Porto gleich sind und wenn ja mit der ID der Briefmarke versehen.
                  Leider klappt das nur mit der Art, aber wenn ich es mit dem Preis mache.
                  Werden nicht alle Felder eingetragen.
                  Also warum wird es nicht richtig eingetragen.
                  PHP-Code:
                  <?php
                  if(isset($_POST['briefmarke']))
                      {
                          foreach(
                  $_POST['add_id'] as $tb_briefmarke_id)
                              {
                                  
                  $tb_briefmarke_preis floatval(str_replace(",""."$_POST['add_preis'][$tb_briefmarke_id]));
                                  
                  $sql "UPDATE
                                              db_porto
                                          SET
                                              tb_porto_briefmarke = :id
                                          WHERE
                                              tb_porto_briefmarke = :art
                                                  AND
                                                      tb_porto_preis = :preis"
                  ;
                                  
                  $stmt $db->prepare($sql);
                                  
                  $stmt->bindParam(':id'$tb_briefmarke_idPDO::PARAM_INT);
                                  
                  $stmt->bindParam(':preis'$tb_briefmarke_preisPDO::PARAM_INT);
                                  
                  $stmt->bindParam(':art'$_POST['add_art'][$tb_briefmarke_id], PDO::PARAM_INT);
                                  
                  $stmt->execute();
                              }
                      }
                  ?>
                  <form method="POST" action="index.php?page=test">
                  <?php
                              $gw_list 
                  = array();
                              
                  $SQL "SELECT
                                          *
                                      FROM
                                          db_briefmarke"
                  ;
                              
                  $rs $db->select($SQL);
                              
                  $gw_list['gw'] = $rs;
                              
                  $page->set($gw_list);
                              
                  extract($gw_list);
                              foreach (
                  $gw as $key => $value):
                  ?>
                  <input type="hidden" class="form-control" name="add_id[<?php echo $gw[$key]['tb_briefmarke_id']; ?>]" value="<?php echo $gw[$key]['tb_briefmarke_id']; ?>">
                  <input type="hidden" class="form-control" name="add_preis[<?php echo $gw[$key]['tb_briefmarke_id']; ?>]" value="<?php echo $gw[$key]['tb_briefmarke_preis']; ?>">
                  <input type="hidden" class="form-control" name="add_art[<?php echo $gw[$key]['tb_briefmarke_id']; ?>]" value="<?php echo $gw[$key]['tb_briefmarke_art']; ?>">
                  <?php
                              
                  endforeach;
                  ?>
                  <button type="submit" id="button" name="briefmarke" class="btn btn-default">Speichern</button>
                  </form>
                  2.
                  Hier wollte ich das ich alle Datums die mit INT abgespeichert wurden, in Datetime gespeichert werden.
                  Einzehln geht es.
                  Aber wenn ich es als Foreach machen will.
                  Geht es nicht
                  PHP-Code:
                  <?php
                  if(isset($_POST['briefmarke']))
                      {
                          foreach(
                  $_POST['add_kaks'] as $tb_rechnung_id)
                              {
                                  
                  $datum $_POST['add_kati'][$tb_rechnung_id];
                                  
                  $rechnung $_POST['add_kaks'][$tb_rechnung_id];
                                  
                  $sql "UPDATE
                                              db_rechnung
                                          SET
                                              tb_rechnung_datum2 = :datum
                                          WHERE
                                              tb_rechnung_id = :rechnung"
                  ;
                                  
                  $statement $db->prepare ($sql);
                                  
                  $statement->bindParam(':rechnung'$rechnungPDO::PARAM_INT);
                                  
                  $statement->bindParam(':datum'$datumPDO::PARAM_INT);
                                  
                  $statement->execute ();
                              }
                      }
                  ?>
                  <form method="POST" action="index.php?page=test">
                  <?php
                              $pm_list 
                  = array();
                              
                  $transfer "SELECT
                                              *
                                          FROM
                                              db_rechnung
                                          WHERE
                                              tb_rechnung_datum2 = 0000-00-00"
                  ;
                              
                  $rs $db->select($transfer);
                              
                  $pm_list['pn'] = $rs;
                              
                  $page->set($pm_list);
                              
                  extract($pm_list);
                              foreach (
                  $pn as $key => $value):
                  ?>
                  <input type="text" name="add_kati[<?php echo $gw[$key]['tb_rechnung_id']; ?>]" value="<?php echo date("Y.m.d HH:mm:SS",$pn[$key]['tb_rechnung_datum']);?>">
                  <input type="text" name="add_kaks[<?php echo $gw[$key]['tb_rechnung_id']; ?>]" value="<?php echo $pn[$key]['tb_rechnung_id'];?>">
                  <?php
                              
                  endforeach;
                  ?>
                  <button type="submit" id="button" name="db_rechnung" class="btn btn-default">Speichern</button>
                  </form>
                  Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
                  Aber ich nutze diese Version nur auf meinem Rechner.

                  Kommentar


                  • #10
                    Wie oft muss man dir eigentlich noch schreiben, dass du mal richtig debuggen sollst? Du klatscht hier regelmeäßig einen Quellcode rein, jammerst, dass das nicht funktioniert, aber selber zu faul, sich die relevanten Variablen mal per echo auszugeben!

                    Eigentlich sollte man deine Threads wegen mangelnder Eigeninitiative regelmäßig schließen!
                    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

                    Kommentar


                    • #11
                      Zustimmung, aber zum Debuggen bitte möglichst nicht echo benutzen, denn Debuggen mit echo ist Murx. Weitere Hinweise findest du hier im Debuggin-Leitfaden.

                      Kommentar


                      • #12
                        Zitat von Germanikus
                        Werden nicht alle Felder eingetragen.
                        Also warum wird es nicht richtig eingetragen.
                        Das "Warum" musst DU herausfinden, nicht wir!

                        Ich zitiere mich hier aus einem anderen Thread - weil es bei dir hier auch so gut passt. Ev. verstehst du dann besser worum es uns geht.

                        Zitat von hausl Beitrag anzeigen

                        "Funktioniert nicht" ist keine gültige Fehlerbeschreibung! Debugge das einfach mal, ist doch eh immer der selbe Prozess.

                        Code hinzuklatschen und "geht nicht" ist zu früh. Du musst es durch Debugging soweit eingrenzen das du den Fehler schon selbst lokalisiert hast. Wenn du dir dann mit der Lösung schwer tust, dann kannst du hier mit konkretem Beispiel/Code posten.

                        Siehe zB hier:

                        - Parameter ausgeben lassen zum Prüfen was genau daherkommt: https://php-de.github.io/jumpto/faq/#debugging

                        - geparste Query ausgeben lassen (nicht abtippen) und schauen ob die korrekt ist.. https://php-de.github.io/jumpto/sql/...query-ausgeben

                        Das ist immer die gleiche Vorgehensweise ... Debuggen.. (Fehler suchen) Gehört zum Programmieren ganz normal dazu. Und wenn man den Fehler gefunden hat, weiß man i.d.R. automatisch schon was zu tun ist um den zu beheben. Das ist *eigenltich* kein Grund für einen Forumsbeitrag um andere die Fehlersuche machen zu lassen.
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar

                        Lädt...
                        X