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

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

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

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

Q&A

解決済

2回答

875閲覧

while文の中でif文を使いたい

kens_Freelance

総合スコア10

PHP

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

0グッド

3クリップ

投稿2021/05/30 00:17

たびたび、質問申し訳ございません。
3時間くらい悩んで解決しないので、いい案をいただけると幸いです。

DBのレコード$user_idの1件1件と、入力したID($_POST['user'])が
一致した際は、「そのユーザーIDはすでに使用されています」というエラーを出し、
一致しない場合は「登録ボタン」を表示させたいです。

下記のようなコードを作ってみたのですが、
elseで「登録ボタン」を表示させてもwhileの中なので、いくつもボタンが作られてしまいますし、
だからといってwhileを消すと、1件1件を見ることができません。

何かいい方法があれば教えていただきたいです。

あと、もし「このように検索すればいいよ」というのがあれば
それも教えていただけると幸いです。
3時間検索しまくりましたが、解決しません。。

よろしくお願いいたします。

while($user_id = $stmt->fetch()) { if($user_id['user_id'] === $_POST['user']) { echo '<br>*そのユーザーIDはすでに使用されています'; } }

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

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

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

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

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

javahack

2021/05/30 00:49

既に回答でも指摘されていますが、DBを使用しているなら必要なデータの絞込はDBでやりましょう。 常に全件検索なんてDBを使用するメリットを放棄しています。
kens_Freelance

2021/05/30 06:11

ありがとうございます。当たり前の部分が見えなくなってしまっていました。素早いご回答ありがとうございます。
guest

回答2

0

他の方も言われているとおり DB の検索処理を見直すのがオススメですが、参考まで。

「ひとつでも一致するものがあったか」または「すべて一致しなかったか」を判断するには、すべての要素をループしてチェックし終わらないと分からないので、以下のようにフラグ変数($found)を用意してループを抜けたあとに判定すると良いです。

php

1$found = false; 2while (...) { 3 if (...) { 4 $found = true; 5 break; 6 } 7} 8if ($found) { 9 // ひとつでも一致するものがあった場合 10} else { 11 // すべて一致しなかった場合 12}

投稿2021/05/30 05:30

yh1224

総合スコア653

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

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

kens_Freelance

2021/05/30 06:11

ありがとうございます。検索処理を見直したらうまくいきました。 問題点にとらわれすぎていると、当たり前の処理が思いつかないので、もう少し広い視野をもって考えます。 また、ループの処理も教えていただきありがとうございます。 今後、このような処理を使う場合は参考にします。
guest

0

ベストアンサー

そもそも、SELECT時点でそのPOSTされたuser_idを条件に検索すればループ内で比較する必要もループする必要もないのでは。

MySQL 5.6 リファレンスマニュアル #行のカウント

ただ、過去質問見てると、全体像考えずにとりあえずその場その場で考えながらコードを書いているように見受けられます。
メモレベルでいいので考えてから(できればフローチャートくらいは欲しい)書いたほうが時間だけが過ぎていくことは少なくなると思います。
いきなりコードを書くのではなく、全体の流れと必要そうな材料の選定と、材料の組み合わせを考える。

投稿2021/05/30 00:29

編集2021/05/30 00:39
m.ts10806

総合スコア80875

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

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

kens_Freelance

2021/05/30 06:09

いつもありがとうございます。アドバイスいただいたとおりにすれば、うまく動きました。 念のため、うまくいったコードを下記します。 >ただ、過去質問見てると、全体像考えずにとりあえず >その場その場で考えながらコードを書いているように見受けられます。 本当にそのとおりでした。 といいますか、webアプリを作るときはフローチャートを作るのは当たり前なのですね。。 知りませんでした、教えていただけて感謝します。 今からでもいいので、作ってみます。 $user_id = $stmt->fetchAll(); if(empty($user_id)) { echo '重複しているIDはありません'; } else { echo 'IDが重複しています'; }
m.ts10806

2021/05/30 07:36

家を建てるときに、いきなり木材を組む人はいません。
m.ts10806

2021/05/30 09:50

というか、「存在しているかどうか」なら回答に提示したようにSQL側でcount()とるのでfetchAllでは不適当で(1件は取れるから) 単にfetchしてSQLの取得結果で判定するべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問