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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

MySQL

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

Q&A

2回答

1102閲覧

入力フォームから送られてきたidレコードがテーブルに存在したらupdate、存在していなかったら何が間違っているかメッセージで出力する方法。

Anpontangaya

総合スコア0

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

MySQL

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

0グッド

0クリップ

投稿2023/03/16 21:40

実現したいこと

入力フォームから送られてきたidとheightの値をtableのheightカラムにupdateしたいです。
該当するidレコードがなかったらレコードがない旨をメッセージとして出力したいです。

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

tableにはid 1のレコードしか存在していませんが、
入力フォームにid 2や3などを入力しても
データを更新しましたと出力されてしまいます。
Countのwhereの部分が間違っているのでしょうか?
ちゃんと条件分岐するためにはどうすればよいでしょうか。

try {
$id = $_POST["id"];
$height = $_POST["height"];

if ($id === "" || $height === "" ) { echo "入力に不備があります。"; } elseif (strlen($height)<2 || strlen($height)>3 ||! ctype_digit($height) || substr($height,0,1) === "0") { echo "2〜3桁の正しい半角数字で入力してください。"; } else { $sql = "SELECT COUNT(id) FROM users WHERE id = 1"; $stmt = $dbh->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); if ($result > 0) { $sql = "UPDATE users SET height = :height WHERE id = :id"; $stmt = $dbh->prepare($sql); $params = array(":id" => $id, ":height" => $height); $stmt->execute($params); echo "データを更新しました。"; }else { echo "該当するレコードがありません。"; } }

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

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

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

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

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

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

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

YAmaGNZ

2023/03/16 21:55

SELECT COUNT(id) FROM users WHERE id = 1 と1固定にしているのは正しいのですか?
m.ts10806

2023/03/16 21:56

質問タグにPHP追加してください。
guest

回答2

0

コメントで指摘されているようにPOSTのIDをとっているのに id = 1と固定にしているのと、
せっかくSQLでcountとってるのに$resultを直参照しているのは意味がないのでは?
countだとSQLに構文エラーや参照ミス(テーブルやカラム名の間違い等)がなければ必ず1件取得できますし(SQLをDBに対して直実行してみてください)、PDOStatement::fetchAllの返却値は結果セットの配列なので$result > 0は間違いなくtrueになります。
結果セット配列からcountを参照しましょう(キーはvar_dump()などで確認のこと)

投稿2023/03/16 22:00

編集2023/03/16 22:39
m.ts10806

総合スコア80850

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

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

Anpontangaya

2023/03/17 03:59

回答ありがとうございます! まずsqlをdbに直実行したいのですが、こちらのid=1の1の部分をどのように書けばうまく取得できるのかわからずにいます。 教えていただけたらありがたいです。
m.ts10806

2023/03/17 04:05

直に実行する場合はGUIツールやコマンドラインで対象DBにログインして行いますし、 あくまでモックなのでそこは固定値になります。POSTされるであろう値を何種類か試せばよいです。 PHPから実行=アプリケーション通しての実行 で、 値などがバインドされるので、直実行はバインドされた前提で、「想定の結果が得られるか」をアプリケーション実行前に確認するためのものです。 開発時には構文エラー程度は取り除いた状態でアプリケーションから実行されるべきなので、直実行により想定の結果が得られるかを確認するのが先です。
Anpontangaya

2023/03/17 04:11

申し訳ございません。 勉強不足なのは承知なのですが、初心者で内容が少し難しい部分があります、、、 実際にコードを入力するとどのようなものになるか教えていただけると幸いです。
m.ts10806

2023/03/17 04:21 編集

DBが設置されているサーバに対してコマンドライン(Windowsならコマンドプロンプト)で接続するケースと 既存のツール(MySQLならphpMyAdminやWorkBenchなどが代表。他にも色々)で接続するケース 後者の方が画面で見られるので楽だとは思いますが、そこは色々と試されると良いかと。 理解してもらいたい点としては、 DBはアプリケーション(今回の場合はPHPプログラム)とは別であり、必ずアプリケーションから実行しなければ結果を得られないわけではなく、DBだけで単体で結果を得ることができるということです。 PHPがやっているのはSQL文の形をした文字列とパラメータを引き渡すのみ。あくまで処理・実行結果の返却はDB側で行われているので、それぞれ単体で実行できるわけです。 ※アプリケーションから渡された情報をDB側で確認するのは簡単ではないので、あくまで問題切り分けのために直実行を必ず先にして想定の結果を得られるか確認しましょうということです
Anpontangaya

2023/03/17 07:48

ありがとうございます! 確認してみます!
guest

0

PDOであればupdateを発行したあとrowCountして、0なら更新されなかった、1なら更新されたです。
ただidが存在しない場合と、idが存在するがsetするheightが保持しているheightと同じ場合ともにupdateはされなかったと判断されますので、もしその場合分けが必要であれば、一つは更新が0のときはselectですでにデータが存在するか確認する、もしくはテーブルに更新日時欄(たとえばmodifiedカラム)を設定して、なにかデータ投入するたびにmodifiedをnowで上書きするとよいでしょう

投稿2023/03/17 00:28

編集2023/03/17 03:27
yambejp

総合スコア114839

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

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

Anpontangaya

2023/03/17 04:06

回答ありがとうございます! 場合分けが必要なのですが、まずidレコードが存在すればupdateし、なければ該当するレコードがないというふうにしたいのですが Selectでうまく取得できずにいます、、、 Serect countのwhereの部分のidをどのように書けばうまく取得できるのか教えていただけたら幸いです。
yambejp

2023/03/17 04:34

ですので・・・すでにidが存在してheightの値が同じで更新されなかった場合はどうしたいのですか?
Anpontangaya

2023/03/17 04:39

すみません。 そちらは特に場合分けが必要ないみたいでした。
yambejp

2023/03/17 04:43

であれば、回答した通り「PDOであればupdateを発行したあとrowCountして、0なら更新されなかった、1なら更新された」が必要十分です
Anpontangaya

2023/03/17 07:48

かしこまりました! 答えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問