質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

441閲覧

バインドされたパラメータ

aoihello

総合スコア31

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2022/09/02 09:07

編集2022/09/03 06:48

前提

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を同じファイルに書いています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/09/02 10:08

テーブル定義をCREATE TABLE文で提示してください。 あと、実際に入力した値をコピペで提示してください。
m.ts10806

2022/09/02 10:26

あとたぶん、本来はExceptionに落ちているはずが、設定されてないのでそちらで出てないのだと思います。 以下参考に接続時の設定をしてください。$driver_optionsの項 https://qiita.com/mpyw/items/b00b72c5c95aac573b71
aoihello

2022/09/02 11:56

ご回答誠にありがとうございます。 修正した部分としてdrive_optionsを追加いたしましたところ、無事ログインができるようになりました。誠にありがとうございます。 もし、m.ts10806様が宜しければ、ご回答の方で再度driver_optionsについての文をお送りしていただきたいと存じます。 よろしくお願いいたします。
m.ts10806

2022/09/02 12:45

こちらは回答ではなく質問への追記修正依頼のコメント欄です。 手元で再現したく、追記修正依頼をしました。 $driver_optionsの件も出ていたエラーと関係ないです。 もしかして提示のコードは修正して保存前に実行したりしてませんか? あと、質問者自身でも回答投稿して自己解決の形をとれます。 結局何をどうしたか、そのコードは質問者自身しか知らないので、 ご自身で回答として顛末を書かれたほうが良いと思います。
aoihello

2022/09/02 16:01 編集

かしこまりました。 また、この先ほどできるようになったと申し上げたのですが、自分の確認不足でした。 最後に登録した値が出力されているだけで、以前に登録した値で、ログインしようとすると最後の値が返されていました。 ですので、またご教授いただけると幸いです。 テーブルの定義を記載します。 No. 名前  タイプ  称号順序  初期値 1 name var(10) utf null 2 nickanme var(20) utf null 3 password int(30) utf null 4 comment var(150) utf null です。 プログラムで修正した部分は、new PDOの後の2行分だけです。 既にデータに登録されている値を入力すると、最後に登録されたログイン情報で、ログインします。 登録されていない値ですと、なんのエラーメッセージもなしになんのページ移動もしません。 ログインはnicknameとpasswordだけで処理を行なっていて、入力した値は nicknameは、aoi passwordは、1234にしています。 よろしくお願いいたします。
m.ts10806

2022/09/02 20:50

テーブル定義はCREATE TABLE文で提示してください。 SQLです。 どのように環境を作ったか分からないですが、ツールで作ったとしても裏側ではそのテーブルを作るSQLが実行されています。ツールからエクスポートできるはずなのでご確認を。
aoihello

2022/09/03 06:26

反応が遅くなり申し訳ありません。 よろしくお願いいたします。 CREATE TABLE `Info` ( `name` varchar(10) DEFAULT NULL, `nickname` varchar(20) DEFAULT NULL, `password` int(30) DEFAULT NULL, `comment` varchar(150) DEFAULT NULL, `posting` varchar(400) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
m.ts10806

2022/09/03 06:30

質問本文に追加を。
guest

回答1

0

自己解決

m.ts10806様、誠にありがとうございます。

質問後に書き換えながらデバッグをしている中で、修正しているのに同じバグが出続けるということがありました。それは時間を置いてから再実行することで解消されました。ですので、修正依頼にあるように下記のコードを書き忘れた事が実際のエラーの原因ではない?かと思われます。が解決したため、報告いたします。

php

1$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 2$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

しかし、上記のコードではログイン機能としては意味をなしていなかったので、下記のように書き換えました。

php

1<?php 2$err_msg=""; 3session_start(); 4if(isset($_POST['login'])){ 5 $nickname = $_POST['nickname']; 6 $password = $_POST['password']; 7 try { 8 $db = new PDO('mysql:host=------------------'); 9 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 10 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 11 $sql = 'SELECT name, nickname, password, comment FROM Info where nickname = :nickname AND password = :password'; 12 $stmt = $db->prepare($sql); 13 $stmt->bindValue(':nickname', $nickname, PDO::PARAM_STR); 14 $stmt->bindValue(':password', $password, PDO::PARAM_STR); 15 $stmt->execute(); 16 $result = $stmt->fetch(); 17 $stmt = null; 18 $db = null; 19 if(!empty($result)){ 20 $_SESSION['name'] = $result['name']; 21 $_SESSION['nickname'] = $result['nickname']; 22 $_SESSION['comment'] = $result['comment']; 23 header('Location:https://------------------'); 24 exit(); 25 }else{ $err_msg = "アカウント情報が間違っています。";} 26 }catch (PDOExeption $e) { 27 echo "値が入力されていません。\n"; 28 echo $e->getMessage(); 29 exit(); 30 } 31} 32?> 33<!DOCTYPE html> 34<html lang="ja"> 35<body> 36 <h1>ログイン</h1> 37 <form action="" method="POST"> 38 ID:<input type="text" name="nickname"><br> 39 Password:<input type="password" name="password"><br> 40 自動ログイン:<input type="checkbox" name="auto" value="fales"><br> 41 <input type="hidden" name="csrf_token" value=""> 42 <input type="submit" value="login" name="login"> 43 <input type="reset" value="reset"> 44 <a href="---------------" class="fir-pro">初めてのログイン</a> 45 </form> 46</body> 47</html>

投稿2022/09/03 15:46

aoihello

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問