*Markus: (MYSQL) Daten werden manchmal geliefert, manchmal nicht

Hallo,

gerade musste ich ein Phänomen beobachten, das ich so noch nicht erlebt habe. Ich lese mit einem simplen Query Daten aus einer Tabelle aus, was auch problemlos funktioniert. Ab und zu kommt es aber vor, dass anstatt der Daten einfach nichts ausgegeben wird. Es erscheint nur eine leere Seite. Es werden auch keine SQL-Fehler im Errorlog ausgegeben. Es werden einfach nur keine Daten geliefert. Ich kann mir das nicht erklären. Klicke ich ein paar mal wieder auf den selben Link, der die Daten abruft, kann es sein, dass es ein paar Mal nicht funktioniert, dann funktioniert es wieder 20 Mal hintereinander. Dann funktioniert es wieder ein Mal nicht. Wie kann das sein?

Dies ist die Datei, die den Inhalt ausgibt:

  
<?php  
  
include_once("../dao/HerstellerDao.php");  
  
$dao = new HerstellerDao();  
$hersteller = $dao->getAlleBrillenmarken();  
  
echo <<<EOT  
<div id="inhalt">  
<h1>Marke bearbeiten (wird per Name sortiert aufgelistet)</h1>  
  
EOT;  
		   while (list($h_id, $h_name) = each ($hersteller)) {  
                echo '<form method="post" action=".">', "\n";  
                echo '<table class="editkunde" rules="rows">',"\n";  
    			echo "<tr><td style=\"width:15%\"><b>Marke</b></td><td style=\"width:60%\">" . $h_name . "</td><td></td></tr>\n";  
  				echo "<tr><td></td><td><input type=\"hidden\" name=\"id\" value=\"$h_id\" />";  
  				echo "<input type=\"submit\" name=\"edithersteller\" value=\"Editieren\" /></td><td></td></tr>\n";  
  				echo "<tr><td class=\"grey\" colspan=\"3\">&nbsp;</td></tr>\n";	  
  				echo '</table>',"\n";  
  				echo '</form>',"\n";  
  			}  
echo <<<EOT  
</div>  
</body>  
</html>  
EOT;  
  
?>  

Wenn es einmal nicht funktioniert, wird das HTML der Datei zwar angezeigt, jedoch der Inhalt der While-Schleife nicht. Der HTML-Quellcode dieser Datei sieht dann so aus:

  
<div id="inhalt">  
<h1>Marke bearbeiten (wird per Name sortiert aufgelistet)</h1>  
</div>  
</body>  
</html>  

Dies ist die Methode, die die Daten ausliest:

  
	  public function getAlleBrillenmarken()   {  
	  			  
	  		  if (!($con = mysql_pconnect(DB_HOST, DB_USER, DB_PASS)))   {  
		  		  	echo "Datenbankverbindung fehlgeschlagen: " . mysql_error($con) . "\n";  
		  		  	exit(-1);  
		  	  }  
		  		  
		  	  if (!mysql_select_db(DB_NAME, $con))  {  
		  		    mysql_close($con);  
				  	 echo "Datenbank nicht auswählbar: " . mysql_error($con) . "\n";  
					 exit(-1);  
			  }	  
		  	//Brillenmarke auslesen  
		  	 $query_string = "SELECT h_id, h_name FROM Brillenmarke ORDER BY h_name";  
		  		 					  
	 		  if (!($result = mysql_query($query_string, $con)))   {  
	 			 	mysql_close($con);  
	 			 	echo "Brillenmarke auslesen fehlgeschlagen: " . mysql_errno($con) . " " . mysql_error($con) . "\n";  
	 			 	exit(-1);  
	 		  }  
	 		  
	 		  $hersteller = array();  
	 		  
	 		  while ($row = mysql_fetch_assoc($result))  
				  	   $hersteller[$row['h_id']] = $row['h_name'];	  
    		  
    		  mysql_free_result($result);  
  
			  if (!mysql_close($con))  
				 	echo "Warnung, Datenbank wurde nicht erfolgreich geschlossen: " . mysql_errno($con) . ", " . mysql_error($con) . "\n";  
				 	  
			  return $hersteller;	  
	  }  

wie gesagt. Keine SQL-Fehler und meistens funktioniert es ja. Aber ab und zu nicht. Wie kann ich mir das erklären?

Markus

  1. Hi!

    Es werden auch keine SQL-Fehler im Errorlog ausgegeben.

    PHP schreibt keine SQL-Fehler in sein Error-Log, oder welches konkret meinst du?

    Es werden einfach nur keine Daten geliefert. Ich kann mir das nicht erklären. Klicke ich ein paar mal wieder auf den selben Link, der die Daten abruft, kann es sein, dass es ein paar Mal nicht funktioniert, dann funktioniert es wieder 20 Mal hintereinander. Dann funktioniert es wieder ein Mal nicht. Wie kann das sein?

    Dies ist die Datei, die den Inhalt ausgibt:

    Die ist unwichtig. Mach lieber Kontrollausgaben (mit var_dump()) von strategisch wichtigen Variablen und vergleiche Wunsch und Wirklichkeit

    echo "<tr><td style="width:15%"><b>Marke</b></td><td style="width:60%">" . $h_name . "</td><td></td></tr>\n";
       echo "<tr><td></td><td><input type="hidden" name="id" value="$h_id" />";

    Die Variablen enthalten HTML-Code? Wenn nicht, sind sie für HTML aufbereitet, so dass ein < vom Browser auch als < aufgefasst wird und nicht als Tag-Öffner?

    Dies ist die Methode, die die Daten ausliest:

    Die ist schon interessanter, aber ohne Kontrollausgaben nur vom Code her bewertbar.

    if (!($con = mysql_pconnect(DB_HOST, DB_USER, DB_PASS)))   {

    Bist du sicher, dass du die P-Variante verstanden und alles dafür notwendige vorbereitet hast? Wenn nicht, nimm lieber das normale mysql_connect(). (Und noch besser wäre eine moderne Variante: mysqli.)

        		  	echo "Datenbankverbindung fehlgeschlagen: " . mysql\_error($con) . "\n";  
        		  	exit(-1);  
    

    Bist du weiterhin sicher, dass du im Falle eines Fehlers den Anwendern technische Detailinformationen zur Verfügung stellen willst, obwohl diese damit vermutlich/hoffentlich nichts anfangen können und dass du dem Browser durch das exit() mit einer wahrscheinlich unvollständigen Seite abspeisen willst?

        		    mysql\_close($con);  
    

    Du brauchst nicht übertrieben oft die Verbindung zu schließen. Im Allgemeinen reicht es aus, das händisch zu tun, wenn das Script nachher noch deutlich lange arbeiten muss und die Ressource wieder freigegeben werden soll. Ansonsten räumt PHP diese am Script-Ende automatisch auf.

      	  if (!($result = mysql\_query($query\_string, $con)))   {  
      		 	mysql\_close($con);  
      		 	echo "Brillenmarke auslesen fehlgeschlagen: " . mysql\_errno($con) . " " . mysql\_error($con) . "\n";  
    

    Ob nach dem Schließen der Verbindung die Fehlermeldung noch ausgelesen werden kann, die noch dazu von einer noch davor stattgefunden habenden mysql-Funktion (möglicherweise) erzeugt wurde? Eine solche Fehlermeldung steht auch nicht im HTML-Quellcode der ausgelieferten Seite und wird aufgrund von vorhergehendem HTML- oder CSS-Code nur nicht im Browser angezeigt?

    mysql_free_result($result);

    Für mysql_free_result() gilt das gleiche wie für mysql_close().

    Lo!