Announcement

Collapse
No announcement yet.

Zugriff auf MySQL mit PHP schlägt ohne Fehlermeldung fehl

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf MySQL mit PHP schlägt ohne Fehlermeldung fehl

    Hallo zusammen,

    meine ersten Schritte mit PHP laufen recht positiv, jetzt hänge ich beim Zugriff auf MySQL fest. In PHPmyAdmin habe ich mich mit dem SQL-Server verbunden und die Tabelle "test" mit den entsprechenden Feldern angelegt und einen Datensatz erzeugt.
    Mit folgendem Code hätte ich mir erwartet, dass wenigstens eine Fehlermeldung angezeigt wird, aber in Firefox bleibt der Bildschirm weiß. Das ganze ist bei T-Online gehostet, mit localhost klappts genau so wenig.

    PHP Code:
    <?php 
    $user 
    "MeinMySQLUser";
    $password "MeinMySQLPasswort";
    try {
        
    $pdo = new PDO("mysql:host=mysql5.service;port=3306;dbname=MeinMySQLDBName"$user$password);
        
    $pdo->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION );
        
    $sql "SELECT name, vorname, passwort FROM test";
        foreach (
    $pdo->query($sql) as $row) {
        echo 
    $row['name']." ".$row['vorname']."<br />";
        echo 
    "passwort ".$row['passwort']."<br /><br />";
        } catch (
    PDOException $e) {
            echo 
    "Error!: " $e->getMessage() . "<br/>";
        }
    ?></p>
    Wer kann mir auf die Sprünge helfen?

    Danke

    intonator

  • #2
    Wenn du keine Ausgaben machst, wird wohl auch nix angezeigt werden

    $statement = $pdo->prepare("SELECT * FROM test");

    if($statement->execute()) {
    echo"ok";
    }
    else
    {
    echo $statement->errorInfo();
    }

    http://php.net/manual/de/pdo.errorinfo.php
    Des Weiteren ist "name" ein reserviertes Wort in MYSQL
    https://dev.mysql.com/doc/refman/5.5/en/keywords.html
    Zuletzt editiert von Christian Marquardt; 13.08.2017, 11:20.
    Christian

    Comment


    • #3
      Hallo Christian,

      danke für deine turboschnelle Antwort. Ich habe Deinen Hinweis eingearbeitet, es bleibt bei keiner Ausgabe in Firefox. Habe es alternativ in IE getestet: HTTP 500 Fehler. Das macht mir die Fehlersuche nicht leichter ;-) Ich betreibe auf dem Server auch eine kleine Website mit PMWiki, das basiert auf PHP und die läuft.
      Frage zu meinem Verständnis: Warum meinst Du, dass ich in meinem ersten Code keine Ausgaben mache? Ich übergebe doch der pdo->query mein SQL-Statement und lasse es zeilenweise über foreach ausgeben.

      PHP Code:
      <?php 
      $user 
      "MeinMySQLUser";
      $password "MeinMySQLPasswort";
      try {
          
      $pdo = new PDO("mysql:host=mysql5.service;dbname=MeinMySQLDBName"$user$password);
          
      $pdo->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION );
          
      $sql "SELECT * FROM test";
          
      $statement $pdo->prepare($sql);
          if (
      $statement->execute()) {
              echo (
      "Execute");
          }
          else
          {
              echo (
      "errorInfo");
              echo 
      $statement->errorInfo();
          }

          } catch (
      PDOException $e) {
              echo 
      "Error!: " $e->getMessage() . "<br/>";
          }
      ?></p>
      Die Feldbezeichnung "name" habe ich in MySQL gleich noch in "nachname" geändert. Hatte aber keine Auswirkung auf das Problem.

      Intonator
      Zuletzt editiert von intonator; 13.08.2017, 11:48.

      Comment


      • #4
        Wenn das Statement ohne Fehler läuft, aber die Ergebnismenge leer ist, erfolgt keine Ausgabe.
        Der HTTP 500er Fehler deutet darauf hin, dass die Seite, die du aufrufst, beim PHP-Interpreter einen Fehler erzeugt.
        Schau im error.log des Webservers, was für ein Fehler aufgetreten ist
        Du bist sicher, dass auf deinem Server PDO installiert ist? -> phpinfo(); sollte das ausgeben
        Christian

        Comment


        • #5
          PDO sollte drauf sein (das wäre aber auch der super Anfängerfehler gewesen, hätte ich mich direkt darüber gefreut!):
          MySQL_PDO.JPG

          Habe den Server mal mit *error*.* durchsucht. Es gibt eine cgi_error.log, in der stehen lt. T-Online alle PHP Fehler drin. Da sind auch welche drin, allerdings von meinen Versuchen gestern Abend, von heute ist nichts zu finden (Nutzername und Passwort habe ich ausgeXt):
          PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /home/www/phptest/phpinfo.php:5
          Stack trace:
          #0 /home/www/phptest/phpinfo.php(5): PDO->__construct('mysql:host=loca...', 'XXX', 'XXX')
          #1 {main}
          thrown in /home/www/phptest/phpinfo.php on line 5

          Die Fehler haben alle als host = localhost, das werte ich mal als Zeichen, dass es damit nicht funktioniert.

          Comment


          • #6
            Dann fang klein an
            <?php
            $user
            = "MeinMySQLUser";
            $password = "MeinMySQLPasswort";
            echo $user." ".$password;
            ?>
            </p>

            Und nimm dann halt Zeile für Zeile wieder rein
            Christian

            Comment


            • #7
              Hallo Christian,

              danke für Deine Mühe und Geduld. Der Wald hat sich gelichtet, jetzt ist das Ergebnis wie erwartet:

              PHP Code:
              <?php 
              $user 
              "MeinMySQLUser";
              $password "MeinMySQLPasswort";
              try {
                      
              $pdo = new PDO("mysql:host=mysql5.service;dbname=MeinMySQLDBName"$user$password);
                      
              $pdo->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION );
                      
              $sql "SELECT * FROM test";
                      
              $statement $pdo->prepare($sql);
                  
                      if (
              $statement->execute()) {
                          echo (
              "Execute OK" ."<br />");
                          while(
              $row $statement->fetch()) {
                              echo 
              $row['vorname']." ".$row['nachname']."<br />";
                              echo 
              "passwort: ".$row['passwort']."<br /><br />";
                          }
                      } else
                      {
                          echo (
              "errorInfo");
                          echo 
              $statement->errorInfo();
                      }
                  } catch (
              PDOException $e
                  {
                      echo 
              "Error!: " $e->getMessage() . "<br/>";
                  }
              ?></p>
              Danke dass Du dich als alter Fuchs hier mit Anfängern wie mir abgibst!

              Ciao

              intonator

              Comment


              • #8
                Schön, das es geht
                Christian

                Comment


                • #9
                  Wenn auch spät, aber vielleicht ergänzend dazu:

                  Wenn PreparedStatements mit PDO verwendet werden, solltet ihr PDO sagen, dass er diese nicht nur emulieren, sondern auch wirklich "leben" soll.
                  PDO emuliert nämlich PreparedStatements nur, als default Einstellung. Dies sollte man über die Konstruktor-Parameter direkt mit angeben:
                  PHP Code:
                  PDO::ATTR_EMULATE_PREPARES => false 
                  Zusätzlich ( aber das ist wirklich Geschmackssache ) lasse ich mir per fetch() den aktuellen Datensatz lieber als Objekt zurückgeben. Dazu kennt fetch() zwar auch einen Parameter, aber auch das kann ich im Konstruktor bereits mit angeben:
                  PHP Code:
                  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ 
                  Da ich grundsätzlich UTF-8 basierend arbeite, übergebe ich auch das direkt im DSN mit.
                  Das ganze funktioniert natürlich über setAttribute() perfekt, dazu ist das ja auch gedacht, aber ich packe das alles mit in den Konstruktor-Aufruf:
                  PHP Code:
                  $pdo = new PDO(
                          
                  'mysql:host=mysql5.service;dbname=MeinMySQLDBName;charset=utf8'
                          
                  $user
                          
                  $password
                          
                  , [
                              
                  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                              
                  PDO::ATTR_EMULATE_PREPARES => false,
                              
                  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                          
                  ]
                      ); 
                  Durch das FETCH_OBJ empfinde ich den Code etwas leserlicher:
                  PHP Code:
                  while($row $statement->fetch()) {

                      echo 
                  $row->vorname ' ' $row->nachname '<br>';
                      echo 
                  'passwort: ' $row->passwort '<br><br>';


                  , aber das ist wie gesagt nur meine persönliche Ansicht.

                  Schöne Grüße
                  PHP rocks!
                  Eine Initiative der PHP Community

                  Comment

                  Working...
                  X