Hi(gh)!
Also noch mal neu, diesmal auf dem lokalen Testserver:
Lege ein im Serverroot ein Verzeichnis "logs" an. Setze dessen Eigenschaften so, dass JEDER es betreten kann.
Habe ich gemacht...
Lege darin eine Datei "logfile" an. Setze deren Eigenschaften so, dass JEDER (insbesondere der WEBSERVER!) diese lesen und schreiben kann. (Nicht: ausführen!)
Habe ich gemacht...
Hole:
http://www.fastix.org/r/use_strict.txt und speichere diese als
use_strict.php
im Serverroot.
Habe ich gemacht...
Stelle in die erste Zeile Deines Skriptes
<?php
define('DEBUG', 2); require_once( $_SERVER['DOCUMENT_ROOT'] . '/use_strict.php' );
>
> 4.)
> nimm
> entweder 4a)
> ~~~php
> error_log($query, 3, $_SERVER['DOCUMENT_ROOT'] . '/logs/logfile]' );
>
Habe ich gemacht... jetzt die Probe aufs Exempel:
hersteller.php aufrufen...
Untermenüpunkt "Vorhandene Datensätze editieren" aufrufen...
Aha! Fehler in Zeile 100:
$_GET['section'] ist beim Erstaufruf der Seite natürlich noch nicht gesetzt! Also ändere ich den Link in der Navigationsleiste auf "hersteller.php?section=0"... dann wird keine Fehlermeldung mehr angezeigt und ich sehe die beiden Links auf die Hauptfunktionen der Seite: "Datensätze hinzufügen" und "Vorhandene Datensätze bearbeiten".
Ich klicke auf "Vorhandene Datensätze bearbeiten":
Boinks! Nächster Fehler in Zeile 188:
$_GET['sort'] ist noch nicht gesetzt. Auch klar, denn es wird erst beim ersten Aufruf eines der Links auf den Kopfzeilen der Datensatzliste gesetzt... also füge ich dem Link auf "Vorhandene Datensätze bearbeiten" ein "&sort=0" hinzu.
Nächster Fehler: Zeile 230:
$_GET['delete'] ist noch nicht gesetzt. Also noch ein "&delete=no" in den Link auf "Vorhandene Datensätze bearbeiten"!
Nächster Fehler: Zeile 251:
$_GET['edit'] ist nicht gesetzt. Also noch ein "&edit=no" in den Link auf "Vorhandene Datensätze bearbeiten"!
Keine weiteren Fehlermeldungen, die ersten 20 Datensätze werden kommentarlos angezeigt!
Ich klicke jetzt auf "Bearbeiten" neben dem ersten Datensatz (Index-Nummer 3!)...
Wieder Fehler in Zeile 188:
$_GET['sort'] ist nicht gesetzt, weil es in den Links auf "Bearbeiten" fehlt... es empfiehlt sich hier, den jeweils bisherigen Wert zu übernehmen, also:
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.'">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>";
Noch ein Fehler in Zeile 230 - das gleiche Spiel mit $_GET['delete']... also füge ich in Zeile 213 ein:
$delete = $_GET['delete'];
um nicht mit der umständlicheren Array-Schreibweise hantieren zu müssen und füge in die Links (sie werden in einer while-Schleife erzeugt, jeweils für 20 Datensätze) auf "Bearbeiten" noch &delete='.$delete. ein.
Jetzt wird beim Klicken auf "Bearbeiten" immerhin schon nach "Hallo!" die Testausgabe mit der ausgewählten Index-Nummer (in diesem Fall die 3):
echo "<p>entry = ".$entry."</p>";
angezeigt, das funktionierte vorher nicht... allerdings bekomme ich jetzt noch eine Fehlermeldung, und zwar in Zeile 36:
Die Variable $s ist nicht definiert - es handelt sich dabei um einen Coderest, der eigentlich schon auskommentiert sein sollte, in besagter Zeile sollte $s (enthält den aktuellen Wert von $_GET['section']) ausgegeben werden. Ich entferne die Zeile, ebenso wie die bereits auskommentierte Deklaration von $s.
Jetzt wird es allerdings haarig: die nächste Fehlermeldung verweist auf Zeile 66:
$_POST['Firmenname'] (und analog die anderen normalerweise mit dem ausgefüllten Eingabeformular übermittelten Feldwerte) ist nicht gesetzt - kann ja auch nicht, da ja im Falle von edit=yes erst einmal nur das Eingabeformular (mit den Feldwerten aus dem Datensatz entsprechend des Wertes von $entry) angezeigt wird, aber noch keine Daten abgeschickt wurden. $Firmenname (und entsprechend die anderen Datenfeldvariablen) muss also im Fall von edit=yes seinen Wert aus dem eingelesenen Datensatz erhalten:
if ($_GET['edit']=="yes")
{
$Firmenname = $row[1];
$Land = $row[2];
$Status = $row[3];
$Link = $row[4];
}
else
{
$Firmenname = $_POST['Firmenname'];
$Land = $_POST['Land'];
$Status = $_POST['Status'];
$Link = $_POST['Link'];
}
Damit komme ich auch der Lösung meines eigentlichen Problems näher: denn wenn $Firmenname nicht bekannt war, konnte natürlich auch die switch-Verzweigung entsprechend dem Wert von $_GET['section'] nicht durchlaufen werden, ich bekam stattdessen immer die Meldung "Es wurden keine Datensätze eingegeben". Siehe hier:
if (!$Firmenname)
{
echo "Sie haben keine Daten eingegeben!<br>";
}
else
{
dbcall();
switch ($_GET['section'])
{
case 1:
$query = "INSERT INTO hersteller (Firmenname, Land, Status, Link) VALUES ('".mysql_real_escape_string($Firmenname)."','".mysql_real_escape_string($Land)."','".mysql_real_escape_string($Status)."','".mysql_real_escape_string($Link)."')";
break;
case 2:
$query = "UPDATE hersteller SET Firmenname='".mysql_real_escape_string($Firmenname)."', Land='".mysql_real_escape_string($Land)."', Status='".mysql_real_escape_string($Status)."', Link='".mysql_real_escape_string($Link)."' WHERE ID=".$entry;
error_log($query, 3, $_SERVER['DOCUMENT_ROOT'] . '/logs/logfile]' );
break;
default:
echo "<p>section = ".$_GET['section']."</p>";
}
echo "<p>Query = ".$query."</p>";
$result = mysql_query($query);
dberror();
echo "Ihre Eingabe war korrekt und wurde in die Datenbank eingetragen!";
$db = mysql_close();
dberror();
}
Jetzt sollte nicht nur der UPDATE-Query korrekt ausgeführt werden, sondern auch angezeigt werden - womit das Abfangen im Errorlog (erst einmal) nicht notwendig gewesen wäre.
Der Test:
Jetzt passiert etwas, was ich so nicht beabsichtigt hatte: der UPDATE-Query wird ausgeführt und angezeigt, allerdings noch mit den alten Datenfeldwerten, d. h. der Datensatz wird bereits "geändert" (faktisch schon, da ja der Inhalt des Feldes "Firmenname" nur bis zum ersten Whitespace übernommen wurde), bevor ich überhaupt den/die neuen Wert/e eintragen und auf "Daten absenden" klicken konnte. Vor allem aber erscheint wieder eine Fehlermeldung, diesmal in Zeile 196 (die ehemalige 188, durch meine Code-Einfügungen haben sich natürlich die Zeilennummern geändert): $_GET['sort'] ist aktuell nicht definiert.
Dabei müsste es doch bekannt sein, denn im Link zu "Bearbeiten" wird auch sort (entsprechend der jeweiligen Datensatzzeile) übertragen! Ich verstehe das nicht...
...und jetzt bin ich auch schon wieder zu müde, um weiter zu arbeiten! Wie machen das eigentlich die Profis, die doch angeblich regelmäßig drei Tage und Nächte am Stück durchprogrammieren?
Bis bald im Khyberspace!
Yadgar