Yadgar: PHP 4: Problem mit Wertübergabe per GET

Hi(gh)!

Folgendes Problem (immer noch und, ja, use_strict.php habe ich installiert, es schmeißt mir hier aber keine Fehlermeldung!):

Eine Liste von Datensätzen aus einer MySQL-Datenbank wird in Tabellenform ausgegeben, die ersten beiden Spalten enthalten Links zum Löschen bzw. Bearbeiten jedes Datensatzes. Der Löschen-Link übergibt (beim ersten Datensatz der Tabelle) folgende Werte:

section=2 (Funktion "Löschen oder Bearbeiten", 1 wäre "Eingabe von neuen Datensätzen")
first=0 (Position des ersten Datensatzes in der Liste, es werden immer jeweils 20 Datensätze ausgegeben)
delete=pre (führt zu einer Sicherheitsabfrage)
entry=3 (Indexwert des Datensatzes in der Datenbank)

Dieser Link und die damit verbundene Funktionalität funktionieren einwandfrei. Problematisch ist der "Bearbeiten"-Link; dort sollen (wiederum beim ersten Datensatz der Tabelle) übergeben werden:

section=2 (Funktion "Löschen oder Bearbeiten")
first=0 (Position des ersten Datensatzes in der Liste)
edit=yes (sorgt in der Funktion input() dafür, dass das Formular mit durch den Inhalt des zu bearbeitenden Datensatzes definierten Werten angezeigt wird)
entry=3 (Indexwert des Datensatzes in der Datenbank)

So weit, so gut... nur wird anscheinend nicht nur kein $_GET['entry'] angelegt, es ist nicht einmal möglich, sich den Wert mit

$entry = $_GET['entry'];  
echo "<p>entry = ".$entry."</p>"  

anzeigen zu lassen, ich bekomme nicht einmal ein "entry =" zu sehen!

Hier der Code:

	echo '<h3>Vorhandene Datensätze bearbeiten</h3>';  
	$first = $_GET['first'];  
	dbcall();  
	$query = "DESCRIBE hersteller";  
	$result = mysql_query($query);  
	dberror();  
	echo '<table width="150%">';  
	echo '<tr>';  
	echo '<td colspan="2" class="transparent">';  
	for ($i=0; $i<=4; $i++)  
	{  
	  $row = mysql_fetch_row($result);  
	  echo '<th class="headrow">';  
	  echo '<a href="hersteller.php?section=2&sort='.($i+1).'&first=0">';  
	  echo $row[0];  
	  echo '</a>';  
	  echo '</th>';  
	}  
	echo '</tr>';  
	$j=0;  
	$query_sort=" ORDER BY ";  
	switch ($_GET['sort'])  
	{  
	  case 1:  
	    $query_sort = $query_sort."ID";  
	  break;  
	  case 2:  
	    $query_sort = $query_sort."Firmenname";  
	  break;  
	  case 3:  
	    $query_sort = $query_sort."Land";  
	  break;  
	  case 4:  
	    $query_sort = $query_sort."Status";  
	  break;  
	  case 5:  
	    $query_sort = $query_sort."Link";  
	  break;  
	  default:  
	    $query_sort = "";  
	}  
	$query = "SELECT * FROM hersteller ".$query_sort." LIMIT ".$first.", 20";  
	$result = mysql_query($query);  
	dberror();  
	$sort = $_GET['sort'];  
	$delete = $_GET['delete'];  
	  
	while ($row = mysql_fetch_row($result))  
	{  
	  switch($j%2)  
	  {  
	    case 0:  
	      echo '<tr class="brightrow">';  
	    break;  
	    case 1:  
	      echo '<tr class="darkrow">';  
	    break;  
	  }  
	  echo '<td class="headrow"><span class="b"><a href="hersteller.php?section=2&first='.floor($j/20).'&delete=pre&entry='.$row[0].'">Löschen</a></span></td><td class="headrow"><span class="b"><a href="hersteller.php?section=2&first='.floor($j/20).'&edit=yes&entry='.$row[0].'&sort='.$sort.'&delete='.$delete.'">Bearbeiten</a></span></td><td align="right">'.$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[3]."</td><td>".$row[4]."</td></tr>";  
	  $j++;  
	}  
	echo '</table>';  
	$db = mysql_close();

Der Code für die input()-Funktion im Edit-Modus:

    function input()  
    {  
      if ($_GET['edit']=="yes")  
      {  
        $entry = $_GET['entry'];  
        $sort = $_GET['sort'];  
        echo "<p>entry = ".$entry."</p>"; // nichts wird angezeigt!  
        dbcall();  
        $query = "SELECT * FROM hersteller WHERE ID=".$entry;  
        // echo '<p>'.$query.'</p>';  
        $result = mysql_query($query);  
        dberror();  
        $row = mysql_fetch_row($result);  
        $formtop = '<form method="POST" action="hersteller.php?section=2&first=0&entry="'.$entry.'"&edit=yes&delete=no&sort="'.$sort.'>';  
      }  

...und der Aufruf:

	else if ($_GET['edit']=="yes")  
	{  
	  echo "Hallo!"; // wird angezeigt  
	  echo "<p>entry = ".$entry."</p>"; // wird NICHT angezeigt! Wieso?  
	  input();  
	}

Also, ich bin erstmal ratlos...

Bis bald im Khyberspace!

Yadgar

  1. Moin,

    sieht ziemlich planlos aus, ergo: Plan machen.

    Überlege Dir als Erstes, welche Parameter zu definieren, woraus dann die entsprechenden Aktionen abzuleiten sind. Du brauchst Parameter zum

    1. Bearbeiten,
    2. Löschen-Bestätigen
    3. Löschen,

    und dazu die ID (Beispiel-ID: 123) vom dazugehörigen Datensatz. Das könnte dann z.B. so aussehen:

    1. edit=123
    2. deleteconfirm=123
    3. delete=123

    Wobei in der übers Template aufgebauten Tabelle für (1) und (2) die Links zu setzen sind. Klick auf (1) erzeugt das Edit-Formular, Klick auf (2) einen weiteren Link zum Bestätigen des Löschvorgangs, dieser Link enthält dann den Parameter (3).

    Der Rest ist ganz einfach eine Parameter-Kontrollstruktur:

      
    // param() steht sinngemäß für den Griff in das $_GET-Array  
    if( param('edit') ){}  
    elsif( param('deleteconfirm') ) {}  
    elsif( param('delete') ){}  
    else{ errorPage("Unbekannter Parameter") }  
    
    

    Damit kriegst Du eine Struktur in Deinen Code, kannst den auch ggf. erweitern und zumindest auch optisch verstehen was die Wartung betrifft.

    MfG

  2. Tach!

    Eine Liste von Datensätzen aus einer MySQL-Datenbank wird in Tabellenform ausgegeben, die ersten beiden Spalten enthalten Links zum Löschen bzw. Bearbeiten jedes Datensatzes. Der Löschen-Link übergibt (beim ersten Datensatz der Tabelle) folgende Werte:

    Das ist schon der erste Fehler. Selbst wenn das Projekt nicht öffentlich zugänglich ist, sollte man sich gar nicht erst angewöhnen, Daten ändernde Dinge per GET-Parameter anzustoßen. Suchmaschinen folgen Links und damit auch den Löschen-Links. (POST folgen sie (zumindest Google) zwar auch, aber ganz vorsichtig, nur wenn sie sich sicher sind, keine solchen Aktionen auszulösen)

    So weit, so gut... nur wird anscheinend nicht nur kein $_GET['entry'] angelegt, es ist nicht einmal möglich, sich den Wert mit

    Es gibt Funktionen zur Kontrolle dessen was in einer Variable existiert:

    var_dump($_GET);

    Gibt man vorher ein <pre> aus oder schaut in die Quelltextansicht des Browsers sieht man eine lesbare Darstellung.

    $entry = $_GET['entry'];

    echo "<p>entry = ".$entry."</p>"

    
    >   
    > anzeigen zu lassen, ich bekomme nicht einmal ein "entry =" zu sehen!  
      
    Umkopieren in eine zweite Variable ist nicht sinnvoll. Die Werte stehen gebrauchsfertig in $\_GET, in diesem Fall reicht also var\_dump($\_GET['entry']). var\_dump() gibt immer was aus. Wenn nichts zu sehen ist und in deinem Fall selbst das entry= (und auch das <p> in der Quellcodeansicht) nicht zu sehen ist, dann wird wohl der Zweig nicht ausgeführt. Dann heißt es, zu kontrollieren was das if/switch für Parameter bekommen hat. Kann man auch mit var\_dump(bedingungsausdruck); ansehen.  
      
      
    dedlfix.
    
    1. Mahlzeit,

      var_dump($_GET);

      Gibt man vorher ein <pre> aus oder schaut in die Quelltextansicht des Browsers sieht man eine lesbare Darstellung.

      Oder man installiert xDebug und hat automatisch immer eine gut lesbare Ausgabe per var_dump.

      --
      42