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

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

ただいまの
回答率

87.34%

PHP/MySQL 掲示板 アカウント機能やBAN機能について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,096

score 3

前提・実現したいこと

プログラミング初心者、独学です。
PHP/MySQLを使用して、手探りで掲示板を作成しています。
現在、フォームに書き込んだ文字列をDBに記録、出力する所まで作ることができました。
荒らし対策として、アカウント機能やアカウントに対するBAN機能を追加したいと考えているのですが、
具体的な導入方法がわかりません。

クライアントが登録した情報を認証する方法(メールアドレス認証や電話番号認証)

クライアントが登録した情報と書き込みを紐付ける方法

おおまかにでも教えて頂けないでしょうか。
また、足りてなさそうな知識や参考文献などもございましたら、教えて頂けると幸いです。

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

エラーメッセージ

該当のソースコード

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Example</title>
        <link rel="stylesheet" href="SAMPLE.css">      

    </head>
    <body>

        <p>掲示板</p>

 <form method="POST" action="">
 <input type="text" name="name"> *ハンドルネーム<?php echo $err_msg1; ?><br><br><br>
 <textarea name="content" rows="8" cols="40"></textarea> *内容<?php echo $err_msg2; ?><br>
 <br><br>
 <input type="submit"  value="投稿する" name="send">
 </form>


<?php

$created = date('Y-m-d H:i:s');





try {

    /* リクエストから得たスーパーグローバル変数をチェックするなどの処理 */

     // データベースに接続
     $pdo = new PDO(
        'mysql:dbname=;host=localhost;charset=utf8mb4',
        '',
        '',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
     );

    /* データベースから値を取ってきたり, データを挿入したりする処理 */

    if ( isset( $_POST['send'] ) === true ) {

        $name     = $_POST['name']   ;
        $content = $_POST['content'];
        $content = nl2br($content);

        if ( $name !== '' && $content !== '' ) {

     $stmt = $pdo -> prepare("INSERT INTO contents (name, message,created) VALUES ('$name', '$content','$created')");
     $stmt->bindParam('$name', $NM, PDO::PARAM_STR);
     $stmt->bindParam('$content', $CT, PDO::PARAM_STR);
     $stmt->bindParam('$created', $CD, PDO::PARAM_STR);
     $stmt->execute();
        }

    } 



  } catch (PDOException $e) {

    // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する
    // - もし手抜きしたくない場合は普通にHTMLの表示を継続する
    // - ここではエラー内容を表示しているが, 実際の商用環境ではログファイルに記録して, Webブラウザには出さないほうが望ましい
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    exit($e->getMessage()); 



 // Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える
 // (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.)
 header('Content-Type: text/html; charset=utf-8');
 }

?>
<?php

// 変数の初期化
$sql2 = null;
$res = null;
$pdo2 = null;

try {
    // DBへ接続
    $pdo2 = new PDO(
        'mysql:dbname=;host=localhost;charset=utf8mb4',
        '',
        '',
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
    );

    // SQL作成
    $sql2 = "SELECT * FROM contents ORDER BY no DESC" ;

    // SQL実行
    $res = $pdo2->query($sql2);

} catch(PDOException $e) {

    echo $e->getMessage();
    die();
}
// 接続を閉じる
$pdo2 = null;
?>
<?php
//書き込み無しの場合のエラーメッセージ
$err_msg1 = "";
$err_msg2 = "";
if ( isset($_POST["send"] ) === true ) {
    if ( $name === "" ) {$err_msg1 = "名前を入力してください";}

    if ( $content === "" ) {$err_msg2 = "コメントを入力してください";}
}
?>
<?php echo $err_msg1.$err_msg2?>

<?php foreach($res as $value ):?>
<div class="REDNAME"><?php echo "<hr>$value[name]<br><br>" ?></div>
<div><?php echo "$value[message]<br>" ?></div>
<div><?php echo "$value[created]<br>"?></div>
<?php endforeach;?>

</body>
</html>

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Orlofsky

    2019/08/09 08:24

    コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。

    キャンセル

  • kohoku_yanki

    2019/08/09 08:35

    申し訳ございません。変更致しました。

    キャンセル

回答 1

checkベストアンサー

0

'$content'

としてしまっているところや

"$value[message]<br>"

としまっているところから、
文字列や変数、配列の基礎部分がまだまだと見受けられます。
いずれも変数が正しく展開されません

まずそこはきちんとおさえてもらう必要があります。

エラー表示をONにしたり、デバッグは必ず身につけてください。

また、ログイン認証やそのログインユーザーと様々な情報を扱うためには、
データベース設計をきちんとする必要があります。

「何をキーとしてどの情報を持ってくるか、そのためにどのような情報をどういうときにどういう形で保存するようにするか」をしっかりまとめることですね。

いきなりコードで考えるより、そういったログイン機能持った参考になるサイトに登録して挙動を確認した上で「どういう構造になっているか」考えると良いです。

あなたが今使っているteratailなんてまさにそれじゃないですか。
※ちなみにteratailはPHPフレームワークで作られているようですよ

いずれにしても今提示されているような1ファイルだけのプログラムだけでは管理しきれないでしょう。
扱うデータも多くなるし、
今のように1ファイルだけのプログラムなのに同じDBに対する接続の記述を複数回書いている とか
出力処理がないのにHTMLタグの中にロジックを混同させている とか、
そういう状態だとすぐにスパゲッティコードの出来上がりです(既に若干スパゲッティです)。

また、それなりに最低限のセキュリティ対策は必要でしょう。
安全なウェブサイトの作り方

下記のような初心者・開発者向けの記事は読んで参考にしてください。

ログイン機能実装についてはある程度設計は必要でしょうが、
ネット上にサンプルコードは幾らでも転がっているので、適宜確認してください(なるべくPHP7対応でセキュリティ対策もしてある、ここ1年内に書かれた記事を参考にしてください)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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