• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Benutzer_id in der Datenbank steigt bei jedem Absenden auch wenn ein Error kommt.

parameter95

Neues Mitglied
Guten Tag Community, ich möchte kurz und knapp mein Problem schildern.

Bei Absenden eines Datensatzes wird die Benutzer_ID um 1 erhöht. Gut, also müsste bei einem zweiten Absenden des Datensatzes die Benutzer_ID 2 haben. Hat es auch, jedoch wird bei <b>nicht erfolgreicher Absendung</b> die Benutzer_ID um 1 erhöht. Das bedeutet wenn ich ein zweiten Datensatz z.B einfügen möchte und es fehlgeschlagen ist und es nochmal probiere und es klappt hat die zweite Benutzer_ID den Wert 3 anstatt 2. Genauer kann ich es nicht erklären vllt fällt euch was beim Bild auf.

Code:
Benutzer_ID hat in der Datenbank-Tabelle folgende Werte: INT(11) NOT NULL, Auto_Increment, Primary_Key

Falls ihr noch meinen Code sehen möchtet der den Datensatz einfügt:
PHP:
<?php
if ("POST" == $_SERVER['REQUEST_METHOD']) {

include "inc/verbindung.inc.php";


$insert = $verbindung->prepare("INSERT INTO account (user, password, zahl) VALUES (?, ?, ?)");
$insert->bindValue(1, $_POST['user']);
$insert->bindValue(2, password_hash($_POST['password'], PASSWORD_DEFAULT));
$insert->bindValue(3, $_POST['zahl']);

if ($insert->execute()) {
echo "Sie haben die Daten richtig eingegeben";
} else {
exit($insert->errorInfo());
}
}
?>

Was ich gern haben möchte: Das sich bei jedem Account der erstellt wird die , Benutzer_ID um eins steigt auch <b>wenn</b> es fehlgeschlägt beim Absenden.(bzw. Sie haben nicht alle Felder ausgefüllt oder weiteres).
 

Anhänge

  • id.PNG
    id.PNG
    1,4 KB · Aufrufe: 7
Werbung:
Du willst ein Erhöhen der ID auf beim Fehlschlagen? Wozu soll das denn gut sein?
 
An welcher Stelle prüfst Du denn, ob alle Felder ausgefüllt wurden? Das fehlt in deinem Code völlig.
 
Werbung:
@bdt600 genau andersrum ich möchte es nicht so haben deswegen suche ich hier nach einer Lösung.

@theradi habe den code oft überarbeitet hatte auch eine Prüfung drin aber hat auch nicht geklappt
 
Das entspricht aber dann nicht dem was Du oben als Problem beschreibst. Wenn Du die Pflichtfelder prüfen würdest und dabei heraus kommt das eines fehlt, dann dürftest Du kein INSERT ausführen - das wäre auch schon die Lösung.
 
Werbung:
@bdt600 : Habe es mal mit empty und Trim versucht wobei ich noch nichts von trim wusste. Deswegen habe ich es mal eingefügt und es klappt auch jetzt alles , nur könnte ich dies jetzt so verwenden und ist es auch sicher?

PHP:
<?php
if ("POST" == $_SERVER['REQUEST_METHOD']) {
include "inc/verbindung.inc.php";

if((empty(trim($_POST['user'] ))) || (empty(trim($_POST['password']))) ||(empty(trim($_POST['personalnummer']))))
{
echo "<p><a href='#'>Zurück</a></p>";
exit("Alle Felder bitte ausfüllen!");
}
else
{


$insert = $verbindung->prepare("INSERT INTO account (user, password, personalnummer) VALUES (?, ?, ?)");
$insert->bindValue(1, $_POST['user']);
$insert->bindValue(2, password_hash($_POST['password'], PASSWORD_DEFAULT));
$insert->bindValue(3, $_POST['personalnummer']);

if ($insert->execute()) {
echo "Sie haben die Daten richtig eingegeben";
} else {
print_r($insert->errorInfo());
}
}
}
?>

<form action="<?php $_SERVER['SCRIPT_NAME'] ?>" method="POST">
<p><input name="user" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Passwort"></p>
<p><input name="personalnummer" placeholder="Personalnummer"></p>
<p><input type="submit" value="Login" name="senden"></p>
</form>
</style>
 
Zuletzt bearbeitet:
Also ich gehe mal davon aus, das es eine Art "Registration" ist. Daher ist es gut möglich das der Benutzername der angegeben und in der Datenbank hinterlegt wird, irgendwo wieder angezeigt wird. Dh. wiederum, dass du diesen Benutzernamen filtern solltest, damit der Angreifer bspw. keinen HTML-Code / JavaScriptCode in deine Datenbank einschleusen kann.
 
Dh. wiederum, dass du diesen Benutzernamen filtern solltest, damit der Angreifer bspw. keinen HTML-Code / JavaScriptCode in deine Datenbank einschleusen kann.
Wobei man dies auch erst beim Auslesen filtern könnte. Primär wichtig ist es, SQL Injections vorzubeugen und das sollte bei den prepared statements der Fall sein-.
 
Werbung:
Bei der Personalnummer, da muss es doch eigentlich in eine Zahl umwandeln mit intval($_POST['personalnummer'] oder nicht?

Code
PHP:
<?php
if ("POST" == $_SERVER['REQUEST_METHOD']) {
include "inc/verbindung.inc.php";


$user = $_POST['user'];
$filteruser = filter_var($user, FILTER_SANITIZE_STRING);

if($filteruser === false) {
echo "Der Benutzername ist nicht korrekt. Bitte keine ungültigen Zeichen verwenden!";
}
else
{
echo "Der Benutzername ist korrekt.";
}


$personalnummer = intval($_POST['personalnummer']);
$filterps = filter_var($personalnummer, FILTER_VALIDATE_INT);

if($filterps === false) {
echo "Bitte nur Zahlen eingeben";
}
else {
echo "Gültige Eingabe";
}

if((empty(trim($_POST['user'] ))) || (empty(trim($_POST['password']))) || (empty(trim($_POST['personalnummer']))))
{
echo "<p><a href='#'>Zurück</a></p>";
exit("Alle Felder bitte ausfüllen!");
}
else
{


$insert = $verbindung->prepare("INSERT INTO account (user, password, personalnummer) VALUES (?, ?, ?)");
$insert->bindValue(1, $_POST['user']);
$insert->bindValue(2, password_hash($_POST['password'], PASSWORD_DEFAULT));
$insert->bindValue(3, $_POST['personalnummer']);

if ($insert->execute()) {
echo "Sie haben die Daten richtig eingegeben";
} else {
print_r($insert->errorInfo());
}
}
}
?>

Problem: er zeigt mir immer gültige Eingabe auch bei den ungültigen Zeichen die ich verwende.
 
Zuletzt bearbeitet:
Werbung:
@bdt : Danke für den Link erstmals aber: Das beantwortet immer noch nicht das Problem das , wenn ich mich mit dem Benutzer Einlogge , das er dann immer ausgibt: Das die Daten Korrekt sind obwohl ich ungültige Zeichen verwende wie: !"§$% etc.
 
Ungültige Zeichen? Die Zeichen ausgenommen die Hochkommas, darfst du heutzutage in jedem Passwort und Benutzernamen verwenden. Damit lässt sich auch nicht viel manipulieren, bezüglich der Sicherheit. Zumindest nicht das ich wüsste, wenn korrigiert mich.

Wichtig ist, das du kein XSS, SQLi und Blind SQLi zulässt. Da reichen eig. Prepared-Statements und htmlspecialchars().
 
Etwas übersichtlicher (ungetestet)
PHP:
<?php
   if (isset($_POST['user']))
   {
      $user = trim($_POST['user']);
      $pnr  = trim($_POST['personalnummer']);
      $pw   = trim($_POST['password']);
     
      if (!empty ($user) && ! empty($pnr) && ! empty($pw))
      {
        $user = filter_var($user, FILTER_SANITIZE_STRING);
        $pnr  = filter_var($pnr, FILTER_VALIDATE_INT);
       
        if ($user !== false && $pnr !== false)
        {
           include "inc/verbindung.inc.php";
          
           $insert = $verbindung->prepare("INSERT INTO account (user, password, personalnummer) VALUES (?, ?, ?)");
           $insert->bindValue(1, $user);
           $insert->bindValue(2, password_hash($pw, PASSWORD_DEFAULT));
           $insert->bindValue(3, $pnr);
            if ($insert->execute())
              echo "Sie haben die Daten richtig eingegeben";
            else
              print_r($insert->errorInfo());
        }
        else
        {
           if ($user === false)
              echo "Der Benutzername ist nicht korrekt. Bitte keine ungültigen Zeichen verwenden!";
             
           if ($pnr === false)
              echo "Bitte nur Zahlen eingeben";
        }
      }
      else
        echo "Nicht alle Felder ausgefüllt";
   }
?>
 
Werbung:
Bei Anfänger schreibe ich's lieber ausführlich ;)

Nachtrag: Deine Version hat auch eine Macke. Wenn man bei Zahlen eine 0 eingibt, was durchaus erlaubt sein kann, würde deine Version scheitern ;)
 
Zuletzt bearbeitet von einem Moderator:
Bei Anfänger schreibe ich's lieber ausführlich ;)

Nachtrag: Deine Version hat auch eine Macke. Wenn man bei Zahlen eine 0 eingibt, was durchaus erlaubt sein kann, würde deine Version scheitern ;)
Habe die Dokumentation von filter_var jetzt nicht im Kopf, aber kann da nicht nur TRUE oder FALSE geliefert werden? Von daher müsste es auch bei deine Version dann knacken.

Wie dem auch sei Chef. Du wusstest ja worauf ich hinnaus will. Müsste man wenn halt an den Quellcode anpassen.
 
Werbung:
Das Funktoniert immer noch nicht ganz. Alles klappt außer das mit den Filtern. Sobald ich ungültige Zeichen verwende steht da immer: Alle Pflichtfelder ausfüllen. (Code von bdt).

#Das mit der Personalnummer klappt aber.
 
Zurück
Oben