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

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

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

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

Q&A

解決済

1回答

376閲覧

PHPプログラムからmyAdminへの入力に関して

Okky

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/05/01 10:25

編集2019/05/02 07:04

PHPの初心者でHPの作成を目指して学習中のものです。

ある本を参考に学習を進めているのですがphpのプログラムからmyAdminへの接続が始まった部分から参考書の通りに行かなくなりました。

発生している問題・エラーメッセージ

Notice: Undefined variable: data in C:\xampp\htdocs\nomugibus\staff_add_done.php on line 26

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\nomugibus\staff_add_done.php:26 Stack trace: #0 C:\xampp\htdocs\nomugibus\staff_add_done.php(26): PDOStatement->execute(NULL) #1 {main} thrown in C:\xampp\htdocs\nomugibus\staff_add_done.php on line 26

該当のソースコード

$staff_name = $_POST['name']; $staff_pass = $_POST['pass']; $staff_name = htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8'); $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8'; $user = "root"; $password = ""; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO mst_staff (name, password) VALUES ( :$staff_name, :$staff_pass)"; $stmt = $dbh->prepare($sql); $stmt->execute($data); $dbh = null; print $staff_name; print 'さんを追加しました。<br/>';

試したこと

myAdminから直接
INSERT INTO mst_staff(name,password) VALUES("***","***")
と入力した場合はデータベースにデータが入りました。

補足情報(FW/ツールのバージョンなど)

現在XAMPP vr.3.2.3 phpMyadmin vr.4.8.5のローカルホストで練習中です。

よろしくお願いいたします。m(__)mリンク内容

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/05/01 10:27

MySQL(MariaDB)がデータベースソフト、phpMyAdminがwebブラウザ経由で利用するデータベース管理ソフトです。名称が混乱していませんか? ちなみにXAMPPなのでXが一つ多いです。
m.ts10806

2019/05/01 11:59

コードはマークダウンのcode機能を利用してご提示ください
guest

回答1

0

ベストアンサー

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コードの冒頭に

php

1ini_set('display_errors', "On"); 2ini_set('error_reporting', E_ALL);

を書いておくと、
通常エラーメッセージがwebサーバープログラム(Apache httpd)のerror_logに出力されるだけなのを、
webブラウザ上に出力するように変更できます。

老婆心ながら、

php

1$staff_name = htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8'); 2$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()使えば、データ型の指定ができるし。

投稿2019/05/01 10:37

編集2019/05/01 11:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Okky

2019/05/02 07:09

ありがとうございます。 指摘していただいた点を修正して再度取り組みましたが Parse error: syntax error, unexpected '$staff_name' (T_VARIABLE) in C:\xampp\htdocs\nomugibus\staff_add_done.php on line 13 と表示されまだ解消しておりません。 ちなみに line 13は以下のコードになります。    $staff_name = $_POST['name']; $staff_pass = $_POST['pass']; もしかしたらサーバーの言語設定で何か問題が起きているのかもと思っています。 参考にしている本はリックテレコムの気づけばプロ並みPHP改訂版です。
退会済みユーザー

退会済みユーザー

2019/05/02 07:18 編集

$staff_name = $_POST['name']; の直前、文末の「;」を忘れていたりしませんか。 かっこの閉じ忘れなどありませんか。 あるいは前後に全角空白があったりしませんか。
Okky

2019/05/02 08:21

コメントありがとうございます。 この前段階のプログラムは問題なく動いており、そのページから$staff_name 変数への入力部分をコピペしてトライしてみましたが同じ状況でした。
退会済みユーザー

退会済みユーザー

2019/05/02 08:25

もとのphpコードを残したまま、質問文中に現在のコードを追加できませんか。 現状を見てみないとなんとも言えません。
Okky

2019/05/02 08:30

ありがとうございます。 いかにコードを追加させてもらいます。 <?php ini_set('display_errors', "on"); ini_set('error_reporting',E_ALL) $staff_name = $_POST['name']; $staff_pass = $_POST['pass']; $staff_name = htmlspecialchars($staff_name,ENT_QUOTES,' UTF-8'); $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,' UTF-8'); $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8'; $user = "root"; $password = ""; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql = 'INSERT INTO mst_staff (name, password) VALUES (?,?)'; $stmt = $dbh->prepare($sql); $data[] = $staff_name; $data[] = $staff_pass; $stmt->execute($data); $dbh = null; print $staff_name; print 'さんを追加しました。<br/>'; ?>
退会済みユーザー

退会済みユーザー

2019/05/02 08:43 編集

ini_set('error_reporting',E_ALL) の文末、よく見ること。16:16のコメントのとおりでしたね。
Okky

2019/05/02 08:56

ありがとうございました! 無事に動くようになりました! 昨日からなんともならず苦労していたので本当に助かりました。 何度もの丁寧なアドバイス本当にありがとうございました。m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問