Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
PHP Lagerverwaltung - Ausbuchen nicht möglich
- Ersteller unixp
- Erstellt am
Wenn ich das richtig verstanden habe, wir bei einer Ausbuchung in der Tabelle einbuchung das Feld ausgebucht = 1 gesetzt und entsprechende Zeilen in die Tabelle ausgebucht geschrieben. Somit wäre das delete von Hancock flasch.
D.h. du musst schon im PHP abfragen, ob der ganze Stellplatz oder nur eine EAN-Nummer ausgebucht wird. Für ersteres musst du dann mehrere Zeilen behandeln:
1. Alle nicht ausgebuchten Positionen auf Stellplatz X auslesen,
2. diese in ausgebucht einfügen und
3. in eingebucht die Ausbuchungen entsprechend markieren.
D.h. du musst schon im PHP abfragen, ob der ganze Stellplatz oder nur eine EAN-Nummer ausgebucht wird. Für ersteres musst du dann mehrere Zeilen behandeln:
1. Alle nicht ausgebuchten Positionen auf Stellplatz X auslesen,
2. diese in ausgebucht einfügen und
3. in eingebucht die Ausbuchungen entsprechend markieren.
@Darlis: Ja da hab ich das Layout durcheinanderbracht:
Das ? ist ein Platzhalter, wie man sie bei prepared-statements verwenden kann.
Prepared-Statements sind sehr praktisch, da du zuerst die Syntax vorgibst und dann sagst, welcher Platzhalter welchen Wert haben soll, daher wird dein Query übersichtlicher und sicher gegen SQL-Injections.
Code:
insert into ausgebucht(...) select ... from eingebucht where stellplatz=? and ausgebucht=0;
update eingebucht set ausgebucht=1 where stellplatz=?
Prepared-Statements sind sehr praktisch, da du zuerst die Syntax vorgibst und dann sagst, welcher Platzhalter welchen Wert haben soll, daher wird dein Query übersichtlicher und sicher gegen SQL-Injections.
Also der momentane php code der ausbuchen.php sieht so aus:
Ich habe ja ein neues Feld namens "Stellplatz" mit einem Button zum Stellplatz ausbuchen:
Kann ich nun in der php Abfrage diesen Code einfach ganz unten unter der ersten if Abfrage
platzieren?
Der komplette code dann:
Wie übergebe ich den "?" die Werte? Es muss ja die eingegebene Stellplatz-Nummer an dieser Stelle übergeben werden...
Welche Werte hast du für "..."
angedacht?
PHP:
<?php
if($_POST["action"]=="ausbuchen"){
include("server_data.php");
$mitarbeiter = trim($_POST["mitarbeiter"]);
$paketnummer = trim($_POST["paketnummer"]);
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE paketnummer = $paketnummer AND ausgebucht = 0";
$result = mysql_query($sql_pruefen);
$anzahl = mysql_fetch_array($result);
echo $anzahl['anzahl_ausgebucht'];
if ($anzahl['anzahl_ausgebucht'] == 1){
$sql_einfuegen = "INSERT INTO ausbuchung(mitarbeiter, paketnummer) VALUES('$mitarbeiter','$paketnummer')";
mysql_query($sql_einfuegen) or die(mysql_error());
$sql_update = "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE paketnummer = $paketnummer";
mysql_query($sql_update) or die(mysql_error());
$var2 = 'Ausgebucht!';
echo "var2=".$var2;
}
else{
$var2 = 'Fehler';
echo "var2=".$var2;
}
}
?>
Ich habe ja ein neues Feld namens "Stellplatz" mit einem Button zum Stellplatz ausbuchen:
PHP:
<input type="hidden" name="action" value="stellplatz" />
<input id="saveForm" class="button_text" type="submit" name="stellplatz" value="Ausbuchen" style="width: 160px; height: 60px" />
Kann ich nun in der php Abfrage diesen Code einfach ganz unten unter der ersten if Abfrage
PHP:
if($_POST["action"]=="ausbuchen"){
Der komplette code dann:
PHP:
<?php
if($_POST["action"]=="ausbuchen"){
include("server_data.php");
$mitarbeiter = trim($_POST["mitarbeiter"]);
$paketnummer = trim($_POST["paketnummer"]);
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE paketnummer = $paketnummer AND ausgebucht = 0";
$result = mysql_query($sql_pruefen);
$anzahl = mysql_fetch_array($result);
echo $anzahl['anzahl_ausgebucht'];
if ($anzahl['anzahl_ausgebucht'] == 1){
$sql_einfuegen = "INSERT INTO ausbuchung(mitarbeiter, paketnummer) VALUES('$mitarbeiter','$paketnummer')";
mysql_query($sql_einfuegen) or die(mysql_error());
$sql_update = "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE paketnummer = $paketnummer";
mysql_query($sql_update) or die(mysql_error());
$var2 = 'Ausgebucht!';
echo "var2=".$var2;
}
else{
$var2 = 'Fehler';
echo "var2=".$var2;
}
}
if($_POST["action"]=="stellplatz"){
$stellplatz= trim($_POST["stellplatz"]);
insert into einbuchen(...) select ... from eingebucht where stellplatz=? and ausgebucht=0;
update einbuchen set ausgebucht=1 where stellplatz=?
}
?>
Wie übergebe ich den "?" die Werte? Es muss ja die eingegebene Stellplatz-Nummer an dieser Stelle übergeben werden...
Welche Werte hast du für "..."
PHP:
insert into einbuchen(...) select ...
Bei dem Ausbuchen soll jetzt statt der Paketnummer die EAN Nummer abgeglichen werden.
Ich habe das Formular Feld "Paketnummer" in "EAN" umgenannt und entsprechen in der php-Abfrage den Vergleich der Paketnummer zur EAN geändert.
Leider nimmt er mir das nicht, er zeigt kein Fehler beim Ausbuchen und es geschieht in der Datenbank nichts wenn ich auf Ausbuchen gehe.
Hier der aktuelle php-code mit dem neuen Stellplatz Feld, das auch nicht funktioniert.
Wo habe ich noch ein Fehler drin?
Ich habe das Formular Feld "Paketnummer" in "EAN" umgenannt und entsprechen in der php-Abfrage den Vergleich der Paketnummer zur EAN geändert.
Leider nimmt er mir das nicht, er zeigt kein Fehler beim Ausbuchen und es geschieht in der Datenbank nichts wenn ich auf Ausbuchen gehe.
Hier der aktuelle php-code mit dem neuen Stellplatz Feld, das auch nicht funktioniert.
Wo habe ich noch ein Fehler drin?
PHP:
<?php
if($_POST["action"]=="ausbuchen"){
include("server_data.php");
$mitarbeiter = trim($_POST["mitarbeiter"]);
$ean = trim($_POST["ean"]);
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = $ean AND ausgebucht = 0";
$result = mysql_query($sql_pruefen);
$anzahl = mysql_fetch_array($result);
echo $anzahl['anzahl_ausgebucht'];
if ($anzahl['anzahl_ausgebucht'] == 1){
$sql_einfuegen = "INSERT INTO ausbuchung(mitarbeiter, ean) VALUES('$mitarbeiter','$ean')";
mysql_query($sql_einfuegen) or die(mysql_error());
$sql_update = "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE ean = $ean";
mysql_query($sql_update) or die(mysql_error());
$var2 = 'Ausgebucht!';
echo "var2=".$var2;
}
else{
$var2 = 'Fehler';
echo "var2=".$var2;
}
}
if($_POST["action"]=="stellplatz"){
$stellplatz= trim($_POST["stellplatz"]);
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE stellplatz = $stellplatz AND ausgebucht = 0";
$result = mysql_query($sql_pruefen);
$anzahl = mysql_fetch_array($result);
echo $anzahl['anzahl_ausgebucht'];
if ($anzahl['anzahl_ausgebucht'] == 1){
$sql_einfuegen = "INSERT INTO ausbuchung(mitarbeiter, ean) SELECT '$mitarbeiter',paketnummer FROM einbuchung WHERE stellplatz=$stellplatz";
mysql_query($sql_einfuegen) or die(mysql_error());
$sql_update = "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE stellplatz = $stellplatz";
mysql_query($sql_update) or die(mysql_error());
$var2 = 'Ausgebucht!';
echo "var2=".$var2;
}
else{
$var2 = 'Fehler';
echo "var2=".$var2;
}
}
@Darlis:
Dann kommt der Fehler:
1You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%000606301799889397094101040' at line 1
Edit:
Ok es scheint am VARCHAR zu liegen. Ich habe in der DB ean auf INT umgestellt und es hat funktioniert.
Was muss ich ändern damit er VARCHAR nimmt?
PHP:
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = '$ean' AND ausgebucht = 0";
1You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%000606301799889397094101040' at line 1
Edit:
Ok es scheint am VARCHAR zu liegen. Ich habe in der DB ean auf INT umgestellt und es hat funktioniert.
Was muss ich ändern damit er VARCHAR nimmt?
Zuletzt bearbeitet:
Also INT dürfte nicht funktionieren, deine ean ist selbst für BIGINT zu groß.
Soll das '%' am Anfang heißen, dass du alle EAN-Nummern willst die mit '000606301799889397094101040' aufhören? Dann musst du mit LIKE arbeiten. Ich werfe hier auch nochmal das Stichwort SQL-Injection in den Raum.
Zur Fehlermeldung: Versuch' mal die Hochkomma zu escapen: WHERE ean = \'$ean\'
oder ganz ohne aber mit LIKE : WHERE ean LIKE $ean
Und zu guter Letzt füge noch diese Zeile hinter Zeile 10 ein: var_dump($result, $anzahl);
Soll das '%' am Anfang heißen, dass du alle EAN-Nummern willst die mit '000606301799889397094101040' aufhören? Dann musst du mit LIKE arbeiten. Ich werfe hier auch nochmal das Stichwort SQL-Injection in den Raum.
Zur Fehlermeldung: Versuch' mal die Hochkomma zu escapen: WHERE ean = \'$ean\'
oder ganz ohne aber mit LIKE : WHERE ean LIKE $ean
Und zu guter Letzt füge noch diese Zeile hinter Zeile 10 ein: var_dump($result, $anzahl);
Ja der EAN code hat immer ein % vor der langen Nummer.
Also als INT hat es auch nur funktioniert, weil er aus der langen Nummer nur eine 0 in die Datenbank geschrieben hat. Diese konnte er dann aber im Ausbuchen Feld vergleichen und ausbuchen.
Also das LIKE führt zum selben fehler.
var_dump($result, $anzahl); ergibt; bool(false) NULL var2=Fehler
@Hancock:
TEXT nimmt er leider nicht wenn ich es versuche zu ändern in der DB:
#1170 - BLOB/TEXT column 'source' used in key specification
Ich habe herausgefunden das MySQL ein Problem mit dem % Zeichen im EAN hat.Wenn ich ein EAN code ohne % Zeichen einbuche und ausbuche funktioniert es. Eine Lösung habe ich bisher noch nicht..
Auch möchte ich das Feld "Mitarbeiter" als Pflichtfeld einstellen. Wie mache ich das am besten?
Also als INT hat es auch nur funktioniert, weil er aus der langen Nummer nur eine 0 in die Datenbank geschrieben hat. Diese konnte er dann aber im Ausbuchen Feld vergleichen und ausbuchen.
Also das LIKE führt zum selben fehler.
var_dump($result, $anzahl); ergibt; bool(false) NULL var2=Fehler
@Hancock:
TEXT nimmt er leider nicht wenn ich es versuche zu ändern in der DB:
#1170 - BLOB/TEXT column 'source' used in key specification
Ergänzung ()
Ich habe herausgefunden das MySQL ein Problem mit dem % Zeichen im EAN hat.Wenn ich ein EAN code ohne % Zeichen einbuche und ausbuche funktioniert es. Eine Lösung habe ich bisher noch nicht..
Auch möchte ich das Feld "Mitarbeiter" als Pflichtfeld einstellen. Wie mache ich das am besten?
Zuletzt bearbeitet:
Dann musst du das % escapen, also WHERE ean = '\%000606301799889397094101040': http://dev.mysql.com/doc/refman/5.0/en/string-literals.html
Mein MySql hat damit komischerweise kein Problem.
Zum Pflichtfeld: Mitarbeiter als not null in der DB setzen und in PHP mal die Eingaben prüfen und nicht blind an den SQL-Server schicken. Z.B. solltest du prüfen, ob es den Mitarbeiter überhaupt gibt. Dein jetziger Code würde auch einen leeren String als Mitarbeiter akzeptieren.
Mein MySql hat damit komischerweise kein Problem.
Zum Pflichtfeld: Mitarbeiter als not null in der DB setzen und in PHP mal die Eingaben prüfen und nicht blind an den SQL-Server schicken. Z.B. solltest du prüfen, ob es den Mitarbeiter überhaupt gibt. Dein jetziger Code würde auch einen leeren String als Mitarbeiter akzeptieren.
Es gibt keine Funktion, die dir das % escaped, dafür aber str_replace. Wenn das Zeichen definitiv immer an Anfang deiner EAN steht, könntest du es dir noch einfacher machen mit einer Stringkonkatenation.
Zum Thema escapen könntest du dir auch mal mysql-real-escape-string ansehen. SQL-Injection und so, wissen schon.
Zum Thema escapen könntest du dir auch mal mysql-real-escape-string ansehen. SQL-Injection und so, wissen schon.
Ähnliche Themen
- Antworten
- 3
- Aufrufe
- 943
- Antworten
- 11
- Aufrufe
- 2.825
- Antworten
- 2
- Aufrufe
- 758
- Antworten
- 6
- Aufrufe
- 1.196