[PHP + MySQL] Problem mit Action PHP_SELF

Energy_Master

Lt. Commander
Registriert
Feb. 2003
Beiträge
2.029
Ich hab für ne Website ein kleines Script geproggt, welches es ermöglicht, dass die daten aus einem Formular bei klicken auf den "SENDEN" Button in eine Datenbank eingetragen werden. das ganze läuft über die Aktion "PHP_SELF".Mein Problem ist nun, dass selbst wenn ich nur die Seite aufrufe und dann wieder schließe ein Eintrag in die Datenbank gemacht wird. Woran liegt das? Es soll nur was eingetragen werden, wenn der Button betätigt wird.

Ich hoffe ihr könnt da helfen.
 
du solltest natürlich auch den code posten, ansonsten kann man dir da nur schlecht helfen.

vermutlich liegt es aber einfach dadran das das script natürlich bei jedem aufruf der seite auch ausgeführt wird. du musst also erstmal im script überprüfen ob jemand gerade das formular ausgefüllt hat oder ob er gerade erst das formular haben will um es dann auszufüllen.
 
OK, werd ich dann mal testen. Konnte ja sein, dass man bei der Action grundsätzlich irgendwas beachten muss.

Edit:
So jetzt der Quellcode. Hab gerade noch mal schnell versucht ein Check rein zu basteln, um zu prüfen, ob die Felder leer sind, der funktioniert auch nicht, genauso wenig wie das eintragen des Datums.
Ich habe außerdem gemerkt, dass schon an die Datenbank gesendet wird, wenn die Seite aufgerufen wird, da is ja klar, dass da noch nichts drin steht.

PHP:
<html>
<head>
<title>ADMIN Bereich</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
body {
background-color: #cccccc;
}
table {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: xx-small; font-weight: bold; color: #000000; text-decoration: none}
a:active {  color: #000000; text-decoration: underline}
a:hover {  color: #666666; text-decoration: underline}
a:link {  color: #000000; text-decoration: underline}
a:visited {  color: #000000; text-decoration: underline}
-->
</style></head>
<SCRIPT LANGUAGE="JavaScript">
<!--
function validate_form() {
  validity = true; // assume valid
  if (!check_empty(document.form.VERFASSER.value))
        { validity = false; alert('Verfasser wurde nicht angegeben!'); }
  if (!check_empty(document.form.TITEL.value))
        { validity = false; alert('Es wurde kein Titel eingegeben!'); }
  if (!check_empty(document.form.NEWS.value))
        { validity = false; alert('Es wurden keine News eingetragen"'); }
  return validity;
}

function check_empty(text) {
  return (text.length > 0); // gibt false zurück wenn leer
}


// -->
</script>
<body>
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><?PHP
$include = 1;
$needed_rang = 2;
include("protection.php");

$host = "localhost";
$log = "root";
$pass = "";
$db = "db74849";

$link = mysql_connect($host, $log, $pass);
mysql_select_db($db, $link);
mysql_query("INSERT news SET Verfasser = '$verfasser', Titel = '$titel', Datum = '$datum', News = '$news'");
$datum = date("d.m.Y");
?>
<p>News schreiben</p>
<form name="news" method="post" action="<?=$PHP_SELF?>">
  <table width="100%"  valign="top" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
    <tr>
      <td width="24%">Verfasser:</td>
      <td width="76%"><input type="text" name="VERFASSER" value="<?=$verfasser?>"></td>
    </tr>
    <tr>
      <td>Titel:</td>
      <td><input type="text" name="TITEL" value="<?=$titel?>"></td>
    </tr>
    <tr>
      <td>News:</td>
      <td><textarea name="NEWS" rows=8 cols=50 wrap=virtual value="<?=$news?>"></textarea></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input type="submit" name="Submit" value="Senden"></td>
    </tr>
  </table>
</form>
<p>&nbsp;</p>
</p></td>
  </tr>
</table>
</body>
</html>
 
Zuletzt bearbeitet:
Energy_Master schrieb:
Hab oben den Quelltext eingefügt!

ich glaube da fehlt sein sehr grundlegendes verständniss. so wie ich das sehe (hab gerade wenig zeit, daher kriegst du auch keinen code von mir :P) überprüfst du nun mit javascript beim client.

php wird aber auf dem server ausgeführt, und zwar immer BEVOR die seite zum client geschickt wird. was passiert da also: der benutzer surft auf diese seite, dazu sacht der browser dem webserver welche er haben will. dieser jagt das ding bei entsprechender endung durch den php interpreter welcher dann dein script ausführt - und das ohne das der benutzer das formular ausgefühlt hat, er hat die seite ja noch nichtmla zugesicht bekommen. d.h. hier schreibt dein php script die leeren daten in die db. wenn der php interpreter fertig ist liefert der webserver die seite aus und Jetzt kann der benutzer sie erst sehen. er kann also auch erst jetzt das formular ausfüllen. sobald er das formular abgeschickt hat wird der browser die selbe seite nochmal anfordern (fals da als action wirklich phpself drin steht - habs ja nur überflogen.). das ganze geht also von vorne los - nur hat das script diesmal die daten. es schreibt also alles so in die datenbank wie es soll und der server liefert die seite erneut aus.

du müsstest also im php script überprüfen ob alles korrekt ausgefühlt ist, oder besser noch ob der benutzer die seite überhaubt schon gesehen hat - das kannst du bei einfacheren formularen(sprich nur eine seite) mit einem hidden feld im formular machen, oder bei komplexeren seiten mit einer session. aufjedenfall musst du überprüfen ob den überhaubt was angekommen is von dem formular.
 
Ich hab das Prob jetzt ein bissl in den Griff bekommen, denn ich lass die daten von nem extra script/seite in die Datenbank eintragen, nicht über PHP_SELF, sonder über "eintragen.php". Da klappt alles wunderbar. War natürlich dumm von mir da JS nehmen zu wollen um eine PHP-Seite zu checken. Hab das jetzt in meine "eintragen.php" richtig mit php-Code eingearbeitet.

Ein Problem besteht aber noch, und zwar würde ich gerne, dass zu jedem Eintrag das entsprechende datum mit in die DB geschrieben wird.
$datum = date("d.m.Y H:m:s"); speichert mir zwar die Zeit + Datum in die Variable, schreibt sie aber nich in die DB. Oder muss da das Feld in der DB einen besonderen Wert haben? Hat jetzt nur CHAR!
 
am besten ist du benutzt für die zeit mysql timestamps. da kannst du dann einfach den wert beim eintragen leer lassen und mysql trägt automatisch die eintrags-zeit als timestamp ein.
 
Das heißt ich brauch da gar nichts mit der zeit weiter machen? Weiße der zeit einfach nur TIMESTAMP zu? Super, danke für den Tipp.
 
japp. wiegesagt den type auf timestamp stellen und den feld beim einfügen der daten einfach auslassen(eventuel gehts auch wenn du NULL als wert angiebst, auslassen wäre aber besser). den rest macht mysql automatisch.
 
das funktioniert soweit auch wunderbar, nur wie kann ich das dann bissl formatieren, sodass nich alles als eine zeichenkette hintereinander da steht?
 
Hab da auch schon in SelfPHP gesucht aber nichts gefunden, wie ich die Angaben aus TIMESTAMP formatieren kann. Kannste mir da nich mal ein Schema geben
zB
$ datum = ....

Vielen Dank schon mal.
 
Hallo,

am einfachsten formatierst du diesen, wie Siberian..Husky schon gesagt hat, direkt beim Auslesen aus der Datenbank.
Eine einfache und leicht zu verstehende Anleitung findest du zum Beispiel hier, wobei sich diese auf die Formatierung von "Date"-Einträgen beschränkt, dies jedoch bei Timestamp-Einträgen genau das gleiche Prinzip ist.

MfG m1001
 
Zuletzt bearbeitet:
Vielen Dank erstmal. Werd das mal versuchen. Bei weiteren Fragen meld ich mich noch mal.
 
Generell gilt:
timestamp kann gefährlich werden bei Updates. MySQL aktualisiert dann den Timestamp bei jeder Änderung.
Ich würde bei nicht veränderlichen Zeitstempeln eher ein DATETIME Feld verwenden, das ich beim Insert über die Funktion NOW() fülle. Das sieht dann so aus:
Code:
INSERT INTO myTable (1,"hallo", NOW());
Vor allem wenn du editierbare Sachen in der Datenbank speicherst kann ein TIMESTAMP Feld nach hinten losgehen.
 
Zuletzt bearbeitet:
Danke, das mit der zeit geht jetzt auf einmal über die Funktion date() aus php, da lasse ich die Zeit beim verschicken auslesen und dann mit zu db senden. Vielen Dank. Es geht soweit erstmal alles.
 
Zurück
Oben