Yadgar: mysql_connect() funktioniert nicht!

Hi(gh)!

Eigentlich sollte diese Funktion

  
  function dbcall()  
  {  
    $db = mysql_connect("localhost", "d01889b7", "Passwort");  
    mysql_set_charset('utf8', $db);  
    dberror();  
    $db = mysql_select_db("d01889b7");  
    dberror();  
  }  

auch auf meinem Remote-Server (d. h. bergisch-afghanistan.de) laufen, relativ vom Skript aus gesehen wäre es ja "localhost" - aber es funktioniert nicht!

Der Benutzername stimmt, ebenso der Datenbank-Name... ich verstehe das nicht! Lokal auf meinem Privatrechner klappt der Datenbankzugriff einwandfrei...

Bis bald im Khyberspace!

Yadgar

  1. Tach!

    Eigentlich sollte diese Funktion [...] auch auf meinem Remote-Server (d. h. bergisch-afghanistan.de) laufen, relativ vom Skript aus gesehen wäre es ja "localhost" - aber es funktioniert nicht!

    "Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Was für ein Fehler tritt denn konkret auf? Dazu zählt, dass man (zumindest im Fehlerfall) das error_reporting auf E_ALL stellt und display_errors auf on. Weiterhin geben PHP-Funktionen im Fehlerfall gern mal false zurück. Du musst das auswerten und nicht einfach mit der nächsten Funktion weitermachen. Die mysql-Funktionen geben ihre Fehlermeldungen allerdings nicht direkt zurück. Man muss durch die Auswertung des Funktionsergebnisses erst auf den Fehlerzustand testen und dann mit mysql_error() den zugehörigen Text abfragen. Ohne diesen kann dir nur ein Hellseher weiterhelfen.

    dedlfix.

    1. Hi(gh)!

      "Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Was für ein Fehler tritt denn konkret auf? Dazu zählt, dass man (zumindest im Fehlerfall) das error_reporting auf E_ALL stellt und display_errors auf on. Weiterhin geben PHP-Funktionen im Fehlerfall gern mal false zurück. Du musst das auswerten und nicht einfach mit der nächsten Funktion weitermachen. Die mysql-Funktionen geben ihre Fehlermeldungen allerdings nicht direkt zurück. Man muss durch die Auswertung des Funktionsergebnisses erst auf den Fehlerzustand testen und dann mit mysql_error() den zugehörigen Text abfragen. Ohne diesen kann dir nur ein Hellseher weiterhelfen.

      Dummerweise komme ich auf dem Remoteserver gar nicht an die php.ini (oder wie die Konfigurationsdatei sonst heißen mag) ran - von PHPMyAdmin aus kann ich nichts einstellen, und ich vermute mal, dass ich als normaler Benutzer gar nicht die Rechte dazu habe! Und nun?

      Bis bald im Khyberspace!

      Yadgar

      1. Tach!

        Dummerweise komme ich auf dem Remoteserver gar nicht an die php.ini (oder wie die Konfigurationsdatei sonst heißen mag) ran - von PHPMyAdmin aus kann ich nichts einstellen, und ich vermute mal, dass ich als normaler Benutzer gar nicht die Rechte dazu habe! Und nun?

        Vermutungen bringen einen nicht weiter, wenn man sie nicht überprüft. Das PHP-Handbuch führt zu jeder Konfigurationsdirektive an, wo sie geändert werden kann. Für error_reporting und display_errors ist das PHP_INI_ALL, was heißt, dass man sie auch im Script noch ändern kann. Dazu gibt es die Funktion ini_set() und manchmal auch spezielle Funktionen wie error_reporting(). Das bringt dir in dem Fall aber nur relativ wenig, weil beides nur reine PHP-Fehler anzeigt. Zu einem Datenbank-Problem kannst du damit nicht direkt den Meldungstext sehen, sondern nur eventuelle Folgen, die zu PHP-Fehlern führen. Für Datenbank-Fehler habe ich bereits das mysql_error() genannt. Vielleicht hast du solch einen Aufruf ja in dberror() drin, aber das musst du dann direkt nach dem Connect und nicht erst eine weitere Folgefunktion später aufrufen, denn mysql_error() gibt immer nur für eine Funktion zurückliegend den Fehlertext her.

        dedlfix.

    2. Hi(gh)!

      "Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Was für ein Fehler tritt denn konkret auf? Dazu zählt, dass man (zumindest im Fehlerfall) das error_reporting auf E_ALL stellt und display_errors auf on. Weiterhin geben PHP-Funktionen im Fehlerfall gern mal false zurück. Du musst das auswerten und nicht einfach mit der nächsten Funktion weitermachen. Die mysql-Funktionen geben ihre Fehlermeldungen allerdings nicht direkt zurück. Man muss durch die Auswertung des Funktionsergebnisses erst auf den Fehlerzustand testen und dann mit mysql_error() den zugehörigen Text abfragen. Ohne diesen kann dir nur ein Hellseher weiterhelfen.

      Also, meine selbst gestrickte Funktionssammlung head_schwingungen.php sieht jetzt so aus:

        
      <?php  
        ini_set("display_errors", "true");  
        ini_set("error_report", "E_ALL");  
        
        function head($title)  
        {  
          echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"';  
          echo '  "http://www.w3.org/TR/html4/loose.dtd">';  
          echo '<html>';  
          echo '  <head>';  
          echo '    <title>'.$title.'</title>';		  
          echo '    <meta http-equiv="Content-Type" content="text/html; charset=utf8">';  
          echo '    <style>';  
          echo '      p { font-size:12px }';  
          echo '      td { vertical-align:top }';  
          echo '      th { text-align:left }';  
          echo '    </style>';  
          echo '  </head>';  
        }  
      	  
        function dberror()  
        {  
          if (mysql_errno())  
          {  
            switch(mysql_errno())  
            {  
              case 1062:  
                die ("Ein Eintrag mit diesen Daten existiert bereits! Bitte korrigieren Sie Ihre Eingabe!<br>");  
              break;  
              default:  
                die (mysql_errno().": ".mysql_error()."<br>");  
              break;  
            }  
          }  
        }  
        
        function dbcall()  
        {  
          $db = mysql_connect("localhost", "d01889b7", "Reloncavi");  
          dberror();  
          echo "<p><b>Bla bla bla</b></b></p>";  
          mysql_set_charset('utf8', $db);  
          dberror();  
          $db = mysql_select_db("d01889b7");  
          dberror();  
        }  
      	  
        function dateconv($datum)  
        {  
          $datum = explode("-", $datum);  
          $datum = ltrim($datum[2], '0').".".ltrim($datum[1], '0').".".$datum[0];  
          return $datum;  
        }  
      ?>  
      
      

      Aufgerufen wird das ganze dann am Beginn jeder Seite der Eingabeoberfläche, z. B. hier (sendung.php):

        
      <?php  
          require("head_schwingungen.php");  
          head("Schwingungen - Dateneingabe: sendung");  
      ?>  
        <body>  
      <?  
        require("navbar_schwingungen.php");  
      ?>  
        <div style="position:absolute; width:74%; top:0px; left:26%; padding-left:5px">  
          <h2>Schwingungen: Dateneingabe</h2>  
          <h3>Datentabelle: sendung</h3>  
          <form method="post" action="sendung.php">  
            <table>  
              <tr>  
                <td>  
                  <b>Datum: </b>  
                </td>  
                <td>  
                  <input type="text" name="Datum">  
                </td>  
              </tr>  
              <tr>  
                <td>  
                  <b>Status: </b>  
                </td>  
                <td>  
                  <select name="Status">  
                  <option value="">Status auswählen</option>  
                  <?  
                    dbcall();  
                    $query = "SELECT Bezeichnung FROM status ORDER BY Bezeichnung";  
                    $result = mysql_query($query);  
                    dberror();  
                    while ($row = mysql_fetch_row($result))  
                    {  
                      dberror();  
                  ?>  
                  <option value="<? echo $row[0]; ?>"><? echo $row[0]; ?>  
                  </option><?  
                    }  
                  ?>  
                  </select>  
                </td>  
              </tr>					  
            </table>  
            <p>  
              <input type="submit" value="Daten absenden">  
            </p>  
          </form>		  
        <?  
          $Datum = $_POST['Datum'];  
          $Status = $_POST['Status'];  
          if (!$Datum || !$Status)  
            echo "Bitte geben Sie ein Sendedatum und einen Sendungs-Status ein!<br>";  
          else  
          {  
            $dt = explode(".", $Datum);  
            echo "<br>";  
            if (!checkdate($dt[1], $dt[0], $dt[2]))  
              echo "Kein gültiges Datum! Bitte korrigieren Sie Ihre Eingabe!<br>";  
            else if (mktime(0,0,0,$dt[1], $dt[0], $dt[2]) - time() >= 0)  
              echo "Datum liegt in der Zukunft! Bitte korrigieren Sie Ihre Eingabe!<br>";  
            else  
            {  
              $query = "SELECT ID FROM status WHERE Bezeichnung ='".mysql_real_escape_string($Status)."'";  
              $result = mysql_query($query);  
              dberror();  
              $row = mysql_fetch_row($result); // status.ID  
              dbcall();  
              $Datum = $dt[2]."-".$dt[1]."-".$dt[0];  
              $query = "INSERT INTO sendung (Datum, Status) VALUES ('".mysql_real_escape_string($Datum)."','".mysql_real_escape_string($row[0])."')";  
              $result = mysql_query($query);  
      	dberror();  
      	echo "Ihre Eingabe war korrekt und wurde in die Datenbank eingetragen!";  
      	$db = mysql_close();  
              dberror();  
            }  
          }  
        ?>  
        </div>  
        <p style="text-align:center; position:absolute; left:26%; width:74%; top:500px">  
        <a href="sendung_kontrolle.php" target="_blank">Kontrollansicht der Tabelle (in neuem Fenster)</a>  
        </body>  
      </html>	  
      
      

      Offensichtlich bricht das Skript schon nach dem ersten Aufruf von dberror() ab, denn die Testausgabe "Bla bla bla" in dbcall() erscheint erst gar nicht auf dem Bildschirm.
      Aber auch mit den korrigierten Werten in display_errors und error_report ändert sich nichts am Ergebnis: lokal erscheint beim Klicken auf das Pulldown-Menü "Status" eine Liste der möglichen Statuswerte für die Sendung (Pilotsendung, Regulär, Irregulär), die in einer Tabelle der Datenbank gespeichert sind, auf bergisch-afghanistan.de hingegen bleibt das Pulldown-Menü nach wie vor leer.

      Da es lokal mit mysql_connect nie Probleme gab (und ich fahre mein kleines Datenbanksystem schon seit zweieinhalb Monaten), kann es ja eigentlich nur eine Servergeschichte sein! Ich kontaktierte den technischen Service von all-inkl.com (meinem Webhoster), aber der konnte keinen Fehler feststellen, bei ihm funktioniert der Aufruf von mysql_connect(localhost, dateiname, passwort)...

      Bis bald im Khyberspace!

      Yadgar

      1. Tach!

        Offensichtlich bricht das Skript schon nach dem ersten Aufruf von dberror() ab, denn die Testausgabe "Bla bla bla" in dbcall() erscheint erst gar nicht auf dem Bildschirm.

        Offensichtlich oder anscheinend? Wenn du dir nicht im Klaren bist, was aufgerufen wird und was nicht, dann musst du mehr Testausgaben einbauen, um den Programmfluss zu verfolgen. Du nimmst an, dass dberror() aufgerufen wird, weißt das aber nicht. Kontrolliere bitte das Ergebnis von mysql_connect(). Du hast das ja schon in einer Variable. Gib diese unmittelbar danach mit var_dump() aus.

        Das dberror() würde ich auch nicht zur Abfrage verwenden, ob einer aufgetreten ist. Das sollte schon das Hauptprogramm tun. Die ganze Funktion halte ich nicht für besonders sinnvoll, denn damit limitierst du dich in der Fehlerbehandlung auf Standardreaktionen (und die() ist eine sehr unschöne Standard-Reaktion). Sei's drum.

        $db = mysql_connect(...);
        if (!$db)
          dberror(); // wenn's denn diese Funktion sein muss

        oder auch

        if (!($db = mysql_connect(...)))
          dberror();

        Aber eigentlich würde ich das so aufbauen

        if (!($db = mysql_connect(...))) {
          // Aktionen imn Fehlerfall
        } else {
          // Aktionen im Gut-Fall
        }

        Die Logik kann auch umgedreht werden, wenn die Fehlerbehandlung erst nach den Gut-Aktionen im Code stehen sollen

        if ($db = mysql_connect(...)) {
          // Aktionen im Gut-Fall
        ...

        Aber auch mit den korrigierten Werten in display_errors und error_report ändert sich nichts am Ergebnis: lokal erscheint beim Klicken auf das Pulldown-Menü "Status" eine Liste der möglichen Statuswerte für die Sendung (Pilotsendung, Regulär, Irregulär), die in einer Tabelle der Datenbank gespeichert sind, auf bergisch-afghanistan.de hingegen bleibt das Pulldown-Menü nach wie vor leer.

        Was jetzt? Doch kein Abbruch? Das Script läuft weiter und zeigt zumindest ein leeres Select? Auch den Rest der HTML-Elemente, die nach dem Select kommen? Hast du mal einen Blick in die Quelltextansicht des Browsers geworfen? Als PHP-Programmierer interesiert nämlich erst einmal das eigentliche Ergebnis: der erzeugte HTML-Code, und nicht das was der Browser draus macht.

        dedlfix.

        1. Hi(gh)!

          Was jetzt? Doch kein Abbruch? Das Script läuft weiter und zeigt zumindest ein leeres Select? Auch den Rest der HTML-Elemente, die nach dem Select kommen? Hast du mal einen Blick in die Quelltextansicht des Browsers geworfen? Als PHP-Programmierer interesiert nämlich erst einmal das eigentliche Ergebnis: der erzeugte HTML-Code, und nicht das was der Browser draus macht.

          Sieht so aus, als hätte ich den Fehler gefunden: der Remote-Server verwendet eine ältere PHP-Version, die mysql_set_charset() noch nicht kennt, jedenfalls führt diese Funktion im Quelltext zu einem Fatal Error - da dieser jedoch mitten in einem <select>-Block auftritt, wird die Textanzeige unterdrückt und ich wundere mich, dass ich nichts sehe...

          Nachdem ich die Funktion auskommentierte läuft das Skript einwandfrei!

          Danke für den Tipp!

          Bis bald im Khyberspace!

          Yadgar