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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 259

Okky

score 5

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[リンク内容](PHP)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2019/05/01 19:27

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

    キャンセル

  • m.ts10806

    2019/05/01 20:59

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

    キャンセル

  • m.ts10806

    2019/05/02 16:07

    https://teratail.com/help#about-markdown
    >コードを入力

    キャンセル

回答 1

checkベストアンサー

+3

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に出力しようとするとふつうに出力できない文字を
ふつうに見えるように文字列を加工してしまうものです。
例えば「&」を出力できるように「&amp;」と
「"」を出力できるように「&quot;」と書き換えてしまいます。
もしも$staff_name文字列に&を許容したとして、
データベースに&を含む人だぁれってクエリー組むときに
&amp;にも&quot;にも反応すると面倒になります。
データベースには加工前の正しいデータを保存することを守りましょう。
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/02 17: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 17:42 編集

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

    キャンセル

  • 2019/05/02 17:56

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

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る