• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
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.
 

Remagu

-unzulässig-

Registriert
3 Nov. 2013
Beiträge
90
  • 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:

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
Ich hab von PHP keinen Plan, aber fehlt da in Zl. 10 nicht eine schließende Klammer nach 'sendung'?
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
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]
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
@amphetam1n: 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.
 
Oben