Ankündigung

Einklappen
Keine Ankündigung bisher.

Pager Funktion

Einklappen

Neue Werbung 2019

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

  • Pager Funktion

    ich versuche mich grade an einer Seitennavigation. Diese läuft auch. Jedoch muss ich die DB Verbindung 2x angeben, da ich das ganze in einer Funktion habe. Kann ich das auch anders machen?

    index.php
    PHP-Code:
    <?php
    include('include/config.php');
    include(
    'include/header.php');

    if (!isset(
    $_GET['id'])) {
        if (isset(
    $_GET["page"])) {
            
    $page $_GET["page"];
        } else {
            
    $page 1;
        }
        
    $start_from = ($page 1) * PERPAGE;
        
    $stmt $dbh->prepare("SELECT * FROM entrys ORDER BY id DESC LIMIT $start_from," PERPAGE);
        
    $stmt->execute();
        while (
    $row $stmt->fetch(PDO::FETCH_ASSOC)) {
            
    ?>

            <div class="well">
                <h1><a href="?id=<?php echo $row['id']; ?>" title="<?php echo $row['title']; ?>"><?php echo $row['title']; ?></a></h1>
                <p><?php echo date('d.m.Y - H:i:s'strtotime($row['date'])); ?></p>
                <p><?php echo $row['teaser']; ?></p>
            </div>
            <?php
        
    }
    } else {
        
    $stmt $dbh->prepare("SELECT * FROM entrys WHERE id = :id");
        
    $stmt->bindValue(':id'$_GET['id']);
        
    $stmt->execute();
        while (
    $row $stmt->fetch(PDO::FETCH_ASSOC)) {
            
    ?>

            <div class="well">
                <h1><?php echo $row['title']; ?></h1>
                <p><?php echo date('d.m.Y - H:i:s'strtotime($row['date'])); ?></p>
                <p><?php echo $row['text']; ?></p>
            </div>
            <a href="javascript:history.back();" class="btn btn-default"><span class="glyphicon glyphicon-arrow-left"></span></a>

            <?php
        
    }
    }
    include(
    'include/footer.php');
    footer.php
    PHP-Code:
    </div>
    <?php include 'sidebar.php'?>
    </div>
    </div>
    <?php pager(); ?>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    </body>
    </html>
    config.php
    PHP-Code:
    <?php
    error_reporting
    (E_ALL);

    /*
     * Database Connection
     */

    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());
    }

    /*
     * Constants
     */

    define('SITENAME''TESTING');
    define('PERPAGE'5);
    /*
     * Functions
     */

    function pager() {
        try {
            
    $dbh = new PDO(DB_TYPE ':host=' DB_HOST ';dbname=' DB_NAMEDB_USERNAMEDB_PASSWORD);
            
    $result $dbh->prepare("SELECT COUNT(id) FROM entrys");
            
    $result->execute();
            
    $row $result->fetch();
            
    $total_records $row[0];
            
    $total_pages ceil($total_records PERPAGE);
            
    ?>
            <nav>
                <ul class="pagination">
                    <?php
                    
    for ($i 1$i <= $total_pages$i++) {
                        
    ?>
                        <li><a href="index.php?page=<?php echo $i?>"><?php echo $i?></a></li>
                        <?php
                    
    }
                    
    ?>
                </ul>
            </nav>
            <?php
        
    } catch (PDOException $e) {
            die(
    $e->getMessage());
        }
    }
    in der config.php muss ich 2x die DB Verbindung aufbauen. Geht das auch anders?
    Ich habe übrigens versucht mich an das EVA Prinzip zu halten. Ob mir das gelungen ist, weiß ich als Anfänger nicht so ganz.


  • #2
    Übergib die Datenbankverbindung als Parameter an die Funktion...
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Datenbankverbindung via Klasse realisieren und Singleton-Entwurfsmuster verwenden.
      Singleton (Entwurfsmuster)

      Kommentar


      • #4
        Zitat von Andante Beitrag anzeigen
        Datenbankverbindung via Klasse realisieren und Singleton-Entwurfsmuster verwenden.
        Singleton (Entwurfsmuster)
        NEIN. NEIN. Nein. Nein. nein. nein. nope.

        Es gibt keinen Grund, wieso du hier ein Singleton verwenden solltest. So absolut keinen Grund, dass ich nicht einmal argumentiere wieso es keinen gibt.
        GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

        Kommentar


        • #5
          Jedes mal wenn ein Programmierer das Singleton-Pattern verwendet, stirbt irgendwo auf der Welt ein süßes Kätzchen.
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Zitat von lstegelitz Beitrag anzeigen
            Übergib die Datenbankverbindung als Parameter an die Funktion...
            Also erstmal danke für die Antworten,
            Wie genau mache ich das? Muss ich das dann so schreiben?
            PHP-Code:
            function pager($dbh) {

            Kommentar


            • #7
              Genau, im Grunde wie jeden anderen Parameter auch.

              Du kannst dann noch mittels type-hinting so schreiben, dann stellst du sicher das es sich um eine PDO Instanz handelt, sonst gibts nen Fehler. Ich hoffe zumindest das das bei "normalen" Funktionen auch geht (und nicht nur bei Methoden) ...

              PHP-Code:
              function pager(PDO $dbh) {
                
              // ...

              http://php.net/manual/de/language.oop5.typehinting.php
              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


              • #8
                Da bekomme ich den Fehler:
                Code:
                Catchable fatal error: Argument 1 passed to pager() must be an instance of PDO, none given, called in C:\xampp\htdocs\develop\php\application\learn\pdo\include\footer.php on line 5 and defined in C:\xampp\htdocs\develop\php\application\learn\pdo\include\config.php on line 45
                Eine Frage: Istr es falsch, wenn ich mir folgende DB Klasse erstelle:
                PHP-Code:
                class Database {
                    private static 
                $PDOINSTANCE;
                    private static 
                $HOST 'localhost';
                    private static 
                $USER 'root';
                    private static 
                $PASS '';
                    private static 
                $BASE 'learn';
                    private static 
                $CHAR 'utf8';
                    private static 
                $PORT 3306;
                    
                    private function 
                __construct() {}
                    private function 
                __clone() {}
                    
                    public static function 
                getInstance() {
                        if(!
                self::$PDOINSTANCE) {
                            
                self::$PDOINSTANCE = new PDO('mysql:host='.self::$HOST.';dbname='.self::$BASE.';charset='.self::$CHAR.';'self::$USERself::$PASS);
                        }
                        return 
                self::$PDOINSTANCE;
                    }

                Dann kann ich in meiner pager Funktion und überall wo weitere DB Abfragen gemacht werden
                PHP-Code:
                $dbh Database::getInstance(); 
                schreiben. Dann wird die Verbindung aufgebaut.

                Kommentar


                • #9
                  -> #4 und #5

                  Das muss so schon gehen, du musst nur schauen das es das Objekt schon gibt wenn du die Funktion aufrufst..

                  PHP-Code:
                  // Funktion "irendwo" definieren
                  function pager(PDO $dbh) {
                    
                  // innerhalb $dbh wie einen "normalen" Parameter benutzen    
                  }


                  // irgendwo "weiter oben" vor Aufruf(!) der Funktion pager
                  $dbh = new PDO(DB_TYPE ':host=' DB_HOST ';dbname=' DB_NAMEDB_USERNAMEDB_PASSWORD);

                  // und dann pager() verwenden wie auch immer benötigt
                  $html pager($dbh); 
                  LG
                  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


                  • #10
                    Also mit
                    PHP-Code:
                    function pager(PDO $dbh) {... 
                    und
                    PHP-Code:
                    <?php pager($dbh); ?>
                    Funktioniert es. Vielen Dank.
                    Hast du vielleicht noch eine Idee wie ich es machen kann, dass mir nur 5 Seiten in der Navigation angezeigt werden und dann eventuell nur "..."?

                    Kommentar


                    • #11
                      Mit LIMIT?

                      Kommentar

                      Lädt...
                      X