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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

3回答

3443閲覧

[php]フォームから渡された値を疑問符プレースホルダで直接execute内でバインドさせると失敗する。

kalon

総合スコア198

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2016/10/20 07:00

編集2016/10/20 08:30

皆様、いつもお世話になっております。

このようなテーブルがありまして、フォームで入力すると?プレースホルダにフォームから渡された値がバインドされて、mysqlのテーブルに新しい行が挿入されるようにしたいのです。

テーブル

php

1こちらの方法でフォームを使わず変数に直接値を挿入すると、INSERT INTOに成功します。 2 3<?php 4 5define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); 6define('DB_USER', 'C9_USER'); 7define('DB_PASSWORD', ''); 8 9try{ 10 11 $company_name = '株式会社どこか'; 12 $assigned_person = 'たなか'; 13 $website = 'website.com'; 14 $phone = '09098787867'; 15 $email = 'email@email.com'; 16 $password = '12345'; 17 18 $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); 19 /*c_numberとidは別処理でインクリメントさせるよていなので手動で入力、ここではわざとc_number=CP4とid=4で固定しています。*/ 20 $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP4", "4", ?, ?, ?, ?, ?, ?)'); 21 $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); 22 23 echo '企業名:'.$company_name.'</br>'; 24 echo '担当者:'.$assigned_person.'</br>'; 25 echo 'ウェブサイト:'.$website.'</br>'; 26 echo '電話番号:'.$phone.'</br>'; 27 echo 'メール'.$email.'</br>'; 28 echo 'パスワード:'.$password.'</br>'; 29 30 echo "登録しました"; 31 } catch (PDOException $e) { 32 print('Error:'.$e->getMessage()); 33 echo "エラーが起きました"; 34 die(); 35 }

上記の方法ではinsert intoに成功します。

しかし、formを使った以下のphp側で受け取った値をexecute()内に与えてバインドさせる方法ですと、新しい行の挿入に失敗するのですが、原因が分かりません。

formからの値をバインドさせるこちらの方法だと失敗します・・・。 <?php define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); define('DB_USER', 'C9_USER'); define('DB_PASSWORD', ''); try{ $company_name = $_POST['cName']; $assigned_person = $_POST['tanto']; $website = $_POST['website']; $phone = $_POST['tel']; $email = $_POST['email']; $password = $_POST['password']; $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); /*c_numberとidは別処理でインクリメントさせるよていなので手動で入力、ここではわざとc_number=CP4とid=4で固定しています。*/ $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP4", "4", ?, ?, ?, ?, ?, ?)'); $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); echo '企業名:'.$company_name.'</br>'; echo '担当者:'.$assigned_person.'</br>'; echo 'ウェブサイト:'.$website.'</br>'; echo '電話番号:'.$phone.'</br>'; echo 'メール'.$email.'</br>'; echo 'パスワード:'.$password.'</br>'; echo "登録しました"; } catch (PDOException $e) { print('Error:'.$e->getMessage()); echo "エラーが起きました"; die(); } ?> <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <div> <label for="cName">企業名</label> <input type="text" id="cName" name="cName"/> </div> <div> <label for="tanto">担当者の名前</label> <input type="text" id="tanto" name="tanto"/> </div> <div> <label for="website">企業のウェブサイト</label> <input type="text" id="website" name="website"/> </div> <div> <label for="tel">電話番号</label> <input type="tel" id="tel" name="tel"/> </div> <div> <label for="password">パスワード</label> <input type="password" id="password" name="password"/> </div> <div> <label for="email">メールアドレス</label> <input type="email" id="email" name="email"/> </div> <input type="submit" value="登録"/> </form> </body> </html>

どのようにしたら、formで入力した値がsqlの疑問符プレースホルダにバインドされるのでしょうか?
アドバイスとご指導のほどよろしくお願いします。

皆様のご意見を基に、次のようなコードにしたら私の望んでいる結果を出力できるようになりました。

<?php define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); define('DB_USER', 'C9_USER'); define('DB_PASSWORD', ''); if (!empty($_POST)) { try{ $company_name = filter_input( INPUT_POST, "cName"); $assigned_person = filter_input( INPUT_POST, "tanto"); $website = filter_input( INPUT_POST, "website"); $phone = filter_input( INPUT_POST, "tel"); $email = filter_input( INPUT_POST, "email"); $password = filter_input( INPUT_POST, "password"); $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); /*c_numberとidは別処理でインクリメントさせる予定なので、ここではわざとc_number=CP6とid=6で固定しています。*/ $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP6", "6", ?, ?, ?, ?, ?, ?)'); //疑問符プレースホルダへ挿入したい場合は、execute()の()内に変数を入れるだけで自動的にバインドされる。 $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); echo '企業名:'.$company_name.'</br>'; echo '担当者:'.$assigned_person.'</br>'; echo 'ウェブサイト:'.$website.'</br>'; echo '電話番号:'.$phone.'</br>'; echo 'メール'.$email.'</br>'; echo 'パスワード:'.$password.'</br>'; $company_name = ""; $assigned_person = ""; $website = ""; $phone = ""; $email = ""; $password = ""; echo "登録しました"; } catch (PDOException $e) { print('Error:'.$e->getMessage()); echo "エラーが起きました"; echo $e->getMessage(); die(); } } ?> <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <div> <label for="cName">企業名</label> <input type="text" id="cName" name="cName"/> </div> <div> <label for="tanto">担当者の名前</label> <input type="text" id="tanto" name="tanto"/> </div> <div> <label for="website">企業のウェブサイト</label> <input type="text" id="website" name="website"/> </div> <div> <label for="tel">電話番号</label> <input type="tel" id="tel" name="tel"/> </div> <div> <label for="password">パスワード</label> <input type="password" id="password" name="password"/> </div> <div> <label for="email">メールアドレス</label> <input type="email" id="email" name="email"/> </div> <input type="submit" value="登録"/> </form> </body> </html>

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

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

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

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

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

A.Ichi

2016/10/20 07:50

上段の成功例も $dbh = new PDO(DSN, ・・・の行は有るのですよね?
kalon

2016/10/20 07:54

失礼しました。例題として編集している間に消してしまっていたようです。ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2016/10/20 08:33

で、BAついてはいるけど、結局何が原因だったのだろう?
guest

回答3

0

c_numberは固定で"CP4"を入れてますが、既に同じ値のレコードがあるとかいうオチではないですよね?
毎回削除するか値を変更してからテストしてますよね?

投稿2016/10/20 08:18

ttyp03

総合スコア16998

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

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

kalon

2016/10/20 08:21

ご指摘ありがとうございます。毎度c_numberの値を変更しておりました。
ttyp03

2016/10/20 08:24

ですよねぇ。 あと考えられそうなのは、$_POSTが正常に取得できていると想定した場合、文字コードが統一されていないとかでしょうかね。 それでエラーになるかはわかりませんが…。
guest

0

例外をちゃんとスローしていない可能性があるので、
確認するために、
new PDOする時の4番目の引数に、
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
ってのを加えてみてください。
データベースへの接続に失敗したときに例外をスローするようになります。

参考:PHP・PDO、SQL実行時のエラーをExceptionで捕捉する|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~
http://piyopiyocs.blog115.fc2.com/blog-entry-657.html

投稿2016/10/20 08:02

編集2016/10/20 08:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

$e->getMessage()
の戻り値はどのようなエラーなのでしょうか?

とりあえず、POSTデータのバリデートもかねてfilter_inputをするところからでしょうか

PHP

1$company_name = input_filter(INPUT_POST,'cName'); 2$assigned_person = input_filter(INPUT_POST,'tanto'); 3$website = input_filter(INPUT_POST,'website'); 4$phone = input_filter(INPUT_POST,'tel'); 5$email = input_filter(INPUT_POST,'email'); 6$password = input_filter(INPUT_POST,'password'); 7

投稿2016/10/20 07:15

yambejp

総合スコア114829

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

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

kalon

2016/10/20 07:52

ご回答ありがとうございます。 Exceptionの中でecho $e->getMessage();をしても、エラーメッセージが表示されません。
yambejp

2016/10/20 07:57

$dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); の直下に、 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); を書いて、エラーが拾えるようにしてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問