Sven Rautenberg: Denkfehler im PHP-Script

Beitrag lesen

Moin!

Kommentare stehen im Code.

Ursache für deinen beobachteten Effekt dürfte aber die Abwesenheit von jeglichem prüfenden Code sein, ob die übergebenen Parameter auch stimmen.

  

> <?PHP  
> $sql_database = "+++";  
> $sql_host = "+++";  
> $sql_user = "+++";  
> $sql_pass = "+++";  

// Ich halte es für sehr empfehlenswert, wenn man solche Angaben, die sich im gesamten Skript nie mehr ändern werden und auch nicht sollen, als Konstanten definiert.  

>   
> $db = mysql_connect($sql_host,$sql_user,$sql_pass) OR DIE ("<br>Keine Verbindung zur SQL-Datenbank!");  
>       mysql_select_db($sql_database,$db) OR DIE ("<br>Konnte Datenbank nicht finden!");  
>   
> if(isset($id)) {  

// Über die negativen Auswirkungen von register_globals=on wurde schon etwas gesagt. $_GET['id'] wäre hier der richtige Wert, auf den man zugreifen muß.  

>  $count = mysql_query("SELECT * FROM links WHERE id = '$id'");  

// "SELECT *" ist immer schlecht. Schreibe explizit die Spalten auf, welche du abfragen willst. Damit definierst du gleichzeitig auch die Reihenfolge, in der die Spalten im Ergebnis erscheinen, denn...  

>  $wert = mysql_fetch_row($count);  
>   
>  $ip_alt = $wert[5];  

// ...an dieser Stelle vertraust du darauf, dass die fünfte Spalte deines "SELECT *" auch tatsächlich die IP-Adresse ist - es könnte aber auch was ganz anderes sein, ohne dass du es bemerken würdest. Deshalb:  
// 1. Nie "SELECT *". Immer "SELECT id, ip, url".  
// 2. Nie mysql_fetch_row(), immer mysql_fetch_array() bzw. mysql_fetch_assoc().  
// 3. Der Zugriff auf die Ergebniszeile geht dann mit $wert['ip'] - da sieht man sofort, welche _Bedeutung_ die Spalte hat. Das erleichtert auch die Fehlersuche.  

>  $ip_neu = getenv("REMOTE_ADDR");  
>  $link = $wert[1];  

// Hier genau dasselbe. $wert['link'] wäre schlauer, das Umkopieren in eine neue Variable kann man sich sparen.  

>   
>  if ($ip_alt != $ip_neu)  
>  {  
>   $hits = $wert[4]; $hits++;  

// Umständlich. Einfacher ist $hits = $wert['hits'] + 1; Oder gar $wert['hits']++;  

>   $update="REPLACE INTO links SET id = '$wert[0]', url = '$wert[1]', name = '$wert[2]', text = '$wert[3]', klicks = '$hits', ip = '$ip_neu'";  

// Nun ja, wenn hier mal keine Variablen durcheinander kommen.  

>   mysql_query($update) OR DIE(" ".mysql_error());  
>  }  
>   
>  header("Location: $link");  

// Ist der Link eigentlich eine vollwertige HTTP-URL? Die Tabelle oben hatte keine Protokollangabe.  

>  exit;  
> }  
>   
> $seitentitel = "Treffpage &raquo; Start &raquo; Links";  
> $kategorie = "start";  
> include("/web/header.php");  
>   
> echo "Die Links in unserer Linkliste sind nach ihrer Beliebtheit sortiert. Das heißt im Klartext: Je öfter ein Link von Besuchern angeklickt wurde, desto weiter oben steht er in der Linkliste.";  
>   
> $data = mysql_query("SELECT * FROM links ORDER BY klicks DESC");  

// "SELECT *" schon wieder...  

> $zaehler = "1";  
> while($zeile = mysql_fetch_row($data)) {  

// mysql_fetch_row() schon wieder...  

>   
>  echo "<div style=\"margin-top: 15px;\"><b>$zaehler. <a href=\"index.php?id=$zeile[0]\" target=\"_blank\">$zeile[2]</a></b> ($zeile[4] Aufrufe)<br>  
>   
> \n$zeile[3]</div>\n";  
>  $zaehler++;  
> }  
>   
> include("/web/footer.php");  
> ?>  

  • Sven Rautenberg