PHP Lagerverwaltung - Ausbuchen nicht möglich

unixp

Lt. Junior Grade
Registriert
Feb. 2009
Beiträge
296
Hallo,

ich habe ein Script erstellt, welches über ein Formular einfache Zahlenwerte an eine Datenbank übermittelt.

Nun soll das Script Werte aus dem Online-Formular in die Datenbank schreiben und Werte, die auch im Formular auf einer anderen Seite eingegeben werden wieder löschen.

So sieht der Code aus in der Werte in die Datenbank geschrieben werden:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Vorkommissionierung</title>
<link rel="stylesheet" type="text/css" href="view.css" media="all">
<script type="text/javascript" src="view.js"></script>
</head>
<body id="main_body" >
  
  <img id="top" src="top.png" alt="">
  <div id="form_container">
  
    <h1><a>Einbuchen</a></h1>
    <form action="" class="appnitro" method="post" >
          <div class="form_description">
      <h2 align="center">Einbuchen</h2>
    </div>
      <ul >
          <li id="li_1" >
    <label class="description" for="mitarbeiter">Mitarbeiter </label>
    <div>
      <input id="mitarbeiter" name="mitarbeiter" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li> <li id="li_2" >
    <label class="description" for="ean">EAN </label>
    <div>
      <input id="ean" name="ean" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li> <li id="li_2" >
    <label class="description" for="paketnummer">Paketnummer </label>
    <div>
      <input id="paketnummer" name="paketnummer" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li> <li id="li_3" >
    <label class="description" for="regal">Regal </label>
    <div>
      <input id="regal" name="regal" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li> <li id="li_4" >
    <label class="description" for="stellplatz">Stellplatz </label>
    <div>
      <input id="stellplatz" name="stellplatz" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li> <li id="li_5" >
    <label class="description" for="kw">KW </label>
    <div>
      <input id="kw" name="kw" class="element text large" type="text" maxlength="255" value=""/>
    </div>
    </li>
    <li class="buttons">
          <input type="hidden" name="form_id" value="442941" />
          <input id="saveForm" class="button_text" type="submit" name="einbuchen" value="Einbuchen" />
    </li>
      </ul>
<?php
  if(isset($_POST['einbuchen'])){
  include("server_data.php");
 
  $mitarbeiter = trim($_POST["mitarbeiter"]);
  $ean = trim($_POST["ean"]);
  $paketnummer = trim($_POST["paketnummer"]);
  $regal = trim($_POST["regal"]);
  $stellplatz =  trim($_POST["stellplatz"]);
  $kw = trim($_POST["kw"]);

  $sql_pruefen = "SELECT * FROM einbuchung WHERE paketnummer = $paketnummer";
  $result = mysql_query($sql_pruefen);
 
  if (mysql_num_rows($result) == 0)
    {
      $sql_einfuegen = "INSERT INTO einbuchung(zeitstempel_ein, mitarbeiter, ean, paketnummer, kw, regal, stellplatz) VALUES(now(),'$mitarbeiter','$ean','$paketnummer','$kw','$regal','$stellplatz')";
      mysql_query($sql_einfuegen) or die(mysql_error());
 
      $var1 = 'eingebucht!';
      echo $var1;
    }
    else
    {
      $var1 = 'Buchung schon vorhanden!';
      echo $var1;
    }
}	
?>  
    </form>
  </div>
  <img id="bottom" src="bottom.png" alt="">
  </body>
</html>

Diesen Code habe ich direkt unterhalb des Formular-Codes in der gleichen .php Datei.
Das Problem ist, das beim Aufruf der Seite direkt der php Code ausgeführt wird.

Wie kann ich dies unterbinden damit der Code erst ausgeführt wenn der Submit Button getätigt wird?

Das Ausbuchen funktioniert noch nicht. Wenn ich die zwei Werte in das Formular eingebe, welche sich auch in der Datenbank befinden (Zahlenwerte), löscht er sie nicht aus der Datenbank.
Wenn ich den Submit Button drück, springt er auf die vorherige Seite zurück und führt nichts aus?!

Hier der komplette Code mit Formular der ausbuchen.php:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Vorkommissionierung</title>
<link rel="stylesheet" type="text/css" href="view.css" media="all">
<script type="text/javascript" src="view.js"></script>

</head>
<body id="main_body" >
	
	<img id="top" src="top.png" alt="">
	<div id="form_container">
	
		<h1><a>Ausbuchen</a></h1>
		<form action="" id="form_442941" class="appnitro"  method="post">
					<div class="form_description">
			<h2>Ausbuchen</h2>
		</div>						
			<ul >
		<li id="li_1" >
		<label class="description" for="mitarbeiter">Mitarbeiter </label>
		<div>
			<input id="mitarbeiter" name="mitarbeiter" class="element text large" type="text" maxlength="255" value=""/> 
		</div> 
		</li>
		<li id="li_2" >
		<label class="description" for="ean">EAN </label>
		<div>
			<input id="ean" name="ean" class="element text large" type="text" maxlength="255" value=""/> 
		</div> 
		</li>
					<li class="buttons">
			    <input type="hidden" name="form_id" value="442941" />
			    
				<input id="saveForm" class="button_text" type="submit" name="submit" value="Submit" />
		</li>
			</ul>
			<?php
					include("server_data.php");
	
					$mitarbeiter = trim($_POST["mitarbeiter"]);
					$ean = trim($_POST["ean"]);
					$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, ean, paketnummer)	VALUES('$mitarbeiter','$ean','$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 = 'success';
						echo "var2=".$var2;
						}
					else{
						$var2 = 'failed';
						echo "var2=".$var2;
						}	
?>
		</form>	
	</div>
	<img id="bottom" src="bottom.png" alt="">
	</body>
</html>
 
Mach in deine form ein <input type="hidden" name="action" value="einbuchen"> rein und dann ein if($_POST["action"]=="einbuchen") um dein PHP-Teil (und den besser oben drüber, dann sieht dein Script auch gleich die Änderungen.

Bei der zweiten Datei gilt das Selbe, warum das auf das Orginal zurückleitet, weiß ich nicht, aber wenn dein action leer ist, kommst du auf die URL des Scripts (ohne das hinter dem ? ).
 
Ok habe herausgefunden das es an der ersten Seite liegt, welche auf die ausbuchen.php verweist.

Denn wenn ich die ausbuchen.php direkt aufrufe im Browser funktioniert es einwandfrei. Auch hatte ich anstatt paketnummer - ean im code, was falsch war.

Jetzt habe ich folgende Fragen/Probleme:

Über diese Seite kann man entweder auf Einbuchen oder Ausbuchen gehen:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Vorkommissionierung</title>
<link rel="stylesheet" type="text/css" href="view.css" media="all">
<script type="text/javascript" src="view.js"></script>
		<?php
			if (isset($_POST['einbuchen'])) {
			if ('Einbuchen' === $_POST['einbuchen']) {
			include 'einbuchen.php';
				} elseif ('Ausbuchen' === $_POST['einbuchen']) {
				include 'ausbuchen.php';
			}
		}
		?>		
</head>
<body id="main_body" >
	<img id="logo" src="guenthart_logo.gif" alt="">
	<img id="top" src="top.png" alt="">
	<div id="form_container">
			<h1><a>Vorkommissionierung</a></h1>
					<form id="form_442941" class="appnitro"  method="post" action="" >
					<div class="form_description">
			<h2 align="center">Vorkommissionierung</h2>
						<li class="buttons">
			    <input type="hidden" name="form_id" value="442941" />
			    <br /><br /><br /><br />
				<center><input id="saveForm" class="button_text" type="submit" name="einbuchen" value="Einbuchen" /></center>
				<br /><br >
				<center><input id="saveForm" class="button_text" type="submit" name="einbuchen" value="Ausbuchen" /></center>
		</li>
		</form>	
	</div>
	<img id="bottom" src="bottom.png" alt="">
	</body>
</html>

Wenn ich auf Einbuchen gehe, erscheint das neue Formular direkt im gleichen Fenster und unterhalb ist noch die Startseite, welche dort nicht mehr sein sollte.

Wie kann ich nun erzwingen das die seite einbuchen.php und ausbuchen.php neu geladen wird?
 
Zuletzt bearbeitet:
Ich hoff in der view.js steht nix böses drin.

Was heißt, auf die vorherige Seite, wie wenn man beim Browser auf zurück drückt?
Wie weit der kommt, kannste selber nachlesen mit Rechtsklick->Quellcode anzeigen.

Aber am besten oben
Code:
<? error_reporting(E_ALL);?>
einfügen, dann solltest du bei jedem PHP-Fehler ne Meldung kriegen.

Auch wichtig zu wissen: Deine Daten-Verändernden Methoden sollten ganz oben über dem Text stehen. Da die Seite ja beim Klick auf den Button nochmal komplett aufgerufen wird, werden zuerst die Daten verändert und dann werden die Daten wieder angezeigt, veränderst du die erst nach dem Ausgeben, dann siehst du die Änderung der Daten gar nicht, sondern erst beim nächsten Seitenaufruf, was verwirren kann.
 
Zu deinem Problem mag ich gar nichts sagen, weil ich mir das nicht alles durchgelesen habe.
Weil es so himmelschreiend offensichtlich ist, möchte ich dich aber darauf hinweisen, dass dein Skript jedermann Tor und Tür öffnet für SQL Injections. So könnte man deine Datenbank übernehmen oder löschen.
Du musst die Eingaben auf jeden Fall validieren (=prüfen) und Prepared Statements (mit PDO) würde ich dir auch empfehlen. Wenn nicht das, wenigstens mysql_real_escape_string()/addslashes().

Allgemeine Hinweise:
http://de3.php.net/manual/de/security.php
http://de3.php.net/manual/de/security.database.sql-injection.php

Zum Thema PDO:
http://de3.php.net/manual/de/book.pdo.php
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
 
Zuletzt bearbeitet:
Ich habe es mal hochgelad um es zu demonstrieren - allerdings ohne Datenbankanbindung:

http://web719.webbox443.server-home.org/vorkom/vorkom.php


Wenn man nun auf Einbuchen oder Ausbuchen geht, seht ihr das die Seite unten mitangezeigt wird und die Ausbuchen Funktion garnicht geht.

Wenn man direkt die ausbuchen.php Seite öffnet funktioniert das Ausbuchen.
http://web719.webbox443.server-home.org/vorkom/ausbuchen.php

Was muss ich in der ersten Seite eingeben, damit jeweils Einbuchen und Ausbuchen seperat aufgerufen wird?

@Troublegum:
Danke das werde ich mir noch anschauen.

Die Seite wird nur im lokalen Netz verwendet, von außen besteht absolut kein Zugriff.
Aber ich werde es trotzdem beherzigen.

Edit:
Also wenn ich ein target="_blank" dort einfüge:
<form id="form_442941" class="appnitro" method="post" action="" target="_blank">

macht er die Seite zwar in einem neuen Tab, öffnet aber immer noch die vorkom.php . Ich möchte aber das er die einbuchen.php oder ausbuchen.php lädt
 
Zuletzt bearbeitet:
Setzt mal bei action="einbuchen.php" dann kommste auch da raus.

Jetzt versteh ich auch, was du willst :D.

Also eigentlich sollte der Nutzer auf vorkomm.php auswählen, was er ein/ausbuchen will. Dann wird er auf eine weitere Seite geleitet, wo er dann tatsächlich ein/ausbuchen kann.

OK, also setzt bei der form in vorkomm.php die action="einbuchen.php" und "ausbuchen.php", dann kommste schonmal auf die richtige PHP-Seite.

Dort breibst du dann auch so lange, wie du das action="..." nicht umbiegst auf ne andere Seite.
 
Hat funktioniert!

Jetzt funktioniert das ein- und ausbuchen.

Nun habe ich nur noch folgendes Hindernis:

Ich möchte bei einem eingescannten EAN Code nur die 14- Stellen mitten im EAN-Code an die Datenbank übermitteln.

Wie kann ich das am besten realisieren? ALso wenn der code eingescannt wird, soll er beim Übermitteln nur die 14 Stellen (siehe Bild) buchen.
 

Anhänge

  • image003.jpg
    image003.jpg
    8,5 KB · Aufrufe: 154
ok mit substr hat es geklappt.

Nun möchte ich der Tabelle "paketnummer" die 14-stellige Zahl des EAN Codes übermitteln.

Wie mache ich das? Das Formularfeld paketnummer gibt es nicht mehr, da die 14-stellige Nummer des EAN-Codes dort eingefügt werden soll.

Also müsste das substr('$ean',9,14) in die Variable '$paketnummer' gespeichert werden...
Wie mache ich das?

$sql_einfuegen = "INSERT INTO einbuchung(zeitstempel_ein, mitarbeiter, ean, kw, stellplatz) VALUES(now(),'$mitarbeiter',substr('$ean',9,14),'$paketnummer','$kw',$stellplatz')";
 
PHP:
$paketnummer = substr($ean,9,14)
;)

oder $paketnummer mit substr($ean,9,14) im SQL Query ersetzen.

PHP:
$sql_einfuegen = "INSERT INTO einbuchung(zeitstempel_ein, mitarbeiter, ean, kw, stellplatz) VALUES(now(),'$mitarbeiter',".substr($ean,9,14).",".substr($ean,9,14).",'$kw',$stellplatz ')";

E: Stimmt natürlich Hancock, Darlis Version wird funktionieren und ist auch deutlich angenehmer für den Programmierer, da die Funktion im Query auch sichtbarer ist. Ich persönlich mag es auch nicht unbedingt gerne, wenn Variabelen so im String "versteckt" werden.
 
Zuletzt bearbeitet:
Das Hauptproblem ist, dass die Funktionen innerhalb des Strings nicht interpretiert werden. Egal, wie du $ean schreibst ist es falsch.
Entweder man nutzt eine Hilfsvariable ($paketnummer) oder man trennt den String auf:
PHP:
$sql_einfuegen = "INSERT INTO einbuchung(zeitstempel_ein, mitarbeiter, ean, kw, stellplatz) VALUES(now(),'$mitarbeiter',".substr($ean,9,14).",'".substr($ean,9,14)."','$kw',$stellplatz ')";
 
also so funktioniert es:

PHP:
		$sql_einfuegen = "INSERT INTO einbuchung(zeitstempel_ein, mitarbeiter, ean, paketnummer, kw, regal, stellplatz) VALUES(now(),'$mitarbeiter','$ean',substr('$ean',9,14),'$kw','$regal','$stellplatz')";

Bei dem zurück-Button ist noch das Problem das er "nur" auf die letzte Seite zurückspringt. Also wenn jemand Werte eingegeben und eingebucht hat und dann auf zurück drückt um wieder in das Menü gelangen zu wollen, sieht er die letzte Buchung. Er soll aber auf die Mainseite "vorkom.php" direkt zurück. Wie mache ich das?

PHP:
          <input id="saveForm" class="button_text" type="submit" name="einbuchen" value="Einbuchen" style="width: 160px; height: 60px" />
 <input name="button" type="button" id="back" onclick="javascript:history.back();" value="zurück" />
 
HTML:
<input name="button" type="button" id="back" onclick="window.location.href = 'vorkom.php'" value="zurück" />
 
Momentan ist es noch möglich identische EAN s in die Datenbank zu schreiben.

Falls ein EAN doppel vorkommt, soll eine Fehlermeldung kommen das dieser EAN schon vorhanden ist.

Wie greife ich das in der Datenbank ab, damit eine Meldung generiert wird, wenn ein doppelter EAN Code eingebucht wird?
 
Leg die EAN als Unique Key an. Wenn du jetzt n Insert versuchst kommt von der DB ne Exception, die du nur noch abfangen und handlen musst.

Oder anders: Wieso ist die EAN nicht gleich der Primary Key? Definiert sich nicht jedes Objekt eindeutig über die EAN? Da spart man sich eine zusätzliche ID-Spalte als Primary Key.
 
Ok ich werde es mit dem Unique Key später testen. Wegen der ID muss ich noch schauen. Vielleicht kann ich den EAN Code als ID nehmen.

Ich habe in der einbuchen.php ein Feld "Stellplatz". Unter einem Stellplatz können mehrere Kartons liegen mit unterschiedlicher EAN und Paketnummer.

Nun soll in der ausbuchen.php noch ein zusätzlicher Button "Stellplatz ausbuchen" hinzugefügt werden, wenn die Stellplatz-Nr. eingegben wird und auf "Stellplatz ausbuchen" gedrückt wird, sollen alle Pakete unter diesem Stellplatz ausgebucht werden.

Das kann ich ja mit einer einfachen if-Abfrage machen oder?
 
Zurück
Oben