dedlfix: Frage zu MySQL und PHP

Beitrag lesen

Tach!

Hab mal durch probiert, mein Code sieht nun so aus:

Problem ist ja gelöst, hier noch einige allgemeine Anmerkungen:

  		$ID = $\_GET['id'];  

Auch wenn es sehr oft so zu sehen ist, du brauchst die Werte aus $_GET/$_POST nicht zu kopieren. Du kannst sie einfach so verwenden.

  		if($ID="")  
  		{  
  			$ID = 0;  
  		}  
  		if($ID!=0)  

Diese Zeilen inklusive der Umkopierzeile lassen sich zusammenfassen zu

if (!empty($_GET['id']))

  			$queryway = "SELECT \* FROM Downloads WHERE `id` = " . mysql\_real\_escape\_string($ID);  

Bitte beachte auch den weiteren Verlauf der Escape-Diskussion. Ohne Anführungszeichen verhindert das mysql_real_escape_string() gar nichts. Das Ergebnis von mysql_real_escape_string() ist nur im String-Kontext sinnvoll und kann auch nur dort vor SQL-Injection schützen.

$queryway = sprintf("SELECT * FROM Downloads WHERE id = '%s'", mysql_real_escape_string($_GET['id']));

Mit sprintf() bleibt der Statement-String in einem Stück stehen und macht die Sache nicht noch durch Stringverkettungen unübersichtlicher.

  			$query = mysql\_query($queryway);  
  			while($row = mysql\_fetch\_assoc($query))  

(My)SQL-Querys können aus verschiedenen Gründen sich mit einer Fehlersignalisierung zurückmelden. Das Funktionsergebnis von mysql_query() ist dann false, was kein gültiger Wert für die Fetch-Funktion ist. Wenn du robust programmieren willst, beachtest du solche Fehlermöglichkeiten in deinem Programmablauf.

  			{  
  				$maptitle = $row['Name'];  
  				$mapgame = $row['Spiel'];  
  				$maptyp = $row['Map-Art'];  
  				$mapdesc = nl2br($row['Map-Beschreibung']);  
  				  
  				echo "<div class=\"post\"><p class=\"title\">{$maptitle}</p><p><img src=\"images/maps/{$maptitle}.png\" \><br />Spiel: {$mapgame} Map-Art: {$maptyp}<br />{$mapdesc}<br /><a href=\"Maps/{$maptitle}.bsp\">Download!</a></p></div>";  

Auch hier ist das Umkopieren nicht notwendig. Es gibt eine Systax für komplexe Variablenausdrücke in ""-Strings. Die brauchst du aber nicht, weil du bei Beachtung des Kontextwechsels sowieso noch htmlspecialchars() aufrufen musst, wozu du den String jedoch unterbrechen musst. Oder du nimmst wieder printf() mit Platzhaltern. (Diesmal printf() mit ohne s am Anfang, weil die Ausgabe ja sofort erfolgen soll.)

dedlfix.