前提
login処理を行うプログラムを実装中に次にエラーが出ていて、以前出た際の解決方法で解決できず悩んでいます。
既にデータベースへは入力しているデータを登録してあります。
テーブル定義は次のようになっています。
php
1CREATE TABLE `Info` ( 2 `name` varchar(10) DEFAULT NULL, 3 `nickname` varchar(20) DEFAULT NULL, 4 `password` int(30) DEFAULT NULL, 5 `comment` varchar(150) DEFAULT NULL, 6 `posting` varchar(400) DEFAULT NULL 7) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
実現したいこと
既にデータベースに登録されているnicknameとpasswordのセットを見つけあったら、そのアカウントでログインという処理を行いたいです。
発生している問題・エラーメッセージ
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in --------- Stack trace: #0 --------: PDOStatement->execute() #1 {main} thrown in ------------------- on line 12
該当のソースコード
php
1<?php 2$err_msg=""; 3if(isset($_POST['login'])){ 4 $nickname = $_POST['nickname']; 5 $password = $_POST['password']; 6 try { 7 $db = new PDO('mysql:host=------------------'); 8 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 10 $sql = 'SELECT nickname, password FROM Info where nickname = :nickname AND password = :password'; 11 $stmt = $db->prepare($sql); 12 $stmt->bindValue(':nickname', $nickname, PDO::PARAM_STR); 13 $stmt->bindValue(':password', $password, PDO::PARAM_STR); 14 $stmt->execute(); 15 $result = $stmt->fetch(); 16 $stmt = null; 17 $db = null; 18 if(!empty($result)){ 19 header('Location:-------------------'); 20 exit(); 21 }else{ $err_msg = "アカウント情報が間違っています。";} 22 }catch (PDOExeption $e) { 23 echo "値が入力されていません。\n"; 24 echo $e->getMessage(); 25 exit(); 26 } 27} 28?> 29<!DOCTYPE html> 30<html lang="ja"> 31<body> 32 <h1>ログイン</h1> 33 <form action="" method="POST"> 34 ID:<input type="text" name="nickname"><br> 35 Password:<input type="password" name="password"><br> 36 自動ログイン:<input type="checkbox" name="auto" value="fales"><br> 37 <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, "UTF-8") ?>"> 38 <input type="submit" value="login" name="login"> 39 <input type="reset" value="reset"> 40 <a href="------------" class="fir-pro">初めてのログイン</a> 41 </form> 42</body> 43</html>
試したこと
初めbindValueを書いていなかったため、書き足しました。以前はbindvalueを書き足すことで改善されました。
補足情報(FW/ツールのバージョンなど)
当該の12行目はexecuteの部分です。
nicknameもpasswordも英数字のみが入力されています。
webpegeに関する部分は-----で隠しています。
htmlとphpを同じファイルに書いています。
回答1件
あなたの回答
tips
プレビュー