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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

解決済

1回答

2725閲覧

PHP簡易掲示板で投稿内容のNGワードだけをエラー表示したいが、全ての入力でエラーになってしまう

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

0クリップ

投稿2021/05/09 16:04

PHPで簡易掲示板を作成中。NGワードだけをエラーを表示したいが、全ての入力でエラーメッセージを表示してしまう。

PHP初心者です。

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

実装したい機能 $contentsにNGワードを含む文字列が入力されたときだけ'NGワードが入力されています'と表示したい
現状、どんな文字列を入力しても、'NGワードが入力されています'と表示されてしまう
('空白でもNGワードが入力されています'となります)

該当のソースコード

PHP

1$errors = []; 2if($_POST){ 3 $id = null; 4 $name = $_POST["name"]; 5 $contents = $_POST["contents"]; 6 if(!$name){ 7 $errors[] .= "名前を入力してください"; 8 } 9 if(!$contents){ 10 $errors[] .= "投稿内容を入力してください"; 11 } 12 $ng_word = array('死ね','アホ','殺す','バカ'); 13 if($contents=$ng_word){ 14 $errors[] .="NGワードが入力されています"; 15 } 16 if(!$errors){ 17 date_default_timezone_set('Asia/Tokyo'); 18 $created_at = date("Y-m-d H:i:s"); 19 //DB接続情報を設定します。 20 $pdo = new PDO( 21 "mysql:dbname=sample;host=localhost","root","",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") 22 ); 23 //ここで「DB接続NG」だった場合、接続情報に誤りがあります。 24 if ($pdo) { 25 echo "DB接続OK"; 26 } else { 27 echo "DB接続NG"; 28 } 29 //SQLを実行。 30 $regist = $pdo->prepare("INSERT INTO post(id, name, contents, created_at) VALUES (:id,:name,:contents,:created_at)"); 31 $regist->bindParam(":id", $id); 32 $regist->bindParam(":name", $name); 33 $regist->bindParam(":contents", $contents); 34 $regist->bindParam(":created_at", $created_at); 35 $regist->execute(); 36 //ここで「登録失敗」だった場合、SQL文に誤りがあります。 37 if ($regist) { 38 echo "登録成功"; 39 } else { 40 echo "登録失敗"; 41 } 42 } 43} 44//DB接続情報を設定します。 45$pdo = new PDO( 46 "mysql:dbname=sample;host=localhost","root","",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") 47); 48//ここで「DB接続NG」だった場合、接続情報に誤りがあります。 49if ($pdo) { 50 echo "DB接続OK"; 51} else { 52 echo "DB接続NG"; 53} 54//SQLを実行。 55$regist = $pdo->prepare("SELECT * FROM post order by created_at DESC limit 20"); 56$regist->execute(); 57//ここで「登録失敗」だった場合、SQL文に誤りがあります。 58if ($regist) { 59 echo "登録成功"; 60} else { 61 echo "登録失敗"; 62} 63?> 64 65<!DOCTYPE html> 66<meta charset="UTF-8"> 67<title>掲示板サンプル</title> 68<h1>掲示板サンプル</h1> 69<section> 70 <h2>新規投稿</h2> 71 <div id="error"><?php foreach($errors as $error){echo $error.'<br>';}?></div> 72 <form action="index.php" method="post"> 73 名前 : <input type="text" name="name" value=""><br> 74 投稿内容: <input type="text" name="contents" value=""><br> 75 <button type="submit">投稿</button> 76 <a href="registration.php"> 77 会員登録がまだの方はこちら 78 </a> 79 </form> 80</section> 81 82<section> 83 <h2>投稿内容一覧</h2> 84 <?php foreach($regist as $loop):?> 85 <div>No:<?php echo $loop['id']?></div> 86 <div>IPアドレス: <?php echo $_SERVER["REMOTE_ADDR"] ; ?></div> 87 <div>名前:<?php echo $loop['name']?></div> 88 <div>投稿内容:<?php echo $loop['contents']?></div> 89 <div>投稿時間:<?php echo $loop['created_at']?></div> 90 <div>------------------------------------------</div> 91 <?php endforeach;?> 92 93</section> 94### データベースの画像↓

イメージ説明

試したこと

NGワードをはじくコードのみ削除して実行すると、投稿内容は表示されました。(もちろんNGワードでも表示されてしまいます。)
キャッシュを削除し、投稿しても、繰り返し'NGワードが入力されています'となります。

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

WindowsにLAMP仮想環境を構築しています。
PHP 7

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

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

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

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

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

m.ts10806

2021/05/09 20:04

本件とは関係ないですが if(!$name){ これだと 0 が入力されたときも空と判定されますがそれでも良いですか?
退会済みユーザー

退会済みユーザー

2021/05/09 22:37

興味本位で恐縮ですが PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8` の記述はどちらの情報源から利用されてますか?
退会済みユーザー

退会済みユーザー

2021/05/09 23:00

m.ts10806さん 閲覧ありがとうございます。 良くないです。 演算子についてもう少し調べてから、改善します。
退会済みユーザー

退会済みユーザー

2021/05/09 23:02

te2jiさん 閲覧、コメントありがとうございます。 こちらのサイトをほぼコピペしています。 https://took.jp/bulletin-board/
退会済みユーザー

退会済みユーザー

2021/05/09 23:20

ありがとうございます。 古い記事かと思ったんですけど、そうでもないみたいですね^^; utf8 を使用している限りほぼ問題は無いのですが、問題を内包する書き方なので、一般的な接続方法を提示しておきます。 参考まで。 https://qiita.com/te2ji/items/56c194b6cb9898d10f7f
guest

回答1

0

ベストアンサー

以下のIF文では、判定を行っておらず $contents$ng_word を代入しています。
そのため、IF文での判定としては true 扱いになっており、IF文の中が実行されています。

if($contents=$ng_word){ $errors[] .="NGワードが入力されています"; }

また、文字列と配列は単純には比較できませんので、比較方法を調査することをお勧めします。

投稿2021/05/09 16:24

takyafumin

総合スコア2335

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

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

退会済みユーザー

退会済みユーザー

2021/05/09 23:07

takyafuminさん 回答ありがとうございます。 foreach($ng_word as ngWordVal){ if(mb_strpos($contents, $ngWordVal) !==FALSE){ $errors[] .= "NGワードが入力されています";} } に修正したところ、上手くNGワードのみ弾けるようになりました! ご回答ありがとうございます。 もっと勉強します。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問