[PHP/MySQL] Anmeldeforumlar

Ich verstehe deine Frage jetzt nicht genau.
Aber mal was zu deinem Code: Verwende (wie bereits gesagt) besser empty(). Und immer $_REQUEST nehmen is auch pöse, nimm besser das was du auch brauchst - $_POST, $_GET
 
Ich Formulier es nochmal anders. Der Code ist ja von einem aus dem Thread und fande den Code sehr gut. Weil bei dem Script angezigt wurde, wenn man beim registrieren z.b. name vergessen hat einzugeben komtm sofort die Meldung, dass man das vergessen hat und bei meinem Script wird das halt nicht gemeldet und man kann sich auch ohne namen registrieren.

Da ich mit dem Script aus dem Thread nicht so klar komme, wollte ich fragen ob ihr ihn mir erklären könnt und was man daran vllt. noch verbessern kann, wie eben genannt von euch post benutzen...

Liebe Grüße und danke
Markus
 
Du musst einfach für jedes Eingabefeld prüfen ob ein Wert vorliegt das machst du mit dem Namen des Inputfelds, bei

Code:
<input type='text' name='vorname' value=''>
Wäre der Name des Feldes also vorname

So dann kommt php teil #1

PHP:
# Prüfen ob Formular abgeschickt wurde und dann:
# Fehlermeldung zurücksetzen
unset($fehler);
# Vorname ausgefüllt?
if (empty($_POST['vorname'])) $fehler .= 'Bitte Vorname angeben <br />';
#weitere Felder prüfen
So vor dem Eintragen in die Datenbank machst du dann noch eine Abfrage ob ein Fehler vorliegt:

PHP:
if(!isset($fehler)){
 # Hier dann eintragen
}else{
echo $fehler;
}
Hoffe ist verständlich ;)

Gruß
Gremlin
 
Super danke geile erklärung, danke.

Und den rest könnte ich so machen wie mein Script: siehe erster Post?

Liebe Grüße
Markus
 
Naja an einigen Ecken ist das schon noch überarbeitungsbedürftig^^ übergib nie POST/GET etc. Werte einfach so an einen mysql Befehl => SQL Injektion ;). Und das ganze was du mit dem $sqlab . = ..... machst ist auch ziemlich verwirrend zwar nicht falsch, aber sieht sehr verwirrend aus ;) ebenso das du

PHP:
         echo "<font color='#ff0000'>";
         echo "Es ist ein Fehler aufgetreten, ";
         echo "es wurde kein Datensatz hinzugefügt<p>";
         echo "</font>";
schreibst und nicht z.B.

PHP:
         echo "
         <font color='#ff0000'>
         Es ist ein Fehler aufgetreten,
         es wurde kein Datensatz hinzugefügt<p>
         </font>
              ";
aber wie gesagt: Schönheitsfehler ;)
 
Naja an einigen Ecken ist das schon noch überarbeitungsbedürftig^^ übergib nie POST/GET etc. Werte einfach so an einen mysql Befehl => SQL Injektion
Ah, ok danke. Wie dann, soll ich es lieber so machen?

PHP:
$vorname = $_POST['vorname'];
...
Ok vielen dank schonmal,
liebe Grüße
Markus
 
Ich will dir nichts böses, aber du suchst dir wirklich nur das zusammen was du brauchst und hast nicht wirklich Ahnung was du überhaupt genau machst.

In meinem letzten Post habe ich es auch schon erwähnt, lese dir unbedingt ein PHP Tutorial durch, da werden alle Fragen die du bisher erstellt hast beantwortet. ;)
 
du solltest die übergebenen felder validieren :!:

also alle Daten, die von einem Nutzer kommen, sind gefährlich! das heißt für dich, du solltest prüfen, ob das feld überhaupt erlaubt ist und ob der Wert des Feldes ebenfalls gültig ist.
Den Wert des Feldes prüftst du anhand des Whitelistening Verfahrens. Am besten mit regulären Ausdrücken

Kleines Beispiel:
PHP:
unset($vorname,$nachname,$passwort,$array_fields,$var_pruefen);
 
// $array_fields Beschreibung
// Wert 1: minimale Länge
// Wert 2: maximale Länge
// Wert 3: regulärer Ausdruck
$array_fields = array(
'vorname' => array('2','50','[a-z A-Z-äÄöÖüÜß]+'),
'nachname' => array('2','50','[a-z A-Z-äÄöÖüÜß]+'),
'passwort' => array('4','50','[a-zA-Z0-9]+')
);
 
foreach($_POST AS $key => $value)
{
if(in_array($key, $array_fields))
{
// Feld ist erlaubt
//Prüfung auf Zeichenlänge
if(strlen($value) >= $array_fields["$key"][0] && strlen($value) <= $array_fields["$key"][1])
{
// Zeichenlänge ist ok
// Prüfung auf regulären Ausdruck
$var_pruefen = @preg_match("/^".$array_fields["$key"][2]."$/i",$value);
if($var_pruefen == 1)
{
// Wert des Feldes gültig
// Daten in die Datenbank eintragen
}
else
{
// Wert des Feldes nicht zulässig
}
}
else
{
// Zeichenlänge zu groß oder zu klein
}
}
else
{
// die POST-Daten wurden manipuliert
}
}

Ist jetzt ungetestet. Hoffe mal ich hab keinen Fehler gemacht.
Habe das jetzt nur für 3 Felder gemacht (vorname,nachname,passwort). lässt sich aber beliebig erweitern.
 
PHP:
# Prüfen ob Formular abgeschickt wurde und dann:
# Fehlermeldung zurücksetzen
unset($fehler);
# Vorname ausgefüllt?
if (empty($_POST['vorname'])) $fehler .= 'Bitte Vorname angeben <br />';
#weitere Felder prüfen
Nicht gut.
Wenn du unset() verwendest, ist die Variable danach nicht leer, sondern nicht gesetzt. Der .=-Operator wirft dir ein E_NOTICE.

Besser:
PHP:
$fehler = ''; // leersetzen, danach ist $fehler aber gesetzt
$fehler .= 'foo'; // ergänzen
 
So, nach lagem überlgen und mit viel Hilfe von euch, habe ich es nun hinbekommen. Das wichitgste ist, dass es geht. Nun wollte ich wissen, was man daran noch so verbessern kann. Klar, es ist nicht das neuste und beste Script, will ich ja auch noch nicht, da ich egrade noch am lernen bin. ABer sollten da große Fehler oder Sicherheitsmängel drin sein, dann freue ich mich über jede Antwort.

PHP:
<?php>
      mysql_connect("","root"); //Verbindung zur Datenbank
      mysql_select_db("login"); //Auswahl der zu benutzenden Datenbank
      
      $name = $_POST["na"]; //Variablenvergabe der eingabe von Name
      $vorname = $_POST["vo"]; //Variablenvergabe der eingabe von Vorname
      $email = $_POST["em"]; //Variablenvergabe der eingabe von Email
      $passwort = $_POST["pa"]; //Variablenvergabe der eingabe von Passwort
      
      unset($fehler); //Überprüfen, ob alles ausgefüllt wurde
      if(empty($_POST['na'])) $fehler.= 'Bitte Name eingeben<br/>'; //Wurde Name eingetragen?
      if(empty($_POST['vo'])) $fehler.= 'Bitte Vorname eingeben<br/>'; //Wurde Vorname eingegeben?
      if(empty($_POST['em'])) $fehler.= 'Bitte Emailadresse eingeben<br/>'; //Wurde Emailadresse eingegeben?
      if(empty($_POST['pa'])) $fehler.= 'Bitte Passwort eingeben<br/>'; //Wurde Passwort eingegeben?
      
      if(!isset($fehler)){ //Überprüft, ob alles eingegeben wurde, Ausgabe
      
      $sqlab ="insert member"; //Zeig an, wo die Daten eingetragen werden sollen
      $sqlab .= "(name, vorname, email, passwort) values ('".$_POST['na'] . "', '".$_POST['vo'] . "', '".$_POST['em'] . "',           '".$_POST['pa'] . "')";
      
      mysql_query($sqlab);
      
      $num = mysql_affected_rows();
      if($num>0)
      {
         echo "Sie haben sich erfolgreich angemeldet.";
      }
      else
      {
         echo "Es ist ein fehler aufgetreten, bitte versuchen sie es später nocheinaml.";   
      }
      }
      else
      {
         echo $fehler;
      }
      
      
          
?>

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>Login</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />    
  </head>
  <body>
    
    <form method="post" action="function/registrieren.php">
    <p><input type="text" name="na" /> Name</p>
    <p><input type="text" name="vo" /> Vorname</p>
    <p><input type="text" name="em" /> E-Mail</p>
    <p><input type="password" name="pa" /> Passwort</p>   
    <p><input type="submit" name="button" value="Senden" /></p> 
    </form>
    
    
  </body>
</html>

Liebe Grüße
Markus
 
In Zeile 1 fangen die Fehler schon an :wall:

PHP:
<?php>
Zeile 2 gehts direkt weiter!

PHP:
mysql_connect("","root");
fehlt noch ein Parameter

PHP:
$name = $_POST["na"];
[..]
Na was bringt denn das? Wieso nimmste nicht später direkt $_POST['na'] wenn du hier jetzt noch addslashes() oder irgendwas angewandt hättest, hätte ich das ja noch verstanden. Aber so -> Überflüssig zumahl du es nachher überhaupt nicht mehr nutzt :wall:

PHP:
unset($fehler);
Ja das war mein "Fehler" tH hat ja schon was dazu geschrieben wobei es nicht falsch ist aber es halt nen E_Notice erzeugt^^

PHP:
$sqlab ="insert member";
Das INTO fehlt, und solltest vielleicht mal angewöhnen Begriffe wie INSERT UPDATE REPLACE VALUES etc. groß zu schrieben -> liest sich besser

PHP:
      $num = mysql_affected_rows();
      if($num>0)
wieos nicht

PHP:
if (mysql_affected_rows() > 0)
!?

Und vielleicht auch den Code einrücken damit man ihn besser lesen kann ;)

Dem Post von chrissel kann ich zustimen:
chrissel schrieb:
In meinem letzten Post habe ich es auch schon erwähnt, lese dir unbedingt ein PHP Tutorial durch, da werden alle Fragen die du bisher erstellt hast beantwortet. ;)

Und Sicherheitslücke gibts halt auch noch, du übergibst die über ein Formular eingegeben Werte direkt an mysql das ist grob fahrlässig...
 
Das INTO fehlt, [...]
Hat mich auch stutzig gemacht, aber laut Manual ist das INTO fakultativ.

SQL hat ja das Ziel, die Statements möglichst nahe an der englischen Sprache zu halten. Ich tippe jetzt einfach mal, dass das eine MySQL-Erweiterung is, um sich das eine Wort sparen zu können.
 
Ok, habe es jetzt hinbekommen. Nun haben sich die User registriert, doch müssen sie sich ja auch mit den Date einloggen können. Ich hatte da an Sessions gedacht, die ich auch benutzen will.

Nun hapert es nur daran, dass mir immer folgender Fehler angezigt wird.

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\header.php:20) in C:\xampp\htdocs\include\login.php on line 4
Dazu muss ich sagen, dass die Seite mit includes aufgebaut ist, somit aus mehreren Teilen, Header, Navigation, Content, Right und Footer besteht.
Hier der Code zum Login.

PHP:
<p><h4>Anmelden</h4>

<?php
  session_start(); //Vor Beenden der Session wieder aufnehmen
  session_destroy(); //Beenden der Session
?>

<form method="post">

   <p><input name="na" class="textfield"/> Benutzername</p><br />
   <p><input name="pa" class="textfield"/> Passwort</p><br />
</form>
 
Die Fehlermeldung sagt doch schon alles, was falsch ist ;)
Der Header wurde bereits gesendet, dieser wird mit der ersten Ausgabe des Scriptes gesendet, also hast du vor deinem session_start() eine Ausgabe, egal ob eine Zeile, eine Lücke oder sonstwas es ist ;)
Wenn ich mir deinen Code ansehe, hast du dort ja auch was vor session_start() stehen. Das session_start() muss aber vor jeder Scriptausgabe stehen ;)

Was mich sonst noch so wundert, warum startest du eine Session wenn du die danach löschst?
 
Ok, also einfach die Leerzeile davor entfernen?
Danke für deine schnelle antwort.

EDIT: Ne, die Leereziel entfernen geht nicht, muss ich es vllt. in der Header.php einbauen?
 
Steht doch eigentlich alles da ;) header.php Zeile 20 findet ne Ausgabe statt und davor muss das session_start() stehen BEVOR irgendwas ausgegeben wird, egal was...
 
Ja gut, aber habe ich doch dann das Problem, weil es eine Inlcudeseite ist, dass dann dieSession für jede Seite gilt, und man sich so nicht ausloggen kann.
 
Ok, habs, danke. Meine letzte Frage bezieht sich auf eine if Abfrage.
Ich möchte ja bei dem Login es so machen, dass if(Wenn) die Eingabe ist wie in der Datenbank dann darf man in den Geschützenbereich, aber wie mache ich das in der if abfrage mit z.b. das name und pw stimmen muss?

Liebe Grüße
Markus