dedlfix: php datetime currentdate in tabelle eintragen

Beitrag lesen

Hi!

Neben dem logischen Problem, das dir ChrisB schon erzählt hat, läuft auch noch eine Menge anderes schief.

if ($_POST['email'] != "") {

Wenn das Formular nicht abgesendet wurde, dann ist $_POST leer. $_POST['email'] existiert nicht und kann deswegen auch nicht gelesen werden. PHP beklagt sich darüber leise jammernd mit einer Notice-Meldung. Erst mit auf E_ALL gestelltem error_reporting (und display_error=on) bekommt man solche Notice-Meldungen zu Gesicht. Nicht vorhandene Variablen und Array-Elemente liefern beim Lesen den Spezialwert null, der sich bei Vergleichen wie ein Leerstring verhält. Besser wäre, sich zuerst mit isset() der Existenz der Variablen / des Arrayfeldes zu versichern und dann erst zuzugreifen. In dem Fall geht aber auch eine Frage mit empty(), was wie isset() ohne Notice-Meldung arbeitet.

if (!empty($_POST['email'])) {

$email = $_POST['email'];
$pass = $_POST['pass'];

Nicht auszurotten, diese Umkopiererei ohne wirklichen Sinn.

$email = strip_tags($email);
$email = mysql_real_escape_string($email);
$email = eregi_replace("`", "", $email);

Das einzige, was eine Email-Adresse an Behandlung braucht, ist die dem jeweiligen Kontext angemessene. strip_tags() und das Löschen von ` (noch dazu aufwendig mit regulärem Ausdruck statt der einfachen String-Funktion str_replace()) macht im Zweifel mehr reguläre Zeichen kaputt als dass es nützt, solange du dir nicht im Klaren bist, welche Auswirkungen - positive wie negative - du mit welchem Werkzeug erreichen kannst.

$sql = mysql_query("SELECT * FROM x WHERE email='$email' AND Passwort='$pass' AND email_activated='1'");

Wenn du ein SQL-Statement zunächst in einer eigenen Variable zusammenbaust, hast du zu, Beispiel bei der Fehlersuche die Möglichkeit, es dir im Endzustand anzuzeigen. Auch lässt sich bei der Variablennamenvergabe noch etwas mehr Klarheit schaffen. mysql_query() liefert ein Resultset, das mit SQL nichts mehr zu tun hat. Ich nenne das Resultset mal der Einfachheit $result. Wenn du mit mehreren Resultsets zu tun hast, empfiehlt es sich aussagekräftigere/unterscheidbare Variablennamen zu überlegen.

$sql = sprintf("SELECT * FROM x WHERE email='%s' AND Passwort='%s' AND email_activated='1'",
         mysql_real_escape_string($_POST['email'],
         md5($_POST['pass']);
$result = mysql_query($sql);

Zu sprintf() gehören die beiden Platzhalter %s, die durch die beiden angehängten Parameter ersetzt werden. So notiert hat man alles (die Query und die Behandlung der variablen Werte) schön beisammen und nicht über mehrere Zeilen verteilt.

Normalerweise gehört es sich für ein robustes Programm auch, Fehlerbedingungen zu erkennen und abzufangen. Das ignoriere ich jetzt mal, weil das Posting sowieso schon lang genug wird. Du müsstest erst $result auf false testen, bevor du damit weiterarbeiten kannst.

$login_check = mysql_num_rows($sql);
if($login_check > 0){

Brauchst du die Variable $login_check später noch einmal? Nein? Dann muss sie auch nicht erst angelegt werden. (Beachte auch, dass das Resultset was bei dir $sql hieß, bei mir nun $result heißt.)

if (mysql_num_rows($result) > 0) {

while($row = mysql_fetch_array($sql)){

Kein Einwand, nur die Variable heißt bei mir anders.

while($row = mysql_fetch_array($result)){

$id = $row["id"];
        session_register('id');
        $_SESSION['id'] = $id;

Diese Aktionen beinhaltet je zwei überflüssige Vorgänge. session_register() ist veraltet, nur $_SESSION wird noch benötigt. Und da kannst du den Wert aus $row auch direkt reinschreiben.

$_SESSION['id'] = $row["id"];

Das selbe Prinzip gilt bei Vorname und Email.

mysql_query("UPDATE x SET last_log_date=now(), Logins=Logins + 1 WHERE id='$id'");

$id gibt es nun nicht mehr. Vermutlich ist das auch ein Integer-Feld im DBMS, also kann da auch nichts anderes als ein Integerwert (oder NULL, aber vermutlich nicht in dem Fall) zurückkommen. Ein Einfassen in Hochkomma ist nicht notwendig.

$sql = "UPDATE x SET last_log_date=now(), Logins=Logins + 1 WHERE id=" . $row["id"];
mysql_query($sql);

Auch hier gehört sich eigentlich eine Auswertung des Rückgabewertes von mysql_query().

mysql_query("DELETE FROM Logins WHERE (NOW() - INTERVAL 1 DAY) > Datum AND ID='$id'");
mysql_query("SELECT COUNT(ID) FROM Logins WHERE ID='$id'");

Ebenso wie bei diesen beiden Querys. (auch beachten: $id -> $row["id"])

$count = mysql_fetch_assoc();
var_dump($count);

Hier müsstest du eigentlich eine PHP-Warnung ausgegeben bekommen, denn mysql_fetch_assoc() lässt sich nicht ungestraft parameterlos aufrufen. Du musst angeben, welches Resultset du befragen willst. Dazu hättest du beim SELECT COUNT... den Rückgabewert in einer Variable aufheben müssen.

$result_count = mysql_query("SELECT COUNT(ID) FROM Logins WHERE ID=" . $row["id"]);
  $count = mysql_fetch_assoc($result_count);

Und nun ergibt die Kontrollausgabe auch ein schönes Ergebnis-Array.

var_dump($count);

mysql_fetch_assoc() ist für diese Query mit der Formel COUNT(ID) und ohne Alias umständlich zu bedienen, denn deine gesuchte Anzahl muss nun so abgefragt werden:

$count['COUNT(ID)']

Besser ist, SELECT COUNT(ID) anz FROM ... und dann über $count['anz'] zuzugreifen oder aber mysql_fetch_row($result_count) und dann $count[0] zu verwenden.

Den Rest solltest du nun hoffentlich allein anpassen können.

<form id="email" name="email" method="post" action=""><input type="text" name="email" id="email" /></form>
<form id="pass" name="pass" method="post" action=""><input type="password" name="pass" id="pass" /></form>
<form id="submit" name="submit" method="post" action=""><input type="submit" name="submit" id="submit" value="Senden" /></form>

Aber was ist denn das? Was machst du denn hier mit drei unabhängigen Formularen? Die ersten beiden kannst du nur jeweils einzeln mit Enter absenden, das dritte hat zwar einen Submit-Button aber sonst keine Felder. Hier fehlen dir eindeutig einfachtes Grundlagenwissen zu <http://de.selfhtml.org/html/formulare/eingabe.htm@title=Formularen in HTML>.

Lo!