PHP Lagerverwaltung - Ausbuchen nicht möglich

Wie sieht das im code aus?

PHP:
delete from einbuchung where stellplatz=?

Wo setze ich dies ein und wie kann ich dem stellplatz den aktuell eingegeben Wert überliefern?
 
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.
 
@Darlis: Ja da hab ich das Layout durcheinanderbracht:
Code:
insert into ausgebucht(...) select ... from eingebucht where stellplatz=? and ausgebucht=0;
update eingebucht set ausgebucht=1 where stellplatz=?
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.
 
Also der momentane php code der ausbuchen.php sieht so aus:
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"){
platzieren?

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 ...
angedacht?
 
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?
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;
                        }
					}
 
sry "ean" kleingeschrieben. So habe ich es auch überall drin. Aber warum macht er den Vergleich nicht, es hat sich nichts geändert nur das aus paketnummer nun der ean code verglichen wird.
 
Wenn ean als String in der DB gespeichert ist, solltest du auch immer '$ean' verwenden.
Hast du auch mal geprüft, ob in $_POST["ean"] etwas drin steht?
 
ean ist VARCHAR.

In $_POST["ean"] steht das richtige (eingegebene):
%000606301799889397094101040

Er srpingt direkt in die else{
$var2 = 'Fehler';
echo "var2=".$var2;
}
Zweigung wenn auf den Button geklickt wird.
 
Dann setz' mal $ean im SQL-Query in Hochkomma.
 
@Darlis:
PHP:
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = '$ean' AND ausgebucht = 0";
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?
 
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);
 
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
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.
 
Und wie escape ich dies mit den Variablen? Du hast es in deinem Beispiel mit der Ausgabe escaped.

PHP:
$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = $ean AND ausgebucht = 0";
 
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.
 
Zurück
Oben