helmuthelmut2000
Goto Top

Mit einem PHP-Formular die Daten einer MSSQL DB ändern

Hallo,

Folgendes stört mich an meinen PHP Seiten.
Ich habe da ein Formular wo ich die Daten von einer MSSQL DB auslese.
Dann gehe ich mit der Maus auf eine Zeile und mit einem link werden die Daten von dieser
Zeile auf einer ander Seite angezeigt. So:

href='../details.php?auswahl=" . $dsatz["Schluessel"] . "'

Auf der Seite details.php hat man dann die Möglichkeit auf einem Knopf die Daten
auf eine andere Seite zu schicken und dann verändern. So:

onclick=self.location.href='auftrag_aendern.php?auswahl=" . $_GET['auswahl']."'

Bis dahin ist das ja gut so. Aber wenn ich jetzt die Daten verändert habe und dann auf OK klicke geht das wieder auf eine Seite
wo dann das update auf die DB gemacht wird. So:

method='post' action='auftrag_aendern1.php'

$sql = "UPDATE Ergebnisse SET.......

Kann man das nicht irgendwie so machen das das gleich auf der Seite wo die Daten verändert werden, beim OK klicken
auch gleich in die DB geschrieben wird?
Oder habt ihr einen guten Link im Netz wo man das gut nachlesen kann?

Danke.

Gruß
Helmut

Content-Key: 167449

Url: https://administrator.de/contentid/167449

Printed on: April 19, 2024 at 05:04 o'clock

Member: Xaero1982
Xaero1982 Jun 04, 2011 at 09:29:30 (UTC)
Goto Top
Hi,

klar du kannst überprüfen, ob der ok butten gedrückt wurde ... mit if isset usw ...

Wenn er nicht gedrückt wurde kein update
Wenn er gedrückt wurde macht er das update ...

method='post' action='auftrag_aendern1.php'  
muss dann auf sich selbst zeigen ... mit PHP_SELF

VG
Member: EvilMoe
EvilMoe Jun 04, 2011 at 11:10:09 (UTC)
Goto Top
Ja das geht.

Du hast dort ja dein Formular. Dort musste dann beim action einfach leer lassen, das reicht. PHP_SELF geht auch, aber nichts zu schrieben geht schneller ;)

Dann musst du dein Code auf der Seite ergänzen wo du deine Daten ausgibst.
In etwa so:

// Dassteht ganz oben auf deiner Seite
if(isset($_POST)) {
   // Alles was hier steht wird nur ausgeführt wenn du ein Formular absendest

   // Nicht vergessen hier noch die übergebenen Werte auf richtigkeit zu überprüfen
   // z.b. is_numeric etc wenn es numerische Werte sind wie z.B. die ID, hängt von deinem Formular ab.
  $ID = (!empty($_POST['ID']) && is_numeric($_POST['ID'])) ? (int)$_POST['ID'] : 0;  

   // Wenn du die Werte überprüft hast kannste deinen SQL Befehl ausführen für das Update.
   $sql = "UPDATE Ergebnisse SET....... WHERE id=".$ID.";  

}


// Hier Kommt dann dein ursprünglicher Code wo die Daten ausgegeben wird
// deine Formulare etc.
Member: helmuthelmut2000
helmuthelmut2000 Jun 04, 2011 at 17:23:09 (UTC)
Goto Top
Hallo,

Also ich da jetzt das Formular wo man die änderungen macht und die sieht so aus.

if (isset($_GET['auswahl']))

$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
$select=mssql_select_db(MSSQL_DATABASE);


$sql = "SELECT * from Ergebnisse WHERE Schluessel = '" . $_GET['auswahl']."'";

$res = mssql_query($sql);
$dsatz = mssql_fetch_assoc($res);

echo "<form class='yform columnar' id='addjob' name='addjob' method='post' action='auftrag_aendern1.php'>";

echo "<div class='type-text'>";
echo "<label for='abt'>Abt.</label>";
echo "<label for='abt' name='abt' id='abt' size='3' maxlength='1'>" . $dsatz['Auftrag'] . "</label>";
echo "</div>";

echo "<div class='type-text'>";
echo "<label for='kunde'>Kunde</label>";
echo "<input value='" . $dsatz['Kunde'] . "' type='text' name='kunde' id='kunde' size='5' maxlength='3' />";
echo "</div>";

usw.

Dann gehts mit OK zur Seite 'auftrag_aendern1.php' und steht:

$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
$select=mssql_select_db(MSSQL_DATABASE);

$sql = "UPDATE Ergebnisse SET
Auftrag='".$_POST['Auftrag']."', Kunde='".$_POST['Kunde']."', WHERE Schluessel = '".$_POST['Schluessel']."'";

Und mit OK fertig.
Die Seite 'auftrag_aendern1.php' möchte ich weg lassen.

Wo muss ich denn dann :
$sql = "UPDATE Ergebnisse SET....... WHERE id=".$ID."; einfügen und was mach ich mit if(isset($_POST)) ?

Danke
Member: EvilMoe
EvilMoe Jun 04, 2011 at 17:27:28 (UTC)
Goto Top
Das was ich dir geschrieben habe muss vor deinem
if (isset($_GET['auswahl']))  

Du musst dich dringend mit den Themen XSS und SQl Injection auseinander setzen. Dein Code ist alles andere als sicher.
Member: helmuthelmut2000
helmuthelmut2000 Jun 04, 2011 at 17:31:55 (UTC)
Goto Top
Hallo,

Ja ich hab da schon noch:

ini_set("diplay_errors",1);
error_reporting(E_ALL);

stehen und noch was. Ich hab gedacht ich kürze das ab.
Member: helmuthelmut2000
helmuthelmut2000 Jun 04, 2011 at 20:34:43 (UTC)
Goto Top
Hallo,

Wenn ich das so einfüge dann bekomme ich die Fehlermeldung:

Notice: Undefined index: Auftrag in C:\....\auftrag_aendern.php on line 291
Notice: Undefined index: Kuftrag in C:\....\auftrag_aendern.php on line 291
usw.

Muß ich bei:

if(isset($_POST)) {

nicht
if(isset($_POST['auswahl'])) {
schreiben.
Und was macht man bei:
action='auftrag_aendern1.php' ?

Danke.

Gruß
Helmut
Member: EvilMoe
EvilMoe Jun 04, 2011 at 20:44:20 (UTC)
Goto Top
Wie wir schon sagten musst du bei "form" den action einfach leer lassen also so action="". Das genügt.
Dadurch landest du auf der gleichen Seite wieder wo du das Formular abgesendet hast.

Die Fehlermeldung sagt das das du nicht sauber programmiert hast und nicht die Eingaben vorher geprüft hast.

nicht
if(isset($_POST['auswahl'])) {
schreiben.
Kann man auch, finde ich aber doppelt gemoppelt.
Du musst natürlich die Eingabe prüfen. Da ich aber nicht weiß was in $_POST['auswahl'] stehen kann bzw. darf kann ich dir dabei nicht helfen.

Eine richtige Validierung der Eingaben könnte so aussehen wie wir es dir in den Beiträgen vorher schon einmal gezeigt haben. Die Systematik bleibt gleich.

Ich mache das immer so wie ich es oben beschrieben habe.
 
ini_set("diplay_errors",1);  
error_reporting(E_ALL);


if(isset($_POST)) {
   // Alles was hier steht wird nur ausgeführt wenn du ein Formular absendest

   // Nicht vergessen hier noch die übergebenen Werte auf richtigkeit zu überprüfen
   // z.b. is_numeric etc wenn es numerische Werte sind wie z.B. die ID, hängt von deinem Formular ab.
  $ID = (!empty($_POST['ID']) && is_numeric($_POST['ID'])) ? (int)$_POST['ID'] : 0;   
  $auswahl = (isset($_POST['auswahl'])) ? $_POST['auswahl'] : 0;  



   // Wenn du die Werte überprüft hast kannste deinen SQL Befehl ausführen für das Update.
   $sql = "UPDATE Ergebnisse SET....... WHERE id=".$ID.";  

}

// Hier Kommt dann dein ursprünglicher Code wo die Daten ausgegeben wird
// deine Formulare etc.
Member: helmuthelmut2000
helmuthelmut2000 Jun 09, 2011 at 08:16:28 (UTC)
Goto Top
Hallo,

Hat jetzt leider etwas gedauert, aber jetzt möchte ich das hinbekomen.
Kannst Du mir da noch mal Helfen?

Ich glaube bei mir ist das Problem das ich die { Klammern nicht Richtig habe.
Wo muß ich denn bei meiem jetzigen Formular die Klammern Richtig setzten damit das dann mit
dem von Dir Passt?

if (isset($_GET['auswahl']))

$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
$select=mssql_select_db(MSSQL_DATABASE);


$sql = "SELECT * from Ergebnisse WHERE Schluessel = '" . $_GET['auswahl']."'";

$res = mssql_query($sql);
$dsatz = mssql_fetch_assoc($res);

echo "<form class='yform columnar' id='addjob' name='addjob' method='post' action='auftrag_aendern1.php'>";

echo "<div class='type-text'>";
echo "<label for='abt'>Abt.</label>";
echo "<label for='abt' name='abt' id='abt' size='3' maxlength='1'>" . $dsatz['Auftrag'] . "</label>";
echo "</div>";

echo "<div class='type-text'>";
echo "<label for='kunde'>Kunde</label>";
echo "<input value='" . $dsatz['Kunde'] . "' type='text' name='kunde' id='kunde' size='5' maxlength='3' />";
echo "</div>";


Danke.
Member: helmuthelmut2000
helmuthelmut2000 Jun 09, 2011 at 10:38:14 (UTC)
Goto Top
Hallo,

Also das geht jetzt bei mir aber ich bekomme immer noch die Fehlermeldungen:

Notice: Undefined index: Auftrag in C:\....\auftrag_aendern.php on line 291
Notice: Undefined index: Kuftrag in C:\....\auftrag_aendern.php on line 291
usw.

Weis noch jemand woran das liegen könnte?
Member: EvilMoe
EvilMoe Jun 09, 2011 at 11:20:29 (UTC)
Goto Top
Zitat von @helmuthelmut2000:
Hallo,

Also das geht jetzt bei mir aber ich bekomme immer noch die Fehlermeldungen:

Notice: Undefined index: Auftrag in C:\....\auftrag_aendern.php on line 291
Notice: Undefined index: Kuftrag in C:\....\auftrag_aendern.php on line 291
usw.

Weis noch jemand woran das liegen könnte?


Ja, du tust die Eingaben nicht validieren!
Dein Script ist unsauber programmiert und auch noch extrem unsicher.

Ich dachte du willst das nicht mehr über \auftrag_aendern.php machen? Warum wird die dann noch aufgerufen?
Member: helmuthelmut2000
helmuthelmut2000 Jun 09, 2011 at 12:14:34 (UTC)
Goto Top
Hallo,

Ja im \auftrag_aendern.php mach ich doch auch die Eingaben.
Dann brauch ich doch das Formular.
Ich möchte auf das \auftrag_aendern1.php Formular verzichten.

Was ist das die Eingaben validieren?
Wie macht man das?
Member: EvilMoe
EvilMoe Jun 09, 2011 at 12:18:22 (UTC)
Goto Top
Zeig am besten mal die gesamten Code damit ich weiß wie es nun aussieht.

Validieren heißt das du ALLE Eingaben die nicht von deinem Server stammen also Benutzereingaben wie Formulare müssen vorher überprüft werden.
Z.B. so
$ID = (!empty($_POST['ID']) && is_numeric($_POST['ID'])) ? (int)$_POST['ID'] : 0;    
$auswahl = (isset($_POST['auswahl'])) ? $_POST['auswahl'] : 0;   

Dann lies dir auch mal das durch, ist sehr wichtig: http://www.inside-php.de/tutorial/PHP-Sicherheit-13/SQL-Injections-verm ...
Member: helmuthelmut2000
helmuthelmut2000 Jun 09, 2011 at 12:27:48 (UTC)
Goto Top
Hallo,

Hier hab ich mal die Seite:

<?php
alle Fehler im Browser anzeigen
ini_set("diplay_errors",1);
error_reporting(E_ALL);

if(isset($_POST))
if (isset($_GET['auswahl'])){
$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
$select=mssql_select_db(MSSQL_DATABASE);

$sql = "SELECT * from Ergebnisse WHERE Schluessel = '" . $_GET['auswahl']."'";

$res = mssql_query($sql);
$dsatz = mssql_fetch_assoc($res);
}
{
$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
$select=mssql_select_db(MSSQL_DATABASE);

$sql = "UPDATE Ergebnisse SET
Kunde='".$_POST['kunde']."', Bezeichnung='".$_POST['bezeichnung']."', Stueck='".$_POST['stueck']."', Eilt='".$_POST['eilt']."' WHERE Schluessel = '".$_POST['Schluessel']."'";
mssql_query($sql);
}

Das Formular muss die Klassen "yform columnar" erhalten
// Die Attribute name und id der einzelnen Formularelemente können zwar auch anders benannt werden, jedoch muss die Bennenung das jeweils gleich sein!

echo "<form class='yform columnar' id='addjob' name='addjob' method='post' action=''>";

echo "<div class='type-text'>";
echo "<label for='kunde'>Kunde</label>";
echo "<input value='" . $dsatz['Kunde'] . "' type='text' name='kunde' id='kunde' size='5' maxlength='3' />";
echo "</div>";

echo "<div class='type-text'>";
echo "<label for='bezeichnung'>Bezeichnung</label>";
echo "<input value='" . $dsatz['Bezeichnung'] . "' type='text' name='bezeichnung' id='bezeichnung' size='20' maxlength='18' />";
echo "</div>";

echo "<div class='type-text'>";
echo "<label for='stueck'>Stück</label>";
echo "<input value='" . $dsatz['Stueck'] . "' type='text' name='stueck' id='stueck' size='20' maxlength='6' />";
echo "</div>";

echo "<div class='type-check'>";
echo "<label>Eilt</label>";
$note = $dsatz['Eilt'];
{
if($note == 'Normal') {
echo "<input type='radio' name='eilt' value='Normal' id='eilt_normal' checked='checked' /><span class='abstand'>Normal</span>";
} else {
echo "<input type='radio' name='eilt' value='Normal' id='eilt_normal' /><span class='abstand'>Normal</span>";
}
}
$note = $dsatz['Eilt'];
{
if($note == 'Eilt') {
echo "<input type='radio' name='eilt' value='Eilt' id='eilt_eilt' checked='checked' /><span class='abstand'>Eilt</span>";
} else {
echo "<input type='radio' name='eilt' value='Eilt' id='eilt_eilt' /><span class='abstand'>Eilt</span>";
}
}
echo "<input type='radio' name='eilt' value='' id='eilt_frei1' /><span class='abstand'>Frei</span>";
echo "<input type='radio' name='eilt' value='' id='eilt_frei2' /><span class='abstand'>Frei</span>";
echo "</div>";
echo "<input type='hidden' name='Schluessel' value='" . $dsatz["Schluessel"] . "'>";
echo "<p align='center'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value=' OK ' id='submit' onClick='return EingabenUeberpruefen();'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=reset value=&nbsp;Abbruch&nbsp; onclick=self.location.href='index.php'></a></p>";
echo "</form>";
echo "<p>&nbsp;</p>";

mssql_close()
?>
Member: EvilMoe
EvilMoe Jun 09, 2011 at 12:39:16 (UTC)
Goto Top
Zuerst einmal verwende bitte die entsprechenden < code> Tags, dadurch bleibt es leserlich.

Ich habe es kurz für dich sortiert, du MUSST da jetzt noch folgendes ändern, dass musst du selber lernen sonst bringt es dir nichts.


ini_set("diplay_errors",1);  
error_reporting(E_ALL);

if(isset($_POST)) 
		// Daten Updaten
		$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
		$select=mssql_select_db(MSSQL_DATABASE);
		// Alle Parameter musst du vorher prüfen,
                // So kannst du es auf jeden fall nicht stehen lassen
		$sql = "UPDATE Ergebnisse SET Kunde='".$_POST['kunde']."', Bezeichnung='".$_POST['bezeichnung']."', Stueck='".$_POST['stueck']."', Eilt='".$_POST['eilt']."' WHERE Schluessel = '".$_POST['Schluessel']."'";  
		mssql_query($sql);
               // keien prüfung ob der SQL Befehl erfolgreich war?
}

if (isset($_GET['auswahl'])){  
		// Daten auswählen
	
		$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS);
		$select=mssql_select_db(MSSQL_DATABASE);
		
               //  $_GET['auswahl'] MUSST du vorher validieren! 
               // was ist wenn auf einmal in $_GET 'DROP xxx' drin steht? man kann durch diesen Fehler ganze Datenbanken von dir löschen! 
		$sql = "SELECT * from Ergebnisse WHERE Schluessel = '" . $_GET['auswahl']."' LIMIT 1;";  
		
		$res = mssql_query($sql);
		$dsatz = mssql_fetch_assoc($res);

                // Auch hier müsstest du erstmal prüfen ob der SQL Befehl  überhaupt Datensätze zurück leifert

		
		echo "<form class='yform columnar' id='addjob' name='addjob' method='post' action=''>";  
		
		echo "<div class='type-text'>";  
		echo "<label for='kunde'>Kunde</label>";  
		echo "<input value='" . $dsatz['Kunde'] . "' type='text' name='kunde' id='kunde' size='5' maxlength='3' />";  
		echo "</div>";  
		
		echo "<div class='type-text'>";  
		echo "<label for='bezeichnung'>Bezeichnung</label>";  
		echo "<input value='" . $dsatz['Bezeichnung'] . "' type='text' name='bezeichnung' id='bezeichnung' size='20' maxlength='18' />";  
		echo "</div>";  
		
		echo "<div class='type-text'>";  
		echo "<label for='stueck'>Stück</label>";  
		echo "<input value='" . $dsatz['Stueck'] . "' type='text' name='stueck' id='stueck' size='20' maxlength='6' />";  
		echo "</div>";  
		
		echo "<div class='type-check'>";  
		echo "<label>Eilt</label>";  
		$note = $dsatz['Eilt'];   
		{
		if($note == 'Normal') {  
		echo "<input type='radio' name='eilt' value='Normal' id='eilt_normal' checked='checked' /><span class='abstand'>Normal</span>";   
		} else {
		echo "<input type='radio' name='eilt' value='Normal' id='eilt_normal' /><span class='abstand'>Normal</span>";   
		}
		}
		$note = $dsatz['Eilt'];   
		{
		if($note == 'Eilt') {  
		echo "<input type='radio' name='eilt' value='Eilt' id='eilt_eilt' checked='checked' /><span class='abstand'>Eilt</span>";   
		} else {
		echo "<input type='radio' name='eilt' value='Eilt' id='eilt_eilt' /><span class='abstand'>Eilt</span>";   
		}
		}
		echo "<input type='radio' name='eilt' value='' id='eilt_frei1' /><span class='abstand'>Frei</span>";  
		echo "<input type='radio' name='eilt' value='' id='eilt_frei2' /><span class='abstand'>Frei</span>";  
		echo "</div>";	  
		echo "<input type='hidden' name='Schluessel' value='" . $dsatz["Schluessel"] . "'>";   
		echo "<p align='center'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value=' OK ' id='submit' onClick='return EingabenUeberpruefen();'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=reset value=&nbsp;Abbruch&nbsp; onclick=self.location.href='index.php'></a></p>";  
		echo "</form>";  
		echo "<p>&nbsp;</p>";  


}

mssql_close()
Member: helmuthelmut2000
helmuthelmut2000 Jun 12, 2011 at 21:27:34 (UTC)
Goto Top
Hallo,

Das mit den Daten Prüfen mach ich so:

function EingabenUeberpruefen()
{
if(document.addjob.kunde.value.length <= 2 )
{
alert("Bitte geben Sie eine Kundennummer mit 3 Zahlen ein!");
document.addjob.kunde.focus();
return false;
}
usw.

Geht das nicht so?
Member: EvilMoe
EvilMoe Jun 12, 2011 at 21:33:27 (UTC)
Goto Top
Geht schon, allerdings ist das nicht sicher.

-Javascript kann deaktiviert werden -> gar keine Prüfung
-Dein PHP Script kann aufgerufen werden ohne dein eigenes Formular zu verwenden -> JS wird ebefalls nciht aufgerufen.

Du MUSST alle Eingaben auf deinem Server also im PHP prüfen, nur das ist sicher. Davon abgesehen prüfst du dort nur auf die Länge. Eine Kundennummer wird wohl noch mehr erkennungsmuster haben als deren Länge (z.B. muss aus zahlen bestehen, fehlt bei dir).
Member: helmuthelmut2000
helmuthelmut2000 Jun 17, 2011 at 20:19:31 (UTC)
Goto Top
Hallo,

ich komm da leider nicht weiter.
Kannst du mir da weiterhelfen wie man das Richtig
macht?