Ankündigung

Einklappen
Keine Ankündigung bisher.

Allgemeine Frage für Neueinsteiger

Einklappen

Neue Werbung 2019

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

  • Allgemeine Frage für Neueinsteiger

    Hallo, ich befasse mich nun doch wieder etwas mehr mit PHP. Ich hätte da zuerst mal die Frage was ich an diesem Code verbessern könnte:
    config.php
    PHP-Code:
    <?php

    define
    ('DB_TYPE''mysql');
    define('DB_HOST''localhost');
    define('DB_NAME''learn');
    define('DB_USERNAME''root');
    define('DB_PASSWORD''');

    try {
        
    $dbh = new PDO(DB_TYPE ':host=' DB_HOST ';dbname=' DB_NAMEDB_USERNAMEDB_PASSWORD);
    } catch (
    PDOException $e) {
        die(
    $e->getMessage());
    }
    index.php
    PHP-Code:
    <?php

    include('include/config.php');

    if (!isset(
    $_GET['id'])) {
        
    $query "SELECT * FROM entrys";
        
    $stmt $dbh->prepare($query);
        
    $stmt->execute();
        while (
    $row $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo 
    '<h1><a href="?id=' $row['id'] . '">' $row['title'] . '</a></h1>';
            echo 
    date('d.m.Y - H:i:s'strtotime($row['date']));
            echo 
    '<div>' $row['teaser'] . '</div>';
        }
    } else {
        
    $id htmlspecialchars($_GET['id']);
        
    $query "SELECT * FROM entrys WHERE id = :id";
        
    $stmt $dbh->prepare($query);
        
    $stmt->bindValue(':id'$id);
        
    $stmt->execute();
        while (
    $row $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo 
    '<h1>' $row['title'] . '</h1>';
            echo 
    date('d.m.Y - H:i:s'strtotime($row['date']));
            echo 
    '<div>' $row['text'] . '</div>';
        }
    }
    Es ist eine simple Abfrage von Werten aus der Datenbank. Mir geht es in erster Linie darum, ob der Code an sich korrekt ist oder was ich besser machen kann.

    Zweitens würde ich gerne versuchen, die Querys in Funktionen / Klassen zu packen. Könnt Ihr mir hier weiterhelfen?
    Ich brauche eine Funktion um alle Datensätze ausgeben zu lassen oder eben nur welche einer bestimmten id.

    Danke für eure Mühe.

    MfG


  • #2
    Naja ne Abkürzung wäre dies hier:
    PHP-Code:
    $id $_REQUEST['id'];
    $stmt =  "SELECT * FROM dat_entrys WHERE id LIKE '%".$id."%'"
    so bräuchtest du das If nicht.
    Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

    Kommentar


    • #3
      Vielen Dank, das hilft mir auf jeden Fall weiter. Habe aber noch ein isset() drum gesetzt, weil er sonst meckert.
      PHP-Code:
      $id = isset($_REQUEST['id']);
      $stmt "SELECT * FROM entrys WHERE id LIKE '%" $id "%'";
      foreach (
      $dbh->query($stmt) as $row) {
          echo 
      '<h1><a href="?id=' $row['id'] . '">' $row['title'] . '</a></h1>';
          echo 
      date('d.m.Y - H:i:s'strtotime($row['date']));
          echo 
      '<div>' $row['text'] . '</div>';

      Blöd ist allerdings nur, dass mir dann immer die selben Felder ausgegeben werden.
      Jetzt brauche ich nur noch eine function, die genau das macht. So spare ich mir die Query jedes mal.

      Kommentar


      • #4
        Aber bitte die Daten nicht unescaped in die Datenbank bringen, sonst hast du viele andere Probleme. Zauberwort nennt sich SQL - Injection.
        Eine Alternative wären auch Prepared Statements.

        PHP-Code:
        # Bei dir prüft er nur, ob vorhanden oder nicht, du bekommst aber nicht die Id
        # Daher bitte, wenn dann so schreiben. ggf. auch array_key_exists

        $id = isset($_REQUEST['id']) ? $_REQUEST['id'] : '';

        # Noch ohne Escapefunktion, bitte anpassen. 
        Github_Cyrix
        Laravelgemeinschaft bei php.de
        Laravel Chat

        Kommentar


        • #5
          @tomahawk: Ist falsch. $id bekommt jetzt den Rückgabewert von isset(). Vor allem, wie soll denn deine Query aussehen, wenn $_REQUEST['id'] nicht gesetzt ist?

          Der Zugriff aufs $_REQUEST-Array ist auch nicht so dolle, nimm lieber direkt das Array, in dem du deinen Wert erwartest.
          Außerdem: auf SQL-Injections achten.
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

          Kommentar


          • #6
            1. Deine Datenbankklasse ist ziemlich unnötig. Wegen einem Funktionsaufruf, der idealerweise sowieso nur an einer Stelle erfolgt, würde ich da nicht eine neue Klasse erfinden.
            2. Nie $_REQUEST verwenden. Du solltest wissen ob deine Daten von POST, GET oder COOKIE kommen. Außerdem kann man in der php.ini die Priorität verändern, das macht nur unnötigen Raum für Fehler.
            3. Prepared Statements verwenden.
            4. EVA-Prinzip

            Kommentar


            • #7
              Ich habe das Ganze etwas überarbeitet. Mit prepared Statements. Das Request ist raus.

              Kommentar


              • #8
                Könnt Ihr mir dabei Helfen, für die Abfragen Funktionen zu schreiben?

                Kommentar


                • #9
                  Deine Datenbankklasse ist so nicht nur unnötig, sondern schränkt noch obendrein die Leistungsfähigkeit der PDO-Klasse ein, indem du
                  1. durch die Art der Übergabe deiner Parameter an den Konstruktor die Möglichkeit andere Treiber zu nutzen kaputt machst
                  2. andere Möglchkeiten wie das Setzen von charset und Optionen als Array mitzugeben unterbindest

                  Eine PDO-Erweiterung kann Sinn machen, wenn neue Methoden hinzukommen, die bei der Nutzng einen echten Gewinn bringen.
                  Da die PDO-Klasse von Hause aus schon sehr leistungsfähig ist, gibt es nicht wenige Meinungen, die solche Erweiterungen als überflüssig ansehen.
                  Ich selbst zähle mich aber nicht zu dieser Gruppe.

                  LG jspit

                  Edit: spezielle Abfragen gehören m.E. nicht in eine solche Erweiterungsklasse.
                  PHP-Klassen auf github

                  Kommentar


                  • #10
                    Also ist das, wie ich es oben habe so in Ordnung?
                    Ich kenne den Unterschied zwischen PDO und Beispielsweise MySQLi.
                    Zu welcher Variante würdet Ihr mir raten, wenn ich mich dazu entscheide z. B. einen Blog zu schreiben?
                    Ein Framework will ich vorerst nicht benutzen, da blicke ich noch gar nicht durch. Habe mir aber schon mehrere angeschaut.

                    Kommentar


                    • #11
                      Zitat von tomahawk Beitrag anzeigen
                      Also ist das, wie ich es oben habe so in Ordnung?
                      So wie deine class Database da steht mach sie keinen Sinn.

                      Zitat von tomahawk Beitrag anzeigen
                      Ich kenne den Unterschied zwischen PDO und Beispielsweise MySQLi.
                      Zu welcher Variante würdet Ihr mir raten, wenn ich mich dazu entscheide z. B. einen Blog zu schreiben?
                      Meine persönliche Meinung: Bleib bei PDO.
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Ich tendiere auch zu PDO, alles weitere wurde ja bereits gesagt.
                        Github_Cyrix
                        Laravelgemeinschaft bei php.de
                        Laravel Chat

                        Kommentar


                        • #13
                          Hardcoding der Datenbank-Verbindungskonfigurationen in eine Klasse ist so Sinnvoll wie nackt in einer Polizeiwache Samba zu tanzen.
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar


                          • #14
                            Vielen Dank für das bisher. Habe die Config abgeändert. Versuche mich jetzt daran Inhalte einzupflegen und zu editieren.

                            Kommentar

                            Lädt...
                            X