Manuelle Sendungsverfolgung mit Daten aus einer Datenbank

Remagu

-unzulässig-
Registriert
3 Nov. 2013
Beiträge
90
Liebe Forum`ler,

für das Unternehmen für das ich arbeite, würde ich gerne eine Art "Sendungsverfolgung" ausarbeiten und bereitstellen die über eine Datenbank läuft. Die Einträge würden per Hand in die Datenbank eingetragen werden (Navicat).

Folgender Ablauf ist dafür geplant.
In unserer Homepage wird ein Formular eingebunden für die Suche.
Dort muss ein Kunde folgendes angeben:
Bestellnummer/Auftragsnummer und seine Postleitzahl
Wenn diese Angaben mit denen aus der Datenbank übereinstimmen sollen folgende Daten ausgegeben werden:
Lieferadresse, Bestellnummer/Auftragsnummer, Motor, Postleitzahl, und vorraussichtliches Lieferdatum.

Die Daten würden wir gerne täglich dann 1-2 mal aktualisieren.

Gibt es dafür ggf. eine Fertige Lösung?

-remagu
 
Eine fertige Lösung wird schwer, weil wir deine Datenbankstruktur nicht kennen. Das ganze ist aber extrem simpel: Baue ein Formular in deine Seite ein. In dem Script, das die Daten empfängt, baust du eine Verbindung zur Datenbank auf. Du führst eine Abfrage durch, in der du die Spalten für deine Informationen abfragst, und zwar aus jeder Zeile die mit der Bestellnummer und der PLZ übereinstimmen. Ein Beispiel für SQL:

SELECT lieferadresse, bestellnummer, motor, plz, lieferdatum FROM auftraege WHERE bestellnummer = :bestellnummer AND plz = :plz

Dabei musst du natürlich :bestellnummer und :plz befüllen, im Idealfall über Prepared Statements (ist sehr simpel, schau es dir mal in den PHP-Docs an. Sind nur 2-3 Zeilen Code mehr, die dich aber gegen SQL-Injections schützen).

Wenn die Abfrage erfolgt ist, weißt du, ob du Ergebnisse hast. Wenn ja, gibst du eben die Sachen aus. Wenn nein, dann stimmen die Daten nicht und du gibst eine Fehlermeldung aus.
 
  • Thread Starter Thread Starter
  • #3
[src=php]
<html>
<head>
<title>Motorenversand Verfolgung</title>
</head>
<body>
<h1>Ausgabe ihrer Anfrage</h1>
<meta charset="utf-8" />
<?php
mysql_connect('Serveradresse', 'passwort','sendung' or die(mysql_error());
mysql_select_db('verfolgung') or die(mysql_error());

$sql = "SELECT * FROM sendungen";
$query = mysql_query($sql) or die(mysql_error());

echo '<table>';
echo '<tr>';
echo '<th>Auftragsnummer</th>';
echo '<th>Bestellnummer</th>';
echo '<th>Rechnungsadresse</th>';
echo '<th>Lieferadresse</th>';
echo '<th>Motorkennbuchstabe</th>';
echo '<th>Postleitzahl</th>';
echo '<th>Zustellungszeitraum ca.</th>'
echo '</tr>';
while(fetch = mysql_fetch_assoc($query))
echo '<tr>';
echo '<td>' . $fetch['auftragsnummer'] . '</td>';
echo '<td>' . $fetch['bestellnummer'] . '</td>';
echo '<td>' . $fetch['rechnungsadresse'] . '</td>';
echo '<td>' . $fetch['lieferadresse'] . '</td>';
echo '<td>' . $fetch['motorkennbuchstabe'] . '</td>';
echo '<td>' . $fetch['postleitzahl'] . '</td>';
echo '<td>' . $fetch['zustellungszeitraum'] . '</td>';

echo '</tr>';
)
echo '</table>';

?>
</body>
</html>

[/src]

Leider schaffe ich keine Ausgabe aus der Datenbank, habe ich was falsch geschrieben?
 
Zuletzt bearbeitet:
Ich hab von PHP keinen Plan, aber fehlt da in Zl. 10 nicht eine schließende Klammer nach 'sendung'?
 
Okay, lass uns das ganze mal Zeile für Zeile durchgehen. Ich denke mal, so kannst du am einfachsten sehen, wo die Problem liegen. Versteh das hier bitte nicht als Kritik, ich will dir helfen. :)

[src=html4strict]<meta charset="utf-8" />[/src]

Meta-Tags sollten immer in den Head, der hier ist aber im Body. Also ab nach oben damit.

[src=php]mysql_connect('Serveradresse', 'passwort', 'sendung' or die(mysql_error());[/src]

Hier gibt es drei Punkte. Einerseits: Es fehlt die schließende Klammer für die mysql_connect-Funktion, wie von Brother John angemerkt. Korrekt wäre es:

[src=php]mysql_connect('Serveradresse', 'passwort', 'sendung') or die(mysql_error());[/src]

Der zweite Punkt ist: Benutze nicht "or die(mysql_error())". Viele Tutorials machen das so, allerdings ist es immer schlecht, dem Benutzer irgendwelche Fehlercodes ins Gesicht zu klatschen und den Rest der Seite fehlerhaft rendern zu lassen. Geb einen netten Fehlercode aus oder so. Oder geb im Body mysql_error aus, du kannst ja trotzdem überprüfen, ob mysql_connect erfolgreich ist.

Der dritte Punkt: NEIN NEIN NEIN NEIN. Benutz bitte nicht die mysql-Extension. Ich weiß, in vielen Tutorials wird davon erzählt, aber sie ist veraltet, bei der kleinsten Unachtsamkeit extrem unsicher und sowieso deprecated bzw. mit PHP7 entfernt.
Tu dir und jedem, der nochmal mit dem Code arbeiten muss einen Gefallen und arbeite mit mysqli oder PDO. Beides kann und sollte man objektorientiert nutzen, mysqli kann man aber auch prozedural verwenden (wie du mysql verwendet hast). Der Umstieg ist fast überall ziemlich simpel: Einfach ein "i" an das mysql hängen. Es gibt ein paar Punkte die du beachten musst, schau dafür einfach in die Dokumentation - da ist alles unglaublich gut erklärt. Aber benutz keinesfalls mysql.

[src=php]mysql_select_db('verfolgung') or die(mysql_error());[/src]

Wieder: Kein "or die()". Soll auch das letzte mal gewesen sein, dass ich das anbringe. An allen anderen Stellen bitte auch fixen.

[src=php]echo '<table>';
echo '<tr>';
echo '<th>Auftragsnummer</th>';
echo '<th>Bestellnummer</th>';
echo '<th>Rechnungsadresse</th>';
echo '<th>Lieferadresse</th>';
echo '<th>Motorkennbuchstabe</th>';
echo '<th>Postleitzahl</th>';
echo '<th>Zustellungszeitraum ca.</th>'
echo '</tr>';[/src]

Nur als Tipp: Ich würde an der Stelle einfach die PHP-Tags schließen, die Tabelle hinschreiben und wieder öffnen. Ist schneller und einfacher. :)

[src=php]while(fetch = mysql_fetch_assoc($query))
echo '<tr>';
echo '<td>' . $fetch['auftragsnummer'] . '</td>';
echo '<td>' . $fetch['bestellnummer'] . '</td>';
echo '<td>' . $fetch['rechnungsadresse'] . '</td>';
echo '<td>' . $fetch['lieferadresse'] . '</td>';
echo '<td>' . $fetch['motorkennbuchstabe'] . '</td>';
echo '<td>' . $fetch['postleitzahl'] . '</td>';
echo '<td>' . $fetch['zustellungszeitraum'] . '</td>';

echo '</tr>';
)[/src]

Hier treten vermutlich die meisten deiner Probleme auf. Es gibt mehrere Probleme: Einerseits fehlt bei "fetch" das Dollar-Zeichen, sodass es als Konstante angenommen wird. Ich vermute mal dass eure Serverumgebung relativ alt ist, da sie dich nicht anschreit wegen mysql - sie wird also auch noch nicht automatisch $fetch annehmen.

Dann ist die while-Struktur falsch. Nach der Bedingungsklammer fehlt nämlich der Codeblock, der durch geschweifte Klammern angezeigt wird.

So ist es richtig (bis auf mysql):

[src=php]while($fetch = mysql_fetch_assoc($query)) {
echo '<tr>';
echo '<td>' . $fetch['auftragsnummer'] . '</td>';
echo '<td>' . $fetch['bestellnummer'] . '</td>';
echo '<td>' . $fetch['rechnungsadresse'] . '</td>';
echo '<td>' . $fetch['lieferadresse'] . '</td>';
echo '<td>' . $fetch['motorkennbuchstabe'] . '</td>';
echo '<td>' . $fetch['postleitzahl'] . '</td>';
echo '<td>' . $fetch['zustellungszeitraum'] . '</td>';

echo '</tr>';
}[/src]

Übrigens, eine Alternative für das Templating ist "<?=". Das ist dasselbe wie "<?php echo". Spart viel Boilerplate und Escaping:

[src=php]<tr>
<td><?= $fetch['auftragsnummer'] ?></td>
<td><?= $fetch['bestellnummer'] ?></td>
<td><?= $fetch['rechnungsadresse'] ?></td>
<td><?= $fetch['lieferadresse'] ?></td>
<td><?= $fetch['motorkennbuchstabe'] ?></td>
<td><?= $fetch['postleitzahl'] ?></td>
<td><?= $fetch['zustellungszeitraum'] ?></td>
</tr>[/src]

Insgesamt würde ich es eher so schreiben (keine Ahnung ob es so funktioniert, denke aber schon):
[src=php]<html>
<head>
<title>Motorenversand Verfolgung</title>
<meta charset="utf-8" />
</head>
<body>
<h1>Ausgabe ihrer Anfrage</h1>
<table>
<?php
$error = "";

$mysqli = new mysqli("Serveradresse", "sendung", "Passwort", "verfolgung");
if($mysqli->connect_errno) {
$error = $mysqli->connect_errno;
}

if($error === "") {
$result = $mysqli->query("SELECT * FROM sendungen");
while($fetch = $result->fetch_assoc()) {
?>
<tr>
<td><?= $fetch['auftragsnummer'] ?></td>
<td><?= $fetch['bestellnummer'] ?></td>
<td><?= $fetch['rechnungsadresse'] ?></td>
<td><?= $fetch['lieferadresse'] ?></td>
<td><?= $fetch['motorkennbuchstabe'] ?></td>
<td><?= $fetch['postleitzahl'] ?></td>
<td><?= $fetch['zustellungszeitraum'] ?></td>
</tr>
<?php
}
$mysqli->close();
?>
</table>
<?php } else { ?>
<h1>Es trat ein Fehler auf!</h1>
<?php } ?>
</body>
</html>[/src]
 
Wenn die HTML-Tags als Strings gespeichert werden, muss man vorsichtig sein, was man schreibt. Beispielsweise werden Variablen in mit " erstellten Strings automatisch ersetzt, und man müsste sie speziell maskieren. Man muss nicht jedes einzelne " oder ' (je nachdem, was man einsetzt) escapen, was immer nicht nur einiges an Arbeit ist, sondern auch sehr unordentlich aussieht (Unterschied: "<img src=\"path\" />" zu <img src="path" />). Zudem spart man sich die String-Concatenation, die immer recht unschön wird (Unterschied: "<td>" . $var . "</td>" zu <td><?= $var ?></td>, was wie ein natives Tag wirkt). Und man hat nicht mehr "<?php echo" am Anfang stehen, was ich für reines Templating sehr unschön finde.
 
Zurück
Oben