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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

813閲覧

一言掲示板に入力された値をデータベースで管理する方法について(解決済み)

newyee

総合スコア213

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2017/07/13 08:38

編集2017/07/13 09:02

こちらの問題なのですが、自分でエラーを修正することができ、問題を解決することができました。
単純なテーブル名のミスでした。。。
お騒がせしました。

一言掲示板にて、利用者の過去の発言内容をデータベースに格納し表示するプログラムを作っているのですが、エラーが出てしまってうまくいきません...
実際に自分が作成したコードはこちらです。

PHP

1<?php 2date_default_timezone_set('Asia/Tokyo'); 3$date = date("Y-m-d H:i:s"); 4$errors = array(); 5$host = 'localhost'; 6$db_username = 'newyee'; 7$passwd = ''; 8$dbname = 'c9'; 9$link = mysqli_connect($host,$db_username,$passwd,$dbname); 10 11if($link !== FALSE){ 12 mysqli_set_charset($link, 'utf8'); 13 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 14 15 if(isset($_POST['user_name']) === TRUE){ 16 $user_name = trim(mb_convert_kana($_POST['user_name'],"s",'UTF-8')); 17 } 18 19 if(isset($_POST['user_comment']) === TRUE){ 20 $user_comment = trim(mb_convert_kana($_POST['user_comment'],"s",'UTF-8')); 21 } 22 23 if(mb_strlen($user_name) > 20){ 24 $errors[] = '名前は20文字以内で入力してください'; 25 }elseif(mb_strlen($user_name) === 0){ 26 $errors[] = '名前を入力してください'; 27 } 28 if(mb_strlen($user_comment) > 100){ 29 $errors = 'ひとことは100文字以内で入力してください'; 30 }elseif(mb_strlen($user_comment) === 0){ 31 $errors[] = 'ひとことを入力してください'; 32 } 33 } 34 if(empty($errors) === TRUE){ 35 $query = 'INSERT INTO Bulletin_bord(user_name,user_comment,date) 36 VALUES(\'' . $user_name . '\',\'' . $user_comment . '\',\'' . $date . '\')'; 37 $result = mysqli_query($link,$query); 38 if($result === FALSE){ 39 $errors[] = '登録に失敗しました'; 40 } 41 } 42 $data = array(); 43 $query = 'SELECT user_name,user_comment,date FROM Bulletin_bord'; 44 $result = mysqli_query($link,$query); 45 46 while($row = mysqli_fetch_array($result)){ 47 $data[] = $row; 48 } 49 50} 51?> 52<!DOCTYPE html> 53<html lang="ja"> 54<head> 55 <meta charset="UTF-8"> 56 <title></title> 57</head> 58<body> 59 <h1>一言掲示板</h1> 60 <form method="post"> 61 <p>名前 : 62 <input type="text" name="user_name"> 63 ひとこと : 64 <input type="text" name="user_comment"> 65 <input type="submit" value="送信"> 66 </p> 67 </form> 68 <?php foreach ($errors as $value){ ?> 69 <p><?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p> 70 <?php } ?> 71 72 <ul> 73 <?php foreach ($data as $value) { ?> 74 <li> 75 <?php echo htmlspecialchars($value['user_name'],ENT_QUOTES,'UTF-8'); ?> 76 <?php echo htmlspecialchars($value['user_comment'],ENT_QUOTES,'UTF-8'); ?> 77 <?php echo htmlspecialchars($value['date'],ENT_QUOTES,'UTF-8'); ?> 78 </li> 79 <?php } ?> 80 </ul> 81</body> 82</html> 83 84

データベースはphpmyadminを使っております。

以下の画像は実際に自分が作成した、テーブルになります。
テーブル名はBulletin_bordです。

イメージ説明

エラーの内容は以下の通りです。
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/ubuntu/workspace/review/lesson16/practice_bbs_db_intermediate.php on line 46 Call Stack: 0.0032 236672 1. {main}() /home/ubuntu/workspace/review/lesson16/practice_bbs_db_intermediate.php:0 0.0168 246696 2. mysqli_fetch_array() /home/ubuntu/workspace/review/lesson16/practice_bbs_db_intermediate.php:46

どなたか分かる方いましたら、ご教授願います...

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

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

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

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

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

_Victorique__

2017/07/13 08:57

タイトルは元に戻しておきましょう。後の人が見て分かりません。
newyee

2017/07/13 08:58

了解しました。ご指摘ありがとうございます!
guest

回答1

0

ベストアンサー

自己解決したようですがいくつかコメントです。

1つめ。投稿処理(INSERT)が if ($_SERVER['REQUEST_METHOD'] === 'POST') の外にあるため、アクセスするたびに空の投稿が記録されてしまいます。if (empty($errors) === true){ ... } を最初の if 文の中にいれましょう。

2つめ。このコードは SQLインジェクション と呼ばれるセキュリティ上の問題(脆弱性)が含まれています。公式ドキュメント: PHP: mysqli::prepare - Manual を参考にプリペアドステートメントをぜひ使ってください。このままでは非常に危険です。

もっと言うと、CSRF (クロスサイトリクエストフォージェリ)という攻撃も出来てしまう問題があるのですが、このへんは追々学んでいけばよいと思います。

3つめ。これは好みの話ですが、foreach のブロックが分断されていると見づらい(いきなり } が出てきても何を閉じているのか判りづらい)ので、foreach / endforeach に書き換えると見やすくなる気がします。

また細かい話ですが <?php echo $hoge; ?><?= $hoge ?> に置き換えられます。

php

1<?php foreach ($data as $value) { ?> 2 <li> 3 <?php echo htmlspecialchars($value['user_name'], ENT_QUOTES, 'UTF-8'); ?> 4 <?php echo htmlspecialchars($value['user_comment'], ENT_QUOTES, 'UTF-8'); ?> 5 <?php echo htmlspecialchars($value['date'], ENT_QUOTES, 'UTF-8'); ?> 6 </li> 7<?php } ?> 8 910 11<?php foreach ($data as $value): ?> 12 <li> 13 <?= htmlspecialchars($value['user_name'], ENT_QUOTES, 'UTF-8') ?> 14 <?= htmlspecialchars($value['user_comment'], ENT_QUOTES, 'UTF-8') ?> 15 <?= htmlspecialchars($value['date'], ENT_QUOTES, 'UTF-8') ?> 16 </li> 17<?php endforeach; ?>

処理部分(PHPのコード)とHTML表示部分を分けて書かれていて見やすいコードでした。がんばってください。

投稿2017/07/13 09:18

編集2017/07/13 09:39
miyahan

総合スコア3095

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

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

newyee

2017/07/13 10:34

大変ご丁寧にありがとうございます。 1つ目のご指摘なんですが、エラーを自己解決できた後に、更新するたびに日付だけが出力されてしまい困っていたので助かりました... 2つ目のご指摘に関しましては、勉強を進めていく内に学んでいけたらなと思っております! 3つ目に関しても、知らなかったし、分かりやすい書き方だと思うので今後試し試し、使っていけたらなと思っています! <?php echo $hoge; ?> を <?= $hoge ?>に置き換える方法も便利だなと思いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問