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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

1526閲覧

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

kohoku_yanki

総合スコア3

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2019/08/08 23:20

編集2019/08/08 23:33

前提・実現したいこと

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

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

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

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

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

エラーメッセージ

該当のソースコード

php

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Example</title> 6 <link rel="stylesheet" href="SAMPLE.css"> 7 8 </head> 9 <body> 10 11 <p>掲示板</p> 12 13 <form method="POST" action=""> 14 <input type="text" name="name"> *ハンドルネーム<?php echo $err_msg1; ?><br><br><br> 15 <textarea name="content" rows="8" cols="40"></textarea> *内容<?php echo $err_msg2; ?><br> 16 <br><br> 17 <input type="submit" value="投稿する" name="send"> 18 </form> 19 20 21<?php 22 23$created = date('Y-m-d H:i:s'); 24 25 26 27 28 29try { 30 31 /* リクエストから得たスーパーグローバル変数をチェックするなどの処理 */ 32 33 // データベースに接続 34 $pdo = new PDO( 35 'mysql:dbname=;host=localhost;charset=utf8mb4', 36 '', 37 '', 38 [ 39 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 40 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 41 ] 42 ); 43 44 /* データベースから値を取ってきたり, データを挿入したりする処理 */ 45 46 if ( isset( $_POST['send'] ) === true ) { 47 48 $name = $_POST['name'] ; 49 $content = $_POST['content']; 50 $content = nl2br($content); 51 52 if ( $name !== '' && $content !== '' ) { 53 54 $stmt = $pdo -> prepare("INSERT INTO contents (name, message,created) VALUES ('$name', '$content','$created')"); 55 $stmt->bindParam('$name', $NM, PDO::PARAM_STR); 56 $stmt->bindParam('$content', $CT, PDO::PARAM_STR); 57 $stmt->bindParam('$created', $CD, PDO::PARAM_STR); 58 $stmt->execute(); 59 } 60 61 } 62 63 64 65 } catch (PDOException $e) { 66 67 // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する 68 // - もし手抜きしたくない場合は普通にHTMLの表示を継続する 69 // - ここではエラー内容を表示しているが, 実際の商用環境ではログファイルに記録して, Webブラウザには出さないほうが望ましい 70 header('Content-Type: text/plain; charset=UTF-8', true, 500); 71 exit($e->getMessage()); 72 73 74 75 // Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える 76 // (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.) 77 header('Content-Type: text/html; charset=utf-8'); 78 } 79 80?> 81<?php 82 83// 変数の初期化 84$sql2 = null; 85$res = null; 86$pdo2 = null; 87 88try { 89 // DBへ接続 90 $pdo2 = new PDO( 91 'mysql:dbname=;host=localhost;charset=utf8mb4', 92 '', 93 '', 94 [ 95 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 96 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 97 ] 98 ); 99 100 // SQL作成 101 $sql2 = "SELECT * FROM contents ORDER BY no DESC" ; 102 103 // SQL実行 104 $res = $pdo2->query($sql2); 105 106} catch(PDOException $e) { 107 108 echo $e->getMessage(); 109 die(); 110} 111// 接続を閉じる 112$pdo2 = null; 113?> 114<?php 115//書き込み無しの場合のエラーメッセージ 116$err_msg1 = ""; 117$err_msg2 = ""; 118if ( isset($_POST["send"] ) === true ) { 119 if ( $name === "" ) {$err_msg1 = "名前を入力してください";} 120 121 if ( $content === "" ) {$err_msg2 = "コメントを入力してください";} 122} 123?> 124<?php echo $err_msg1.$err_msg2?> 125 126<?php foreach($res as $value ):?> 127<div class="REDNAME"><?php echo "<hr>$value[name]<br><br>" ?></div> 128<div><?php echo "$value[message]<br>" ?></div> 129<div><?php echo "$value[created]<br>"?></div> 130<?php endforeach;?> 131 132</body> 133</html>

試したこと

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

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

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

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

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

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

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

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

kohoku_yanki

2019/08/08 23:35

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

回答1

0

ベストアンサー

'$content'

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

"$value[message]<br>"

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

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

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

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

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

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

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

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

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

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

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

投稿2019/08/09 00:23

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問