PHP Problem

knech

Grünschnabel
Hallo, bekomme die Ausgabe
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\xampp\login.php on line 14

PHP:
<?php
session_start();
$connection = mysql_connect("localhost", "root","") or die("Fehler bei der Verbindung mit der DB.");
$db = mysql_select_db("chatdb",$connection);

$email = $_POST['email'];
$password = $_POST['password'];
if($email != "" && $password !="") {
   $email = mysql_real_escape_string($email);
   $password = md5($password);
   //Datenabfragen aus Datenbank
$result = mysql_query("SELECT * FROM user WHERE email={$email}");
   //Ist der Benutzer vorhanden?
   if(mysql_num_rows($result) > 0){
     $dbData = mysql_fetch_assoc($result);
     if($dbData['password'] == $password) {
       $userip = $_SERVER['REMOTE_ADDR'];
       $userid = $dbData['UID'];
       $insert = mysql_query("INSERT INTO loginlog VALUES('','{$userid}','{$userip}'");
       $_SESSION['userid']= $userid;
     }
     else{
       $output = "Falsches Passwort.";
     }
   }
   else{
   $output = "Der Benutzer ist nicht vorhanden.";}
}
else {
   $output = "Bitte f&uuml;llen Sie alle Felder aus.";}
echo $output;
?>


Wer hat eine Lösung parat?
 
Hi

...Der Code ist voll mit Riesenproblemen, vieles davon (leider häufige) Anfängerfehler.
Eine ausführliche Antwort wird zu lang, hier kurze Hinweise für die weitere Recherche:

a) Die "mysql_" - Funktionen existieren in halbwegs neuen PHP-Versionen nicht mehr.
Seit ca. 10 Jahren gibts was Besseres, es gab schon lange Warnungen es nicht mehr zu verwenden, auch PHP hat bei jeder Verwendung schon Probleme gemeldet, und inzwischen sind die Funktionen einfach weg. Wenn du Code willst, der auch in Zukunft noch funktioniert (wenn dein Hoster keine Uralt-Software mehr verwendet) und keine Sicherheitsprobleme hat, siehe Mysqli oder PDO.

b) "WHERE email={$email}"
Außer, dass da Anführungszeichen für die SQL-Anweisung fehlen, ist da etwas namens SQL-Injection möglich, was "jedem" Besucher deiner Seite ermöglicht, beliebigen Unsinn mit deiner Datenbank zu machen (alles auslesen, ändern, löschen, usw.usw.). Lösung: Siehe Prepared Statements.

c) MD5
ist seit 1994 nicht mehr so sicher wie es sein sollte, und außerdem ist ein einzelner Hash ziemlich ungeeignet für deinen Anwendungsfall. Siehe PBKDF und das Konzept von Salts.

d) &uuml;
Verwende UTF8, sowohl in den Dateien als auch in der DB und sonst überall, und du hast a) keine Umständlichkeiten wie &uuml; mehr (einfach ü schreiben und fertig), b) kein Risiko dass Umlaute auf deiner Seite je irgendwie kaputt sind, c) eine Seite die mit allen Sprachen der Welt zurechtkommt. (UTF8 hat zwar auch Nachteile bzw. zusätzliche Komplexität, sollte für den Fall aber egal sein. Und auch mit allen Nachteilen gibt es keinen Grund mehr für &uuml)
 
Zuletzt bearbeitet:
Zur PN:

Wenn es nicht irgendwie geheim sein muss (Privatsphäre etc.), bitte themenbezogene Fragen öffentlich stellen. Da können auch andere Leute helfen, und vllt. Andere auch davon lernen.

Zum Thema Schule/"einfach": Es ist nicht einfach, sondern krautfalsch. Gegen einfache Lösungen hab ich nichts.

Zum Link: Die verwendeten Funktionen schauen brauchbar aus.
Allerdings sind b/c/d nicht rein durch Austausch von Funktionen lösbar.
 
PHP:
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=chatdb', 'chatdb', '');
?>
<!DOCTYPE html>
<html>
<head>
  <title>Registrierung</title>  
</head>
<body>
<?php
$showFormular = true; //Variable ob das Registrierungsformular anezeigt werden soll
if(isset($_GET['register'])) {
   $error = false;
   $vorname = $_POST['vorname'];
   $nachname = $_POST['nachname'];
   $email = $_POST['email'];
   $passwort = $_POST['passwort'];
   $passwort2 = $_POST['passwort2'];

   if(strlen($vorname) == 0) {
     echo 'Bitte ein Vorname angeben<br>';
     $error = true;
   }

   if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
     echo 'Bitte eine gültige E-Mail-Adresse eingeben<br>';
     $error = true;
   }   
   if(strlen($passwort) == 0) {
     echo 'Bitte ein Passwort angeben<br>';
     $error = true;
   }
   if($passwort != $passwort2) {
     echo 'Die Passwörter müssen übereinstimmen<br>';
     $error = true;
   }
  
   //Überprüfe, dass die E-Mail-Adresse noch nicht registriert wurde
   if(!$error) {
     $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
     $result = $statement->execute(array('email' => $email));
     $user = $statement->fetch();
    
     if($user !== false) {
       echo 'Diese E-Mail-Adresse ist bereits vergeben<br>';
       $error = true;
     }  
   }
  
   //Keine Fehler, wir können den Nutzer registrieren
   if(!$error) {  
     $passwort_hash = password_hash($passwort, PASSWORD_DEFAULT);
    
     $statement = $pdo->prepare("INSERT INTO users (email, passwort, vorname, nachmame) VALUES (:email, :passwort, :vorname, :nachname)");
     $result = $statement->execute(array('email' => $email, 'passwort' => $passwort_hash, 'vorname' => $vorname, 'nachname' => $nachname));
    
     if($result) {    
       echo 'Du wurdest erfolgreich registriert. <a href="login.php">Zum Login</a>';
       $showFormular = false;
     } else {
       echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
     }
   }
}
if($showFormular) {
?>
<form action="?register=1" method="post">
Vorname:<br>
<input type="vorname" size="40" maxlength="250" name="vorname"><br><br>
Nachname:<br>
<input type="nachname" size="40" maxlength="250" name="nachname"><br><br>
E-Mail:<br>
<input type="email" size="40" maxlength="250" name="email"><br><br>
Dein Passwort:<br>
<input type="password" size="40"  maxlength="250" name="passwort"><br>
Passwort wiederholen:<br>
<input type="password" size="40" maxlength="250" name="passwort2"><br><br>
<input type="submit" value="Abschicken">
</form>
<?php
} //Ende von if($showFormular)
?>
</body>
</html>



Ich habe nun von hier: https://www.php-einfach.de/experte/php-codebeispiele/loginscript/ das ganze mit vorname und nachname ergänzt.
Funktioniert so aber nicht, was fehlt?
 
Für bei der Meldung ein print_r($pdo->errorInfo()); ein, um eine genauere Fehlermeldung zu bekommen.
 
Hallo knech,

Du hast einen Schreibfehler in Zeile 55.

PHP:
$statement = $pdo->prepare("INSERT INTO users (email, passwort, vorname, nachmame) VALUES (:email, :passwort, :vorname, :nachname)");

nachmame statt nachname.

Liebe Grüße
 
Hallo knech,

dein Skript nutzt zwar PDO als Treiber, jedoch birgt es noch immer einige Lücken.

PHP:
$vorname = $_POST['vorname'];

sowas gehört seit PHP 5.2 der Vergangenheit an.

Besser:
PHP:
$vorname = filter_input(INPUT_POST, 'vorname');

selbiges auch bei $_GET

http://php.net/manual/de/function.filter-input.php

Zusätzlich würde ICH, bei dem ersten Query, bei dem geprüft wird, ob die E-Mail-Adresse bereits vorhanden ist ein LIMIT setzten. Denn Du möchtest ja nur wissen, ob die E-Mail-Adresse mehr als 0 mal vorhanden ist.

PHP:
$statement = $pdo->prepare("SELECT id FROM users WHERE email = :email LIMIT 1");

MySQL wird also, sobald die E-Mail-Adresse gefunden wurde, nicht in den restlichen Zeilen danach suchen.

Liebe Grüße
 
Zurück