Friedel: $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');

problematische Seite

Hallo,

MySQL ist nicht meine Heimat. Aber irgendwie muss ich da durch. Nachdem eine Site beim einen Provider nicht einsetzbar ist, weil der ein Problem mit dem E-Mail-Versand hat, habe ich sie eben auf einen anderen Host kopiert. Aber da funktioniert nichts. Nachdem ich alles gelöscht habe, was funktioniert hat, ist nur eine Scriptzeile übrig. Die muss ja dann die Ursache sein.

Die test.php besteht jetzt insgesamt nur noch aus

<?php 
  echo 'a<br>';
  $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');
  echo 'b<br>';
?>

Und wenn man die Seite im Browser aufruft, erscheint ein a.

Den Datenbankname habe ich mit c&p übertragen und mehrfach überprüft. Das gleich gilt für den Benutzernamen und das Passwort. Letzteres habe ich sogar mehrfach geändert. Mit MySQL wird die Datenbank problemlos angezeigt. Ich habe keine Idee, wo da noch ein Fehler sein könnte.

  1. problematische Seite

    Hallo Friedel,

    Die test.php besteht jetzt insgesamt nur noch aus

    <?php 
      echo 'a<br>';
      $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');
      echo 'b<br>';
    ?>
    

    Und wenn man die Seite im Browser aufruft, erscheint ein a.

    Hast du error_reporting und ggf. display_errors aktiviert? Möglicherweise werden dir Fehlermeldungen nur nicht angezeigt. Evtl. hilft es auch PDO als 4. Paramter noch das Array [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] zu übergeben damit PHP eine Exception wirft wenn ein Fehler auftritt (sonst ist es bei DB-Fehlern nicht besonders gesprächig).

    Nicht vergessen die Einstellungen wieder zurück zu setzen, Besucher sollten Fehlermeldungen von PHP nicht zu sehen bekommen.

    Gruß,
    Tobias

    1. problematische Seite

      Tach!

      Evtl. hilft es auch PDO als 4. Paramter noch das Array [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] zu übergeben damit PHP eine Exception wirft wenn ein Fehler auftritt (sonst ist es bei DB-Fehlern nicht besonders gesprächig).

      Nein, der Parameter erwartet nur "driver-specific connection options".

      PDO::__construct() wirft immer eine Exception, wenn es ein Problem hat. Siehe PDO::__construct() - Errors/Exceptions und Errors and error handling unter dem ersten Beispiel.

      dedlfix.

  2. problematische Seite

    Tach!

    Nachdem ich alles gelöscht habe, was funktioniert hat, ist nur eine Scriptzeile übrig. Die muss ja dann die Ursache sein.

    Sieht so aus, aber Hellsehen können auch die Profis nicht.

    Ich habe keine Idee, wo da noch ein Fehler sein könnte.

    Aber Hellsehen muss man auch nicht können, es gibt ja die Fehlermeldungen. Man muss sie sich nur ansehen. Im Falle der Datenbankfunktionen werden die Fehler nicht direkt angezeigt, wie das bei PHP-Fehlern der Fall ist. Man muss sie sich selbst abholen. Zum Beispiel wie im Handbuch beschrieben.

    Gute Programmierung zeichnet sich dadurch aus, dass auch die Fehlermöglichkeiten berücksichtigt werden.

    dedlfix.

    1. problematische Seite

      Ich danke mal für die Antworten, obwohl nichts brauchbares dabei war. Wenn es irgendwo Fehlermeldungen gibt, sollten man sie auch sehen können, sonst nutzen sie nichts. Dass in einem unverständlichen Handbuch, das man locker innerhalb von ein paar Jahren gelesen haben kann, wenn es nicht in der Zeit verändert wird stehen soll, wie man die Fehlermeldungen abholen kann, nutzt mir nichts. Ich könnte jetzt natürlich anfangen mir Zeile für Zeile erklären zu lassen, was die Zeichenfolgen im Handbuch bedeuten, aber ich halte das nicht für zielführend.

      Die Handbuchseite fängt an mit

      PDO::__construct

      Was soll das bedeuten?

      Die nächste Zeile lautet

      (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

      Ich vermute mal dass man das in Php5 ab Version 5.1 verwenden kann und in Php7. Mit dem Rest der Zeile kann ich nichts anfangen. Ich benutze Php7.3.

      In dem Stil ist das ganze Handbuch gehalten. Dazu kommt, dass in jedem Absatz Links stehen, denen ich nicht ansehen kann, ob sie mir nutzen. Und jeder Link führt zu einer ähnlich unverständlichen Seite, die auch wieder zahllose solcher Links enthält. Das ist ausschließlich für Leute brauchbar, die sich auskennen und etwas nachschlagen wollen. Wer sich nicht auskennt, kann damit nichts anfangen. Natürlich steht alles irgendwo.

      1. problematische Seite

        Tach!

        Ich dachte, du hast ein Problem mit deinem Code. Möchtest du das lösen oder stattdessen lieber über das Handbuch lamentieren? Grundlagenwissen zu einem System, mit dem man arbeiten möchte, sollte man schon mitbringen, sonst bringt Hilfe zur Selbsthilfe nichts.

        dedlfix.

        1. problematische Seite

          Bisher habe ich in diesem Thread noch keine Hilfe zur Selbsthilfe bekommen. tk hat mir ein paar Tipps gegeben. Der eine Teil davon hat leider nicht geholfen, beim anderen Teil hast du geschrieben, dass das nicht geht und ich habe deshalb nicht getestet. Du hast jedenfalls keine Hilfe zur Selbsthilfe gegeben. Nur hast nur einen Link gepostet, der nichts nutzt.

          Inzwischen habe ich im selben Handbuch die Seite Fehler und Fehlerbehandlung gefunden. Das hat mir zwar auch nicht direkt geholfen, aber bei Herumprobieren habe ich festgestellt, dass alle meine Änderungen an der Datenbank offensichtlich erst nach einigen Minuten (3 bis 20 Minuten) Wirkung zeigen. Jedenfalls habe ich beim Herumprobieren eine zweite Datenbank angelegt und eine zweite Testseite. Und dann habe ich aus Versehen die eine Testseite verändert und die andere hoch geladen. Und plötzlich hat die unveränderte Seite funktioniert. Und 15 Minuten später hat auch die andere mit der anderen Datenbank funktioniert die beim ersten Test den selben Fehler die selbe Nicht-Funktion gezeigt hat.

          Inzwischen habe ich

          $dsn = 'mysql:dbname=testdb;host=localhost';
          $user = 'tester';
          $password = 'Passwort';
          
          try {
              $dbh = new PDO($dsn, $user, $password);
              $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          } catch (PDOException $e) {
              echo 'Verbindung fehlgeschlagen: ' . $e->getMessage();
          }
          

          wieder durch

          $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');
          

          ersetzt und es funktioniert alles.

          1. problematische Seite

            Tach!

            Bisher habe ich in diesem Thread noch keine Hilfe zur Selbsthilfe bekommen.

            Wie gesagt, kann ich nicht hellsehen. Ich bin darauf angewiesen, dass du mir sagst, was du nicht verstehst oder wo du nicht weiterkommst. Ohne das kann ich dich nur dahin schicken, was ich denke, was helfen könnte.

            tk hat mir ein paar Tipps gegeben. Der eine Teil davon hat leider nicht geholfen, beim anderen Teil hast du geschrieben, dass das nicht geht und ich habe deshalb nicht getestet. Du hast jedenfalls keine Hilfe zur Selbsthilfe gegeben. Nur hast nur einen Link gepostet, der nichts nutzt.

            Da war der Verbindungsaufbau mit Abfangen der dabei eventuell entstehenden Exception in vergleichbarer Weise wie auf der Seite zur Fehlerbehandlung gezeigt. Wenn dein a-b-Test nicht bis zu b kommt, dann wird die Zeile dazwischen ein Problem haben. Der Verbindungsaufbau wirft vermutlich eine Exception, die durch den try-catch-Code gefangen und angezeigt worden wäre.

            dedlfix.

            1. problematische Seite

              Und es hätte mir geholfen, wenn mir jemand das mit dem try-catch-Code beschrieben hätte oder einen entsprechenden Link gepostet hätte. Ein Link zu einer Handbuchseite wo das zwar im selben Handbuch aber nicht auf der verlinkten Seite beschrieben ist, hat mir nichts gebracht.

              Dieser try-catch-Code hat übrigens auch nur ausgegeben, dass keine Verbindung zustande gekommen ist. (Vorausgesetzt, du meinst den Code der auf https://www.php.net/manual/de/pdo.error-handling.php im ersten Beispiel beschrieben ist.

              1. problematische Seite

                Tach!

                Und es hätte mir geholfen, wenn mir jemand das mit dem try-catch-Code beschrieben hätte oder einen entsprechenden Link gepostet hätte.

                Wie gesagt, ich kann nicht hellsehen. Ich kann auch nicht im Vorhinein alles bis ins kleinste Detail erklären. Aus Effizienzgründen gehe ich davon aus, dass bestimmtes Wissen vorhanden ist, zum Beispiel das Grundlagenwissen um try-catch. Wenn du etwas nicht verstehst, solltet du nachfragen oder dich selbst schlau machen.

                Dieser try-catch-Code hat übrigens auch nur ausgegeben, dass keine Verbindung zustande gekommen ist. (Vorausgesetzt, du meinst den Code der auf https://www.php.net/manual/de/pdo.error-handling.php im ersten Beispiel beschrieben ist.

                Und dieses Beispiel gibt zusätzlich zu dem dort lesbaren "Verbindung fehlgeschlagen" einen Fehlermeldungstext aus, der direkt vom Datenbanktreiber oder aus dem DBMS kommt und genauere Hinweise auf die Ursache liefern kann.

                dedlfix.

          2. problematische Seite

            Hallo Friedel,

            Und plötzlich hat die unveränderte Seite funktioniert. Und 15 Minuten später hat auch die andere mit der anderen Datenbank funktioniert die beim ersten Test die selbe Nicht-Funktion gezeigt hat.

            Solche magischen Anwandlungen können durch Caching ausgelöst werden. Irgendwann läuft die Aufbewahrungszeit ab und erst dann wird dein PHP Script überhaupt erst wieder aufgerufen.

            Ob ein Cache sein Unwesen treibt, kannst Du feststellen, wenn Du den ersten echo im Script variierst. Also echo "ab<br>"; statt echo "a<br>";. Wenn diese Änderung nicht sofort greift, hast Du ein Cache-Problem.

            Probiere als nächstes (Quelle hier, Beispiel #2):

            <?php
            header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
            header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
            echo "a<br>";
            

            Wenn Du jetzt die Echo-Zeile variierst - greift es dann sofort? Gut. Dann hast Du eine brauchbare Entwicklungsbasis gefunden.

            Wenn gar nichts hilft und irgendein Cache auf der Strecke zu radikal ist, häng einen URL Parameter an. Rufe also nicht pdo_test.php auf, sondern pdo_test.php?foo=1. Das nennt man Cache-busting und es sollte immer helfen.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. problematische Seite

              Änderungen an der Php-Seite wirken sofort. Manche Änderungen an der Datenbank wirken erst einige Minuten verzögert.

              1. problematische Seite

                Tach!

                Änderungen an der Php-Seite wirken sofort. Manche Änderungen an der Datenbank wirken erst einige Minuten verzögert.

                Wie genau überprüfst du das? Kommunizierst du mit einem Administationsprogramm (zum Beispiel MySQL Workbench) direkt mit der Datenbank oder hast du ein Konglomerat aus Webseiten und Webserver und eventuellem Cache-Mechanismus dazwischen?

                dedlfix.

      2. problematische Seite

        Hallo

        Ich danke mal für die Antworten, obwohl nichts brauchbares dabei war.

        Dedlfix' Rat, die Fehlermeldungen einzuschalten und auf diese zu reagieren ist der brauchbarste Rat, den du hier und woanders jemals bekommen könntest. Er versetzt dich nach etwas Training in die Lage, selbst auf Fehler reagieren und im Bedarfsfall einer Frage in einem Forum weitere Informationen liefern zu können.

        Wenn es irgendwo Fehlermeldungen gibt, sollten man sie auch sehen können, sonst nutzen sie nichts. Dass in einem unverständlichen Handbuch, das man locker innerhalb von ein paar Jahren gelesen haben kann, wenn es nicht in der Zeit verändert wird stehen soll, wie man die Fehlermeldungen abholen kann, nutzt mir nichts. Ich könnte jetzt natürlich anfangen mir Zeile für Zeile erklären zu lassen, was die Zeichenfolgen im Handbuch bedeuten, aber ich halte das nicht für zielführend.

        Sag' doch gleich, dass du dich nicht mit der von dir benutzten Programmiersprache beschäftigen willst.

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
  3. problematische Seite

    Hi there,

    Die test.php besteht jetzt insgesamt nur noch aus

    <?php 
      echo 'a<br>';
      $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');
      echo 'b<br>';
    ?>
    

    was steht denn jetzt wirklich in der Zeile? Ich kann mir nicht vorstellen, daß Du einen Benutzer hast, der 'Benutzer' heisst und ein Password, das 'Passwort' lautet. Detto 'Datenbankname'. Normal steht da eher etwas in der Art von:

    <?php 
      echo 'a<br>';
      $pdo = new PDO('mysql:host='.$host.';dbname='.$dataBase, $user, $pass);
      echo 'b<br>';
    ?>
    

    wenn die Variablen richtig gesetzt sind...

    1. problematische Seite

      Hallo

      <?php 
        echo 'a<br>';
        $pdo = new PDO('mysql:host=localhost; dbname=Datenbankname', 'Benutzer', 'Passwort');
        echo 'b<br>';
      ?>
      

      was steht denn jetzt wirklich in der Zeile? Ich kann mir nicht vorstellen, daß Du einen Benutzer hast, der 'Benutzer' heisst und ein Password, das 'Passwort' lautet. Detto 'Datenbankname'.

      Hältst du es wirklich für sinnvoll, dass Friedel hier die echten Zugangsdaten veröffentlicht? Es kann ja nicht Sinn und Zweck sein, Matthias Apsel damit zu beschäftigen, diese Daten im Adminmodus wieder zu anonymisieren.

      Tschö, Auge

      --
      Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
      Hohle Köpfe von Terry Pratchett
      1. problematische Seite

        Hallo,

        Hältst du es wirklich für sinnvoll, dass Friedel hier die echten Zugangsdaten veröffentlicht?

        Naja einen Versuch wars doch wert fg 😈

        Gruß
        Kalk

      2. problematische Seite

        Hältst du es wirklich für sinnvoll, dass Friedel hier die echten Zugangsdaten veröffentlicht?

        Genau das hatte ich eigentlich vor, und habe dadurch die Lösung gefunden. 🤫

        Ich habe die test.php nach test2.php kopiert. Dann habe ich eine Testdatenbank mit einem Testuser angelegt und die test.php so angepasst, dass sie zur neuen Datenbank passt. Und diese test.php hätte ich dann mit den echten Daten hier gepostet. Aber aus versehen habe ich nicht die test.php verändert sondern die test2.php und dann hat die test.php plötzlich funktioniert…

        Sorry Kalk, du kriegst trotzdem nicht das Häkchen. Ich gehe davon aus, dass man damit die Antwort markieren soll, die zur Lösung geführt hat.

        1. problematische Seite

          Hallo

          Hältst du es wirklich für sinnvoll, dass Friedel hier die echten Zugangsdaten veröffentlicht?

          Genau das hatte ich eigentlich vor …

          Nicht, dass uns deine Zugangsdaten bei der Lösung von irgendwas geholfen hätte, aber die Veröffentlichung realer Zugangsdaten verbietet sich von selbst.

          Ich habe die test.php nach test2.php kopiert. Dann habe ich eine Testdatenbank mit einem Testuser angelegt und die test.php so angepasst, dass sie zur neuen Datenbank passt. Und diese test.php hätte ich dann mit den echten Daten hier gepostet. Aber aus versehen habe ich nicht die test.php verändert sondern die test2.php und dann hat die test.php plötzlich funktioniert…

          Du hast also keine Lösung gefunden sondern bist eher darüber gestolpert. Schön für dich, dass das akute Problem behoben ist, aber sorry, mit dieser Attitüde kommst du in Sachen Programmierung nicht weit. Wenn du doch mehr als herumdoktern wollen solltest, wirst du um die Lektüre von Dokumentationen nicht herum kommen.

          Tschö, Auge

          --
          Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
          Hohle Köpfe von Terry Pratchett
          1. problematische Seite

            Hallo,

            Du hast also keine Lösung gefunden sondern bist eher darüber gestolpert. Schön für dich, dass das akute Problem behoben ist, aber sorry, mit dieser Attitüde kommst du in Sachen Programmierung nicht weit.

            im Gegenteil: Sowas macht mich immer ziemlich unruhig. Wenn etwas nicht wie gewünscht funktioniert, dann plötzlich doch, ohne dass ich weiß warum, dann lässt mir das keine Ruhe. Denn wenn ich die Ursache nicht kenne, könnte das ursprüngliche Problem jederzeit wieder auftauchen, und ich wäre so weit wie zuvor.

            Wenn du doch mehr als herumdoktern wollen solltest, wirst du um die Lektüre von Dokumentationen nicht herum kommen.

            ACK.

            Live long and pros healthy,
             Martin

            --
            Home is where my beer is.
  4. problematische Seite

    Lieber Friedel,

    Und wenn man die Seite im Browser aufruft, erscheint ein a.

    das bedeutet, dass Dein PHP-Prozess mit dem Teil danach ein Problem hat. Das Error-Log könnte sagen, ob die PHP-Instanz überhaupt über die PDO-Erweiterung verfügt. Sollte das nicht der Fall sein, wird der Rest von PHP nicht mehr abgearbeitet und Du siehst das b nicht mehr.

    Aber meine Glaskugel ist schon ein älteres Modell...

    Liebe Grüße

    Felix Riesterer