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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

HTML

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

Q&A

解決済

1回答

1849閲覧

phpMyAdminを用いてmysqlでデータを受け取ろうとしたところ「返り値が空でした (行数 0)」となってしまう

TOMZ12

総合スコア2

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

HTML

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

0グッド

0クリップ

投稿2020/09/15 11:19

編集2020/09/16 11:13

前提・実現したいこと

PHPを用いたアンケートシステムを作っています。
phpMyAdminを用いてmysqlにデータベースを作成し、アンケートの結果を受け取ろうとしたところ、「返り値が空でした (行数 0)」となってしまい受け取ることができません。

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

返り値が空でした (行数 0) SELECT * FROM `num_of_shots`

該当のソースコード

・HTML部分 <!DOCTYPE html> <HTML lang="ja"> <HEAD> <TITLE>デジカメアンケート</TITLE> <META http-equiv="Content-Type" content="text/html; charset=utf-8" /> </HEAD> <BODY> <H2>データベースの扱い(回答確認)</H2> <H3>デジカメに関するアンケート</H3> <form method="POST" action="sample2.php"> <label>性別:</label> <input type="radio" name="gender" value="男"checked>男 <input type="radio" name="gender" value="女">女<br/> <label>年代:</label> <select name="age"> <option value="10代">10代</option> <option value="20代">20代</option> <option value="30代">30代</option> <option value="40代">40代</option> <option value="50代">50代</option> <option value="60代">60代</option> <option value="70歳以上">70歳以上</option> </select> <br/> <label>職業:</label> <select name="job"> <option value="学生">学生</option> <option value="会社員">会社員</option> <option value="公務員">公務員</option> <option value="自営業">自営業</option> <option value="自由業">自由業</option> <option value="アルバイト">パート・アルバイト</option> <option value="その他">その他</option> </select><br/> <label>カメラの種類</label> <select name="kind"> <option value="一眼レフ">一眼レフ</option> <option value="ミラーレンズ">ミラーレンズ</option> <option value="コンパクト">コンパクト</option> <option value="携帯・スマホ" selected>携帯・スマホ</option> <option value="その他">その他</option> </select><br/> <label>一週間の撮影枚数:</label> およそ<input type="text" size="4" name="shots">コマ程度 <br/><br/> <label>ボタンを押して内容をご確認ください。</label><br/> <input type="submit" value='回答内容を確認'> <input type="reset" value="取り消し"> </form> </BODY> </HTML> ・PHPデータ受け取り部分 <!DOCTYPE html> <HTML lang="ja"> <HEAD> <TITLE>デジカメアンケート</TITLE> <META http-equiv="Content-Type" content="text/html; charset=utf-8" /> </HEAD> <BODY> <H2>データベースの扱い(回答確認)</H2> <H3>デジカメに関するアンケート</H3> <?php if(($_POST['shots']=='')||(!isset($_POST['shots']))){ echo "<p>データが未入力です。<br/>入力画面に戻ってください。</p>"; }else{ $gender=$_POST['gender']; $age=$_POST['age']; $job=$_POST['job']; $kind=$_POST['kind']; $shots=$_POST['shots']; echo'<h2>ご回答内容</h2>'; echo'性別:'.$gender.'<br/>'; echo'年代:'.$age.'<br/>'; echo '職業 : '.$job.'<BR />'; echo 'カメラ種類 : '. $kind.'<BR />'; echo '撮影枚数 : '.$shots. 'コマ程度<BR />'; echo '<BR />'; echo'<form method="POST" action="thanks.php">' ; echo'<input name="gender" type="hidden" value="'.$gender.'">'; echo'<input name="age" type="hidden" value="'.$age.'">'; echo'<input name="job" type="hidden" value="'.$job.'">'; echo'<input name="kind" type="hidden" value="'.$kind.'">'; echo'<input name="shots" type="hidden" value="'.$shots.'">'; echo'<p>上記の内容でよろしければ、[書込]を押してください。</p>'; echo '<input type="submit" value="書込">'; echo '&nbsp;'; echo '</form>'; } echo '<form>'; echo '<input type=button onclick="history.back()" value="戻る">'; echo '</form>'; ?> </BODY> </HTML> ・PHPデータ書き込み部分 <!DOCTYPE html> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLe>example10-2</TITLE> </HEAD> <BODY> <H2>データベースの扱い(書き込み)</H2> <H3>デジカメに関するアンケート</H3> <?php try{ $dsn='mysql:host=localhost;dbname=digicam_q;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $gender=$_POST['gender']; $age=$_POST['age']; $job=$_POST['job']; $kind=$_POST['kind']; $shots=$_POST['shots']; echo 'ご回答ありがとうございました。<br/>'; $sql='INSERT INTO num_of_shots(性別,年代,職業,種類,撮影枚数) VALUES("'.$gender.'","'.$age.'","' .$job.'","'.$kind.'",'.$shots.');'; $stmt=$dbh->prepare($sql); $stmt->execute(); }catch(PDOException $e){ echo '障害によりご迷惑をおかけしています。<BR />'; echo 'エラーの内容 : '. mb_convert_encoding($e->getMessage(), "UTF-8", "SJIS"); echo $e->getCode(); } $dbh=null; ?> </BODY> </HTML>
HTML、PHP

試したこと

Chromeの検索履歴やキャッシュの消去を行いましたが改善しませんでした。
イメージ説明

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/15 13:20

phpMyAdminはwebブラウザからmysql/mariadbのデータベースを管理操作するためのソフトウェアのことであって、データベースの名称としてはmysqlもしくはmariadbということになります。用語の使い方を誤るとアドバイスが得られにくくなるためご注意ください。
TOMZ12

2020/09/15 13:55 編集

ご指摘ありがとうございます。 「phpMyAdminを用いてmysqlにデータベースを作成」に修正させていただきました。
TOMZ12

2020/09/16 11:14

ご指摘ありがとうございます。 改善させていただきました。
guest

回答1

0

ベストアンサー

$dsn='mysql:host=localhost;bdname=digicam_q;charset=utf8';

$dsn='mysql:host=localhost;dbname=digicam_q;charset=utf8';
とか?

new PDO()するあたりでtry~catchせず、
データベースに接続が成功しているか検証せずに処理を進めていて、
INSERT INTO文だけtry~catchで囲むのは
エラー対策が甘いと言わざるを得ません。
今一度ご確認ください。

$sql='INSERT INTO num_of_shots(性別,年代,職業,種類,撮影枚数) VALUES("'.$gender.'","'.$age.'","' .$job.'","'.$kind.'",'.$shots.');';

これ、SQLインジェクション攻撃される、やってはいけないやり方になります。
SQL文をプリペアドステートメントで与えるようにします。

php

1$sql = <<<EOT 2INSERT INTO `num_of_shots`(`性別`,`年代`,`職業`,`種類`,`撮影枚数`) 3VALUES(:gender, :age, :job, :kind, :shots); 4EOT; 5 6$stmt = $dbh->prepare($sql); 7$stmt->bindValue(':gender', $gender, PDO::PARAM_STR); 8$stmt->bindValue(':age', $age, PDO::PARAM_STR); 9$stmt->bindValue(':job', $job, PDO::PARAM_STR); 10$stmt->bindValue(':kind', $kind, PDO::PARAM_STR); 11$stmt->bindValue(':shots', $shots, PDO::PARAM_STR); 12$stmt->execute();

などと机上のコードですが直してみました。
もちろん、テーブルの構造によっては、文字列でなく数値データであれば
PDO::PARAM_STRでなくPDO::PARAM_INTを使ったりします。

参考:
PHPでデータベースに接続するときのまとめ - Qiita

あと、

php

1if(($_POST['shots']=='')||(!isset($_POST['shots']))){ 2echo "<p>データが未入力です。<br/>入力画面に戻ってください。</p>"; 3}else{

の箇所もちょっと気になる。

php

1if ( (!isset($_POST['shots'])) || ($_POST['shots']=='') ) { 2 echo "<p>データが未入力です。<br/>入力画面に戻ってください。</p>"; 3} 4else {

isset()での評価を前に持ってくれば、
もしもPOST送信データにshotsが含まれていないときに
Notice: Undefined index
のエラーを回避できそう。

他のフォーム入力データも、データの存在チェックをしっかり厳しく行ってください。
面倒なら、
filter_input
を駆使したほうがいいです。

投稿2020/09/15 13:21

編集2020/09/15 14:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TOMZ12

2020/09/15 13:45

ご回答ありがとうございます。 ご指摘の通り誤字があり、修正させていただきました。 ですが以前「返り値が空でした 」と表示されてしまいました。
TOMZ12

2020/09/15 14:25

とても詳しく説明していただきありがとうございます。 ご指摘いただいたことを参考に修正させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問