2016-05-04 10 views
-2

を使用しようと、私は準備された文を作成する方法を理解しようとしていますが、私はここで間違ってやっている私が見カントは私のメッセージですキャッチされない例外「PDOException」私はPDOに非常に新しいですプリペアドステートメント

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in C:\xampp\htdocs\Final\include\addbloguser.php:66 Stack trace: #0 C:\xampp\htdocs\Final\include\addbloguser.php(66): PDOStatement->execute() #1 C:\xampp\htdocs\Final\blogcp.php(49): require('C:\xampp\htdocs...') #2 {main} thrown in C:\xampp\htdocs\Final\include\addbloguser.php on line 66

これはコードです。私は間違いを多くしたと確信しています。時間があれば、私が間違っていたこととそれを修正する方法を私に説明できますか?

<?php 


try { 


require SITE_ROOT . '\include\db_connect.php'; 

} 
catch(PDOException $e) 
{ 
echo $e->getMessage(); 
} 


$name = $_POST['fname']; 
$lname = $_POST['lname']; 
$username = $_POST['username']; 
$state = "basic"; 
$email = $_POST['email']; 
$password = $_POST['pass']; 
$password1 = $_POST['rpass']; 



//verifications 

//password 

if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){ 
    $error = "Complete all fields"; 
} 
if ($password != $password1){ 
    $error = "Passwords don't match"; 
} 

if (strlen($password) <= 6){ 
    $error = "Choose a password longer than 6 character"; 
} 


if(!isset($error)){ 
//no error 
$sthandler = $conn->prepare("SELECT username FROM blogusers WHERE username = :username"); 
$sthandler->bindParam(':username', $username); 
$sthandler->execute(); 

if($sthandler->rowCount() > 0){ 
    echo "exists! cannot insert"; 
} else { 
    //Securly insert into database 
    $sql = 'INSERT INTO blogusers (name , lname ,username, state , email, password) VALUES (:name,:lnane:,:username,:state,:email,:password)';  
    $stmt = $conn->prepare($sql); 
    $stmt->bindParam(':name',$name); 
    $stmt->bindParam(':lname',$lname); 
    $stmt->bindParam(':username',$username); 
    $stmt->bindParam(':state',$state); 
    $stmt->bindParam(':email',$email); 
    $stmt->bindParam(':password',$password); 
    $name = $_POST['fname']; 
$lname = $_POST['lname']; 
$username = $_POST['username']; 
$state = "basic"; 
$email = $_POST['email']; 
$password = $_POST['pass']; 
    $stmt->execute(); 
    } 
}else{ 
    echo "error occured: ".$error; 
    exit(); 
} 

?> 
+0

それは1 => 2つのタイプミス 'です:lnane:(一つのことについて)'と、そのような –

+1

としてクローズ**プレーンテキストのパスワードを保存しないでください**パスワードのセキュリティを処理するには、PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使用してください。 5.5より小さいPHPバージョンを使用している場合、 'password_hash()' [互換パック](https://github.com/ircmaxell/password_compat)を使用することができます。ハッシュする前に[パスワードを逃さないでください](http://stackoverflow.com/q/36628418/1011527)、または他のクレンジングメカニズムを使用していることを確認してください。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

+0

ユーザーが望む[passwords/phrases](https://xkcd.com/936/)を使用できるようにします。 [パスワードを制限しないでください](http://jayblanchard.net/security_fail_passwords.html) –

答えて

1

あなたの挿入は:lnane:を使用している、とあなたは:lnameを結合しています。

$sql = 'INSERT INTO blogusers (name , lname ,username, state , email, password) 
    VALUES (:name,:lnane:,:username,:state,:email,:password)';  

修正行は次のようになります。

$sql = 'INSERT INTO blogusers (name , lname ,username, state , email, password) 
    VALUES (:name,:lname,:username,:state,:email,:password)';  
+0

私はそれを逃しました...しかし、あなたも何かを見逃しました。 –

+0

"は" ...あなたはこれを説明する必要があります。 –

+0

私はしましたが、私はラインで私の答えを編集している間にそれを見ました。 :-D – aynber

関連する問題