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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

1998閲覧

入力されたidを参照し、該当するidがあればそのレコードを更新させ、なければエラーメッセージを表示させたい

_Taturon_

総合スコア17

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/06/21 04:02

編集2020/06/21 05:06

##実現したいこと
タイトルの通りです。
データの流れとしては以下です。
0. ユーザーからidとnameが送られてくる

  1. idがDBに登録されていれば、nameを更新
  2. idがDBに登録されていなければ、エラーメッセージを表示

ここで、送られてくるidとnameの値はそれぞれ一つずつとします。

idnameage
1user125
2user230
3user355

例えば、「id = 2, name = 'user_two'」の値が送られてきた場合は、
上記テーブルのidが2のレコードのnameを更新し、
「id = 4, name = 'user_four'」の値が送られてきた場合は、
意図的にエラーを発生させ,下記コードのcatchに飛ばしたいです。

php

1try { 2 $db = new PDO(PDO_DSN, USERNAME, PASSWORD); 3 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 $stmt = $db->prepare('update users set age = ? where id = ?'); 5 $stmt->execute([$age, $id]); 6} catch (PDOException $e) { 7 echo $e->getMessage() . PHP_EOL; 8 exit; 9}

##試したこと

  • Exist

UPDATE users SET age = 40 WHERE id = 4 EXISTS (SELECT * FROM users WHERE id = 4)
=>idが4のレコードがあれば更新する、みたいな処理を期待しましたが、エラーが出ます

  • 上記の他にもcaseやifを使ったりしてみましたが上手くいきません
  • 調べ方や学習方法にアドバイスがございましたらご指摘くださると幸いです

##利用環境

  • PHP 7.1.29 (cli)
  • mysql Ver 14.14 Distrib 5.6.44

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

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

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

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

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

guest

回答2

0

データがあれば更新、なければ処理しないということですか?
(エラーというのがよくわからないですが・・・)

SQL

1create table tbl(id int primary key, 2name varchar(20), 3age int); 4 5INSERT INTO tbl values 6(1,'user1',25), 7(2,'user2',30), 8(3,'user3',55);

上記データをid=2,3,4のnameを更新してみます

SQL

1update tbl set name=coalesce(elt(field(id,2,3,4),'user2x','user3x','user4x'),name)

2,3は更新されて、4はデータが無いのでなにもされません

投稿2020/06/21 04:51

yambejp

総合スコア116724

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

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

_Taturon_

2020/06/21 05:14

ご回答ありがとうございます! エラーというのは、SIGNAL等を用いて、 「idがない」ということをユーザーに明示的に示したい為です 一つのクエリでこれらを実現したいです...
_Taturon_

2020/06/21 08:13

下記の通り解決しました。 yambejpさんも素早い回答と具体的なコードの提示をして頂き ありがとうございました!
guest

0

ベストアンサー

UPDATE ... WHERE ... の後、

MySQLで更新があったレコード数を取得

select row_count();

が使えるのでは?

投稿2020/06/21 04:11

Orlofsky

総合スコア16417

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

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

_Taturon_

2020/06/21 04:27

素早いご回答ありがとうございます! これですと、更新があったレコードしか選択できません。 もう少し質問を詳しく書けばよかったのですが、 idは任意の値としたいです。
Orlofsky

2020/06/21 04:39

row_count()がゼロならデータがないと判断できるのでは? 意味が違うなら誤解されないように質問を修正してください。
_Taturon_

2020/06/21 05:14

修正しました。
Orlofsky

2020/06/21 06:59

端折らないで、質問にきちんとCREATE TABLEと(こういうデータがあるは今の質問で良いか?)こういうデータでUPDATEしたら、こういう結果になる、ってきちんと載せないとわからいのでは? SQLだけでは無理っぽいからストアド・プログラムなどでLOOPする必要がありそうです。
_Taturon_

2020/06/21 08:12

Orlofskyさんの最初のアドバイスをきっかけに、 PDOStatementクラスのrowCountメソッドを活用することで 実現したい機能が実装できました。 ありがとうございます! https://www.php.net/manual/ja/pdostatement.rowcount.php 最初は、一回のクエリで判定と更新ができないか模索していましたが、 よくよく考えたらOrlofskyさんが仰られるように 更新後に変更があった行数をカウントし それによってエラー文を出力すれば 私の実装したい機能は実現できました。 また、質問方法に関しては以後気をつけたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問