• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Form in gleicher Seite laden

Tach Leuts,

habe ein Problem mit PHP und komm einfach nicht auf die Lösung.

Ich bestel gerade ein Webfrontend für eine Postgres - Datenbank. Dies ist nicht das Erste was ich zusammenbaue.

Um Daten in die Datenbank einzutragen, muss ich (zumindestens meines Wissens) durch das "Submit" die Daten übertragen. Dazu benötige ich scheinbar aber eine zweite Seite, um die Daten zu übernehmen. Gibt es denn nicht auf eine Möglichkeit, die Daten auf der gleichen Seite zu posten?

Hier mal der Code...vielleicht zum besseren Verständnis

Code:
<?php

$verb = pg_connect([Login - Daten]);
$query = pg_query($verb, select * from tabelle);

while ($data = pg_fetch_object($query))
{
echo "<table><tr>";
echo "<td>$data -> daten</td>";
echo "<td>$data -> daten</td>";
echo "<td>$data -> daten</td>";
echo "</tr></table>";
}

echo "<form method=get action=\"zielseite.php\">";
echo "<input type=text name=\"daten1\">";
echo "<input type=text name=\"daten1\">";
echo "<input type=text name=\"daten1\">";
echo "<input type=submit value=\"eintragen\">";
echo "</form>

?>

Ich will jetzt halt nicht ne zweite Seite bauen, in der ich die geposteten Daten rausziehe und erst dann an die DB übergebe, ich würds gern auf der gleichen Seite machen. Baue ich aber den Insert-Code direkt auf der Seite ein, versucht PHP natürlich bei jedem Aufruf Daten einzutragen, die aber ja beim ersten Aufruf noch nicht da sind, dies führt bei mir unweigerlich zu einer Fehlermeldung.
 

nbkr

Guru
Code:
<?php

//Ob _POST oder _GET hängt von der Methode im <form> Tag ab.
//'send' ist der wert des "name" Attributs des Submitbutton.s
if (isset($_POST['send'])) {
  //Do something
} else {
  //Formular zeigen:
  echo '<form action="' . basename($_SERVER['PHP_SELF'] . '" method="post">...<input type="submit" name="send" value="bla"></form>';
}

?>
 

Bartlin

Member
Code:
echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">[...]</form>
Sollte in den meisten Fällen auch schon reichen...
ansonsten muss die runde Klammer hinter PHP_SELF noch geschlossen werden, also
Code:
basename($_SERVER['PHP_SELF']) <---
 
super...habs nun endlich mal ausprobiert...klappt super!

vielen vielen dank...ihr habt mir viel arbeit erspart!!!



greets
tsj
 
mist...

ich hab gerade bemerkt, dass wenn ich die seite reloade, die daten aus dem post dann nochmals in die db geschrieben werden.

hatte versucht die überprüfung von send einfach mit

$_POST['send'] = '';

wieder auf NULL zu setzen, aber des geht nicht...wie kann ich denn die daten des post wieder freimachen?
 
vielen dank erstmal....


sorry, aber ich bin kein programmierer ich mach das nur mal so nebenbei, sowohl privat als auch beruflich. ich steig das ehrlich gesagt nicht wirklich durch, mir ist das zu hoch.

gibt es denn nicht die möglichkeit alle daten der post-variablen zu löschen?
habs mittlerweile mit ewig vielen klamotten versucht, unter anderem mit unset(), aber nicht hilft mir weiter...hier nochmal mein code

Code:
<html>
	<head>
		<title>Testpage</title>
	</head>
	<body bgcolor=#305080>
<?php
echo $_POST['send'];
if (isset($_POST['send'])) 
	{
		if(md5($_POST[passwd1]) == md5($_POST[passwd2]))
			{
				$verb = pg_connect([Verbindungsdaten]);
				if (!trim($verb))
					die ("Die Verbindung konnte nicht hergestellt werden");

				$query = pg_query($verb, "Query");

				pg_close($verb);
			}
	} 

?>	
	<table border width=800 align=center>
		<tr>
			<th>id</th>
			<th>uname</th>
			<th>passwd</th>
		</tr>

	<?php

	$verb = pg_connect([Verbindungsdaten]);
		
	if (!trim($verb))
		die ("Die Verbindung konnte nicht hergestellt werden");

	$query = pg_query($verb, "Query");
	while ($data = pg_fetch_object($query))
		{
		
		echo "<tr>";
		echo "<td>".$data -> id."</td>";
		echo "<td>".$data -> uname."</td>";
		echo "<td>".$data -> passwd."</td>";
		echo "</tr>";

		}

	pg_close($verb);
	
	?>
	</table>
	<br><br><br>
	<form method=post action="<?php $_SERVER['PHP_SELF'] ?>">
	<table border width=800 align=center>
		<tr>
			<td>Benutzername:</td>
			<td><input type=text size=30 name="uname"></td>
		</tr>
		<tr>
			<td>Passwort:</td>
			<td><input type=password size=30 name="passwd1"></td>
		</tr>
		<tr>
			<td>Passwort wiederholen:</td>
			<td><input type=password size=30 name="passwd2"></td>
		</tr>
		<tr>
			<td colspan=2><input type=submit value="Eintragen" name="send"></td>
		</tr>
	</table>
	</form>
	</body>
</html>
 

nbkr

Guru
Du kannst die Daten nicht löschen. Der Browser hat die gespeichert und sendet die bei einem Reload nochmal. Ein ordentlicher Browser fragt den Nutzer zwar vorher aber darauf kannst Du dich nicht verlassen.
 
und was mache ich jetzt? :(

es handelt sich zwar momentan noch um tests, aber später sind sensible daten abzuspeichern und ich will auch nicht jedesmal ne fehlermeldung haben, weil ich dann natürlich logischerweise in der db ein feld als unique bezeichne...

es muss doch irgendwie noch ne einfachere variante geben..kann ich da vielleicht was mit js machen? wär mir eigentlich egal, hauptsache das funktioniert.
 

nbkr

Guru
JS kann man abschalten. Das macht jeden Test umgänglich und somit kannst Du ihn auch abschalten.

Du hast aus meiner Sicht nur zwei Möglichkeiten.

1) Du steckst Zeit und Mühe in die Einarbeitung in PHP.
Vorteil: Die Lösung ist genauso wie Du es willst.
Nachteil: Zeit und Mühe

2) Du wirbst jemanden an der die Programmierung für Dich macht.
Vorteil: Einfach und bequeme Lösung
Nachteil: Kostet vermutlich Geld

Was Du wählst bleibt Dir überlassen. ;)
 
na dann muss ich mal schaun...leider kann ich im prinzip weder vorschlag 1 noch 2 nehmen.

erstens bin ich gewillt php zu lernen und würde mit nichten jemanden beauftragen mir diesen "spaß" am programmieren wegnimmt :D

und zweitens hab ich momentan keine zeit mich so tief einzuarbeiten, da ich auf meine abschlussprüfung zugehe und somit genug anderes zeig zu lernen habe. mein betrieb muss den ganzen kram allerdings in ca. 3 monaten fertig haben, da niemand außer mir ahnung hat von dem kram und ich anschließend vermutlich weg bin....

na dann muss ich mir mal gedanken machen...ich danke dir auf jeden fall für deine mühe...


greets
tsj
 
Es wird sicher schwierig etwas zu Programmieren, das sicher ist, ohne sich mit der Pogrammiersprache und -technik auseinander zu setzten...

Zu deinem Problem: Am sichersten ist es, wenn du keine Daten ohne eine ausreichende Prüfung in die Datenbank schreibst. EIne ausreichende Prüfung kann in deinem Fall zum Beispiel lauten: 'Existieren die Daten schon?' Falls nein, dann in die Datenbank eintragen, falls ja, dann ne nachricht an den Benutzer.

Das wäre eine Lösung von sicherlich ziemlich vielen.

MfG fello.
 

Bartlin

Member
Ich stimme der Meinung von felloritas zu.

Wenn ich dich jedoch richtig verstanden habe, so willst du die Daten eingeben und anschließend speichern, oder? Was soll dann passieren? Willst du erneut Daten eingeben, oder nicht?

Wenn nicht, dann kannst du folgendes probieren:
Code:
if (isset($_POST['send'])) 
  {
  <mache was>
  }
else
  {
  <zeige Eingabemaske>
  }

Man kann $_POST-Variablen löschen, und zwar ganz einfach über unset(). Das heißt, du könntest auch folgendes probieren:
Code:
if (isset($_POST['send'])) 
  {
  <mache was>
  <wenn Fehler: unset($_POST['send'])>
  }
if(!isset($_POST['send']))
  {
  <zeige Eingabemaske>
  }
 

nbkr

Guru
Das unset verhindert aber nicht das der Browser die Daten nochmal schicken wenn man auf "Reload" klickt.
 

Bartlin

Member
das stimmt allerdings...dann hilft nur, wie oben beschrieben, zu überprüfen, ob der Datensatz schon existiert.

Sorry, hatte ich wohl die Frage falsch verstanden.
 
ich danke euch für eure beiträge, allerdings helfen mir diese nich viel weiter!

es ist nichts neues dabei. das mit der überprüfung, ob die daten schon existieren ist quasi unnötig, da ich in der datenbank entsprechende felder als unique setze. dadurch wird die überprüfung auf den doppelten datensatz also vom dbms übernommen.

das mit der unset() funktion habe ich selbst bereits vorher ausprobiert gehabt und es ist halt wie nbkr schreibt, nech...

hab mal noch ne ganz dumme frage: mit php kann man ja auch oo programmieren. das ist aber nicht so mein ding, habs mit c++ schon gemacht, aber nicht sonderlich geliebt! wenn ich also mit php nicht oo programmiere, wie nennt man die programmierung dann? ist das ereignisorientiert oder wie nennt man das?
 
thesecondjoker schrieb:
...
es ist nichts neues dabei. das mit der überprüfung, ob die daten schon existieren ist quasi unnötig, da ich in der datenbank entsprechende felder als unique setze. dadurch wird die überprüfung auf den doppelten datensatz also vom dbms übernommen.
...

Wo ist denn dann das Problem? Wenn die richtigen Felder unique sind gibts höchstens ne Fehlermeldung der Datenbank. Diese könnte man dann noch abfangen und die Sache ist gegessen.
 
felloritas schrieb:
Wo ist denn dann das Problem? Wenn die richtigen Felder unique sind gibts höchstens ne Fehlermeldung der Datenbank. Diese könnte man dann noch abfangen und die Sache ist gegessen.

das is mir klar, aber genau diese fehler wollte ich verhindern, außerdem, wissen schadet nicht! wenn man weiss, wie man posts au dem browsercache löschen könnte, wäre das doch nicht schlimm, oder? es muss außerdem ja auch nicht immer ne datenbank sein, die hinter der ganzen sache steckt. vielleicht programmiere ich ja auch mal andere sachen, nech....

thx @cero
 
Oben