質問: null; print $staff_name; print 'さんを追加しました。'; ### 試したこと myAdminから直接 INSERT INTO mst_staff(name,password) VALUES("***","***") と入力した場合はデータベースにデータが入りました。 ### 補足情報(FW/ツールのバージョンなど) 現在XAMPP vr.3.2.3 phpMyadmin vr.4.8.5のローカルホストで練習中です。 よろしくお願いいたします。m(__)mリンク内容
回答: 26行目付近に、未定義の変数 data を参照しているよ、というエラーメッセージです。 `$stmt->execute($data);` これですね。 せめて、`$stmt->execute([$staff_name, $staff_pass]);`とします。 「Notice: Undefined variable」の箇所だけでもネット検索すれば解説ページが見つかるはずですが。 `$sql = "INSERT INTO mst_staff (name, password) VALUES ( :$staff_name, :$staff_pass)";` 全角空白入れてると動かないよ。 `$sql = "INSERT INTO mst_staff (name, password) VALUES ( :staff_name, :staff_pass)";` プレースホルダに`$`はつけない。 PHPのエラー表示設定について - Qiita を参考に、 phpコードの冒頭に ``` ini_set('display_errors', "On"); ini_set('error_reporting', E_ALL); ``` を書いておくと、 通常エラーメッセージがwebサーバープログラム(Apache httpd)のerror_logに出力されるだけなのを、 webブラウザ上に出力するように変更できます。 老婆心ながら、 ``` $staff_name = htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8'); $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); ``` html出力用に加工したものをデータベースに保存するのはやめましょう。 htmlspecialchars()は 通常HTMLに出力しようとするとふつうに出力できない文字を ふつうに見えるように文字列を加工してしまうものです。 例えば「&」を出力できるように「&」と 「"」を出力できるように「"」と書き換えてしまいます。 もしも$staff_name文字列に&を許容したとして、 データベースに&を含む人だぁれってクエリー組むときに &にも"にも反応すると面倒になります。 データベースには加工前の正しいデータを保存することを守りましょう。 HTML出力したい場合は出力直前にHTML用に出力するのみで、 変数で加工後の文字列を保持しないほうが良いです。 参考:PHP で h() を書くなら一緒に echo しよう。 - こせきの技術日記 老婆心でもう一つ。 データベースアクセスの一連の流れは、 PHPでデータベースに接続するときのまとめ - Qiita ここにエッセンスが詰め込まれているので真似すると良いよ。 ・スマホ相手に絵文字を扱うかもしれないときは、utf8mb4を使う。 ・new PDO()するときに、もうdriver_optionsを与えてエラー発生時に例外を発生させるようにしつつ、一連のDB処理をtry~catchで括る。 ・PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する。bindValue()使えば、データ型の指定ができるし。