Yadgar: mysql_connect() funktioniert nicht!

Beitrag lesen

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