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

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

ただいまの
回答率

88.92%

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

解決済

回答 1

投稿 編集

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

TOM1234

score 2

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2020/09/15 22:20

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

    キャンセル

  • TOM1234

    2020/09/15 22:41 編集

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

    キャンセル

  • m.ts10806

    2020/09/16 06:58

    コードやエラーはマークダウンのcode機能を利用してご提示ください。
    https://teratail.com/questions/238564

    キャンセル

  • TOM1234

    2020/09/16 20:14

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

    キャンセル

回答 1

checkベストアンサー

+2

$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文をプリペアドステートメントで与えるようにします。

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

$stmt = $dbh->prepare($sql);
$stmt->bindValue(':gender', $gender, PDO::PARAM_STR);
$stmt->bindValue(':age', $age, PDO::PARAM_STR);
$stmt->bindValue(':job', $job, PDO::PARAM_STR);
$stmt->bindValue(':kind', $kind, PDO::PARAM_STR);
$stmt->bindValue(':shots', $shots, PDO::PARAM_STR);
$stmt->execute();

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

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

あと、

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


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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/15 22:45

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

    キャンセル

  • 2020/09/15 23:25

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

    キャンセル

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

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

関連した質問

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

  • トップ
  • PHPに関する質問
  • phpMyAdminを用いてmysqlでデータを受け取ろうとしたところ「返り値が空でした (行数 0)」となってしまう