2016-12-12 4 views
-5

Bitte versuchen Sie ein Login- und Registrierungssystem mit pdo und mysql und dieser Fehler auftauchen hält, ich las durch alle Antworten auf diese Art von Fehler, aber kann nicht scheinen mir ... heres den Code zu korrigieren ..{"error": {"text": SQLSTATE [HY093]: Ungültige Parameternummer: Anzahl der gebundenen Variablen stimmt nicht mit der Anzahl der Token überein}} <

<?php 
 

 
class userClass 
 
{ 
 
\t 
 
/* User Login */ 
 
    public function userLogin($email,$password) 
 
    { 
 

 
      $db = getDB(); 
 
      $hash_password= hash('sha256', $password); 
 
      $stmt = $db->prepare("SELECT uid FROM users WHERE email=:email AND password=:hash_password"); 
 
      $stmt->bindParam("email", $email,PDO::PARAM_STR) ; 
 
      $stmt->bindParam("hash_password", $hash_password,PDO::PARAM_STR) ; 
 
      $stmt->execute(); 
 
      $count=$stmt->rowCount(); 
 
      $data=$stmt->fetch(PDO::FETCH_OBJ); 
 
      $db = null; 
 
      if($count) 
 
      { 
 
       $_SESSION['uid']=$data->uid; 
 
       return true; 
 
      } 
 
      else 
 
      { 
 
       return false; 
 
      }  
 
    } 
 

 
    /* User Registration */ 
 
    public function userRegistration($email,$password,$fname,$lname,$dob,$sex,$country,$state_resd,$phone_no,$profile_pic) 
 
    { 
 
      try{ 
 
      $db = getDB(); 
 
      $st = $db->prepare("SELECT uid FROM users WHERE email=:email, password=:hash_password, fname=:fname, lname=:lname, dob=:dob, sex=:sex, country=:country, state_resd=:state_resd, phone_no=:phone_no, profile_pic=:profile_pic"); 
 
      /**$st->bindParam("username", $username,PDO::PARAM_STR);**/ 
 
      $st->bindParam("email", $email,PDO::PARAM_STR); 
 
      $st->execute(); 
 
      $count=$st->rowCount(); 
 
      if($count<1) 
 
      { 
 
      $stmt = $db->prepare("INSERT INTO users(email,password,fname,lname,dob,sex,country,state_resd,phone_no,profile_pic) VALUES (:email,:hash_password:fname,:lname,:dob,:sex,:country,:state_resd,:phone_no)"); 
 
      /**$stmt->bindParam("username", $username,PDO::PARAM_STR) ;**/ 
 
      
 
      $stmt->bindParam("email", $email,PDO::PARAM_STR) ; 
 
\t $hash_password= hash('sha256', $password); 
 
      $stmt->bindParam("hash_password", $hash_password,PDO::PARAM_STR) ; 
 
      $stmt->bindParam("fname", $fname,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("lname", $lname,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("dob", $dob,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("sex", $sex,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("country", $country,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("state_resd", $state_resd,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("phone_no", $phone_no,PDO::PARAM_STR) ; 
 
\t $stmt->bindParam("profile_pic", $profile_pic,PDO::PARAM_STR) ; 
 
\t 
 
      $stmt->execute(); 
 
      $uid=$db->lastInsertId(); 
 
      $db = null; 
 
      $_SESSION['uid']=$uid; 
 
      return true; 
 

 
      } 
 
      else 
 
      { 
 
      $db = null; 
 
      return false; 
 
      } 
 
      
 
      
 
      } 
 
      catch(PDOException $e) { 
 
      echo '{"error":{"text":'. $e->getMessage() .'}}'; 
 
      } 
 
    } 
 
     
 
    /* User Details */ 
 
    public function userDetails($uid) 
 
    { 
 
     try{ 
 
      $db = getDB(); 
 
      $stmt = $db->prepare("SELECT email FROM users WHERE uid=:uid"); 
 
      $stmt->bindParam("uid", $uid,PDO::PARAM_INT); 
 
      $stmt->execute(); 
 
      $data = $stmt->fetch(PDO::FETCH_OBJ); 
 
      return $data; 
 
     } 
 
     catch(PDOException $e) { 
 
      echo '{"error":{"text":'. $e->getMessage() .'}}'; 
 
      } 
 

 
    } 
 

 

 
} 
 
?>

und für die Registrierungsseite

<?php 
 
include("config.php"); 
 
include('class/userClass.php'); 
 
$userClass = new userClass(); 
 

 
$errorMsgReg=''; 
 
$errorMsgLogin=''; 
 
if (!empty($_POST['loginSubmit'])) 
 
{ 
 
$email=$_POST['email']; 
 
$password=$_POST['password']; 
 

 
if(strlen(trim($email))>1 && strlen(trim($password))>1) 
 
    { 
 
    $uid=$userClass->userLogin($email,$password); 
 
    if($uid) 
 
    { 
 
     $url=BASE_URL.'home.php'; 
 
     header("Location: $url"); 
 
    } 
 
    else 
 
    { 
 
     $errorMsgLogin="Please check login details."; 
 
    } 
 
    } 
 
} 
 

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

 
\t /**$username=$_POST['usernameReg'];**/ 
 
\t 
 
\t $email=$_POST['emailReg']; 
 
\t $password=$_POST['passwordReg']; 
 
    $fname=$_POST['fnameReg']; 
 
    $lname=$_POST['lnameReg']; 
 
    $dob=$_POST['dobReg']; 
 
    $sex=$_POST['sexReg']; 
 
    $country=$_POST['countryReg']; 
 
    $state_resd=$_POST['state_resdReg']; 
 
    $phone_no=$_POST['phone_noReg']; 
 
    $profile_pic=$_POST['profile_picReg']; 
 
\t /**$username_check = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $username);**/ 
 
\t $email_check = preg_match('~^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$~i', $email); 
 
\t $password_check = preg_match('~^[[email protected]#$%^&*()_]{6,20}$~i', $password); 
 

 
\t if($email_check && $password_check && strlen(trim($fname))>0) 
 
\t { 
 
    $uid=$userClass->userRegistration($email,$password,$fname,$lname,$dob,$sex,$country,$state_resd,$phone_no,$profile_pic); 
 
    if($uid) 
 
    { 
 
    \t $url=BASE_URL.'home.php'; 
 
    \t header("Location: $url"); 
 
    } 
 
    else 
 
    { 
 
     $errorMsgReg="Email already exits."; 
 
    } 
 
    
 
\t } 
 

 

 
} 
 

 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
#container{width: 700px} 
 
#login,#signup{width: 300px; border: 1px solid #d6d7da; padding: 0px 15px 15px 15px; border-radius: 5px;font-family: arial; line-height: 16px;color: #333333; font-size: 14px; background: #ffffff;rgba(200,200,200,0.7) 0 4px 10px -1px} 
 
#login{float:left;} 
 
#signup{float:right;} 
 
h3{color:#365D98} 
 
form label{font-weight: bold;} 
 
form label, form input{display: block;margin-bottom: 5px;width: 90%} 
 
form input{ border: solid 1px #666666;padding: 10px;border: solid 1px #BDC7D8; margin-bottom: 20px} 
 
.button { 
 
    background-color: #5fcf80 !important; 
 
    border-color: #3ac162 !important; 
 
    font-weight: bold; 
 
    padding: 12px 15px; 
 
    max-width: 300px; 
 
    color: #ffffff; 
 
} 
 
.errorMsg{color: #cc0000;margin-bottom: 10px} 
 
</style> 
 
<body> 
 
<div id="container"> 
 
<<div id="signup"> 
 
<h3>Registration</h3> 
 
<form method="post" action="" name="signup"> 
 
<label>Email</label> 
 
<input type="text" name="emailReg" autocomplete="off" /> 
 
<label>Password</label> 
 
<input type="password" name="passwordReg" autocomplete="off"/> 
 

 
<label>First Name</label> 
 
<input type="text" name="fnameReg" autocomplete="off" /> 
 
<label>Last Name</label> 
 
<input type="text" name="lnameReg" autocomplete="off" /> 
 

 
<label>Sex</label> 
 
<input type="text" name="sexReg" autocomplete="off" /> 
 

 

 
<label>Date of Birth</label> 
 
<input type="text" name="dobReg" autocomplete="off" /> 
 
<label>Country</label> 
 
<input type="text" name="countryReg" autocomplete="off" /> 
 

 
<label>State of Residence</label> 
 
<input type="text" name="state_resdReg" autocomplete="off" /> 
 

 
<label>Phone Number</label> 
 
<input type="text" name="phone_noReg" autocomplete="off" /> 
 
<label>Profile photo</label> 
 
<input type="text" name="profile_picReg" autocomplete="off" /> 
 
<!--<label>Username</label> 
 
<input type="text" name="usernameReg" autocomplete="off" />--> 
 

 

 
<div class="errorMsg"><?php echo $errorMsgReg; ?></div> 
 
<input type="submit" class="button" name="signupSubmit" value="Create Counter"> 
 
<a href="index.php" class="to_register"> Login </a> 
 
</form> 
 
</div> 
 

 

 

 

 
</div> 
 

 
</body> 
 
</html>

pls mir helfen, einen Blick auf meine Codes, um zu sehen, was falsch mache, wie nahe bin ein Neuling

+0

viel gibt es, dass Sie falsche Funktion ... auf ur-Register tun Sie nur einen Parameter verbindlich sind, aber Sie haben eine Viele Platzhalter –

+0

Ihre Insert-Anweisung ist auch falsch .. –

+1

Lesen Sie über die korrekte Verwendung von PDO hier: https://phddelusions.net/pdo –

Antwort

0

Der Fehler, den Sie ist selbsterklärend bekommen, bedeutet es, die Anzahl der Parameter, die Sie sind Die Bindung entspricht nicht der Anzahl der Spaltennamen, die Sie im ersten Teil der Abfrageanweisung verwenden.

Ihre Registerfunktion wie diese

/* User Registration */ 
    public function userRegistration($email,$password,$fname,$lname,$dob,$sex,$country,$state_resd,$phone_no,$profile_pic) 
    { 
      try{ 
      $db = getDB(); 
      $st = $db->prepare("SELECT uid FROM users WHERE email=:email LIMIT 1"); 
      $st->bindParam("email", $email,PDO::PARAM_STR); 
      $st->execute(); 
      $count=$st->rowCount(); 
      if($count<1) 
      { 
      $stmt = $db->prepare("INSERT INTO users(email,password,fname,lname,dob,sex,country,state_resd,phone_no,profile_pic) VALUES (:email,:hash_password,:fname,:lname,:dob,:sex,:country,:state_resd,:phone_no,:profile_pic)"); 

      $stmt->bindParam("email", $email,PDO::PARAM_STR) ; 
     $hash_password= password_hash($password,PASSWORD_DEFAULT); 
      $stmt->bindParam(":hash_password", $hash_password,PDO::PARAM_STR) ; 
      $stmt->bindParam(":fname", $fname,PDO::PARAM_STR) ; 
     $stmt->bindParam(":lname", $lname,PDO::PARAM_STR) ; 
     $stmt->bindParam(":dob", $dob,PDO::PARAM_STR) ; 
     $stmt->bindParam(":sex", $sex,PDO::PARAM_STR) ; 
     $stmt->bindParam(":country", $country,PDO::PARAM_STR) ; 
     $stmt->bindParam(":state_resd", $state_resd,PDO::PARAM_STR) ; 
     $stmt->bindParam(":phone_no", $phone_no,PDO::PARAM_STR) ; 
     $stmt->bindParam(":profile_pic", $profile_pic,PDO::PARAM_STR) ; 

      $stmt->execute(); 
      $uid=$db->lastInsertId(); 
      $db = null; 
      $_SESSION['uid']=$uid; 
      return true; 

      } 
      else 
      { 
      $db = null; 
      return false; 
      } 


      } 
      catch(PDOException $e) { 
      echo '{"error":{"text":'. $e->getMessage() .'}}'; 
      } 
    } 

NB aussehen sollte: Ich habe von der sha256 geändert Sie verwendet haben, als Sie dachten, dass Sie Ihr Passwort sind Hashing. Ich benutzte password_hash(); und password_verify(); Diese SO Frage gibt Ihnen mehr Details, als warum ich das verwendete. Secure hash and salt for PHP passwords.

Sie können auch die Website besuchen. https://phpdelusions.net/pdo, um mehr über die ordnungsgemäße Verwendung von PDO zu erfahren.

Alternative/in der Regel einfache Möglichkeit, mit PDO einzufügen:

$stmt = $db->prepare("INSERT INTO users(email,password,fname,lname,dob,sex,country,state_resd,phone_no,profile_pic) VALUES (?,?,?,?,?,?,?,?,?,?)"); 
$stmt->execute(array($email,$hash_password,$fname,$lname,$dob,$sex,$country,$state_resd,$phone_no,$profile_pic)); 

Ihre Login-Funktion password_verify(); sollte wie folgt aussehen:

/* User Login */ 
    public function userLogin($email,$password) 
    { 

      $db = getDB(); 
      // $hash_password= hash('sha256', $password); 
      $stmt = $db->prepare("SELECT uid,email,password FROM users WHERE email=:email"); 
      $stmt->bindParam(":email", $email,PDO::PARAM_STR) ; 
      $stmt->execute(); 

      $results= $stmt->fetchall(PDO::FETCH_ASSOC); 

      if(count($results) > 0){ 

       foreach($results as $row){ 

        if(password_verify($password,$row['password'])){ 

         $_SESSION['uid']=$data->uid; 
         return true; 

         //$password is the password from the user 
        }else{ 

         //provided password does not match stored hash 

         return false; 
        } 
       } 

      }else{ 
       //No results 

       return false; 
      } 


    } 

Hoffe, dass ich keine geschweifte Klammer dort entging :)

+0

Nein, Sie haben keine geschweifte Klammer übersehen. und ich schätze deine Antwort sehr .. ich benutzte die korrigierten Codes, die du sendest, aber erhält diese Fehlermeldung. Schwerwiegender Fehler: Rufen Sie die nicht definierte Funktion password_hash() in C: \ wamp \ www \ appyam \ class \ userClass.php in Zeile 57 auf. Bitte helfen Sie mir, es anzuschauen. habe gerade das password_compat heruntergeladen und benutze php5.3 – JerryCole

+0

Oh, das Problem ist mit deiner PHP-Version, die du brauchst, um 5.6 oder höher zu haben –

+0

ja vielen Dank ... ich dachte, ich habe ein Upgrade auf 5.7 gemacht. danke – JerryCole

Verwandte Themen