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

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

ただいまの
回答率

90.48%

  • PHP

    24503questions

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

  • phpMyAdmin

    806questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,050

newyee

score 145

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

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

<?php
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d H:i:s");
$errors = array();
$host = 'localhost';
$db_username = 'newyee';
$passwd = '';
$dbname = 'c9';
$link = mysqli_connect($host,$db_username,$passwd,$dbname);

if($link !== FALSE){
    mysqli_set_charset($link, 'utf8');
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {

        if(isset($_POST['user_name']) === TRUE){
            $user_name = trim(mb_convert_kana($_POST['user_name'],"s",'UTF-8'));
        }

        if(isset($_POST['user_comment']) === TRUE){
            $user_comment = trim(mb_convert_kana($_POST['user_comment'],"s",'UTF-8'));
        }    

        if(mb_strlen($user_name) > 20){
            $errors[] = '名前は20文字以内で入力してください';
        }elseif(mb_strlen($user_name) === 0){
            $errors[] = '名前を入力してください';
        }
        if(mb_strlen($user_comment) > 100){
            $errors = 'ひとことは100文字以内で入力してください';
        }elseif(mb_strlen($user_comment) === 0){
            $errors[] = 'ひとことを入力してください';
        }
    }    
    if(empty($errors) === TRUE){
        $query = 'INSERT INTO Bulletin_bord(user_name,user_comment,date)
            VALUES(\'' . $user_name . '\',\'' . $user_comment . '\',\'' . $date . '\')';
            $result = mysqli_query($link,$query);
            if($result === FALSE){
                $errors[] = '登録に失敗しました';
            }
    }    
    $data = array();
    $query = 'SELECT user_name,user_comment,date FROM Bulletin_bord';
    $result = mysqli_query($link,$query);

    while($row = mysqli_fetch_array($result)){
        $data[] = $row;
    }

}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>一言掲示板</h1>
    <form method="post">
        <p>名前 :
            <input type="text" name="user_name">
            ひとこと :
            <input type="text" name="user_comment">
            <input type="submit" value="送信">
        </p>
    </form>
    <?php foreach ($errors as $value){ ?>
        <p><?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></p>
    <?php } ?>

    <ul>
        <?php foreach ($data as $value) { ?>
            <li>
                <?php echo htmlspecialchars($value['user_name'],ENT_QUOTES,'UTF-8'); ?>
                <?php echo htmlspecialchars($value['user_comment'],ENT_QUOTES,'UTF-8'); ?>
                <?php echo htmlspecialchars($value['date'],ENT_QUOTES,'UTF-8'); ?>
            </li>
        <?php } ?>
    </ul>
</body>
</html>


データベースは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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • _Victorique__

    2017/07/13 17:57

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

    キャンセル

  • newyee

    2017/07/13 17:58

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

    キャンセル

  • programming

    2017/07/13 18:09

    自分で解決できた場合は、自己解決として回答欄に解決方法を書かれてはいかがでしょうか。 https://teratail.com/help/question-tips の最後の方をご覧ください。

    キャンセル

回答 1

checkベストアンサー

+1

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

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 foreach ($data as $value) { ?>
    <li>
        <?php echo htmlspecialchars($value['user_name'], ENT_QUOTES, 'UTF-8'); ?>
        <?php echo htmlspecialchars($value['user_comment'], ENT_QUOTES, 'UTF-8'); ?>
        <?php echo htmlspecialchars($value['date'], ENT_QUOTES, 'UTF-8'); ?>
    </li>
<?php } ?><?php foreach ($data as $value): ?>
    <li>
        <?= htmlspecialchars($value['user_name'], ENT_QUOTES, 'UTF-8') ?>
        <?= htmlspecialchars($value['user_comment'], ENT_QUOTES, 'UTF-8') ?>
        <?= htmlspecialchars($value['date'], ENT_QUOTES, 'UTF-8') ?>
    </li>
<?php endforeach; ?>

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/13 19:34

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

    キャンセル

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

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

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

  • PHP

    24503questions

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

  • phpMyAdmin

    806questions

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