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

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

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

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

SQL

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

PHP

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

Q&A

解決済

1回答

1694閲覧

引数でIDを渡し、そのIDの情報を返すようにしたい

ryohasegawa

総合スコア437

MySQL

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

SQL

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

PHP

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

0グッド

0クリップ

投稿2017/06/03 02:32

php

1$userModel = new \MyApp\Model\User(); 2$user = $userModel->findUser();

php

1// 引数で指定されたユーザのデータを返す 2public function findUser() { 3 $stmt = $this->db->query('select * from users where anumber = "1"'); 4 $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass'); 5 $user = $stmt->fetch(); 6 return $user; 7}

現在このコードで、anumber = "1"だったらそのユーザのすべての情報を返すようになってるんですが、この条件の数字を引数を使って代入したいんです。
それで、以下のコードに書き直してみました。

php

1$userModel = new \MyApp\Model\User(); 2$user = $userModel->findUser([ 3 "1" 4]);

php

1// 引数で指定されたユーザのデータを返す 2public function findUser($values) { 3 $stmt = $this->db->prepare('select * from users where anumber = :anumber'); 4 $stmt->execute([ 5 ':anumber' => $values 6 ]); 7 $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass'); 8 $user = $stmt->fetch(); 9 return $user; 10}

このように書き換えると、

Notice: Array to string conversion in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php on line 86

というエラーが出ます。
Notice: Array to string conversion in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php on line 86というのは、':anumber' => $valuesの部分です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$userModel = new \MyApp\Model\User(); $user = $userModel->findUser([ "1" ]); public function findUser($values) { $stmt = $this->db->prepare('select * from users where anumber = :anumber'); $stmt->execute([ ':anumber' => $values ]); $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass'); $user = $stmt->fetch(); return $user; } ``` ↓ ``` $userModel = new \MyApp\Model\User(); $user = $userModel->findUser("1"); public function findUser($value) { $stmt = $this->db->prepare('select * from users where anumber = :anumber'); $stmt->execute([ ':anumber' => $value ]); $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass'); $user = $stmt->fetch(); return $user; } ``` もうちょい体裁直すと ``` $userRepository = new \MyApp\Repository\User(); $user = $userRepository->find("1"); public function find($anumber) { $stmt = $this->db->prepare('select * from users where anumber = :anumber'); $stmt->execute(compact('anumber')); return $stmt->fetchObject(); } ``` ※ そもそもこの実装パターンは「モデル」じゃなくて「リポジトリ」です

投稿2017/06/03 02:42

編集2017/06/03 02:50
mpyw

総合スコア5223

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

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

ryohasegawa

2017/06/03 02:49

受取側が配列で受け取っていないのに、渡す側が配列で渡していたのでエラーになっていたのですか・・・ $value はデータが一個しか無いのに、複数形だったからという事でいいですかね?
mpyw

2017/06/03 02:52 編集

最初の例だと execute の部分はこうなっていたはずです     $stmt->execute([         ':anumber' => [             "1"         ]     ]); executeは多次元配列は受け取れません。強制的に文字列に変換されて     $stmt->execute([         ':anumber' => "Array"     ]); になり、同時にNoticeエラーも発生していたわけです。
ryohasegawa

2017/06/03 02:52

「モデル」じゃなくて「リポジトリ」というのは、どういう事でしょうか? また、体裁のコードはどういう所をどうして、どう良いのかを説明いただくとありがたいです。
mpyw

2017/06/03 02:58

>> 「モデル」じゃなくて「リポジトリ」というのは、どういう事でしょうか? ・「リポジトリ」はテーブルを表す ・「モデル」はレコードを表す テーブルに対する操作なのにクラスがModelとなっているのには違和感があります。 (LaravelのEloquentはRepositoryとModelを明確には区別せず,Repositoryとしてのメソッドはstaticメソッドとして呼び出す慣習があります。またCakePHP1および2はこの例同様に命名を間違えています。CakePHP3はRepositoryとModelを区別して実装しています)
mpyw

2017/06/03 03:01 編集

>> また、体裁のコードはどういう所をどうして、どう良いのかを説明いただくとありがたいです。 ・変数名を分かりやすく適切なものにした ・UserリポジトリなのにfindUserというメソッド名は冗長なのでfindにした ・{ } の改行の仕方をPSR-2コーディング規約に従うようにした ・compact関数を使って ['変数名' => $変数名] の部分を簡略化した ・fetchObjectを使って取得部分を簡略化した
ryohasegawa

2017/06/03 03:05

そのModelはプログラム学習(ドットインストル)でログインの実装を学習したコードに追記しているので、VMCのM(Model)の部分であり、リポジトリやモデルなどは一切考えていません。 初めて知りました。 今後もっと勉強していき、もっと実際に世間で使われているプログラムを書きたいと思っています。
ryohasegawa

2017/06/03 04:38

体裁の説明ありがとうございます。 大体理解できたのですが、$stmt->execute(compact('anumber')); が理解できません。 execute で値の挿入をしているのは分かるんですが、compact('anumber') でなぜ値の挿入ができるのかがわかりません。
mpyw

2017/06/03 07:42

PHP: compact - Manual http://php.net/manual/ja/function.compact.php ↑こいつは「関数」と名乗っていますが、呼び出し元のシンボルテーブルに直接アクセスする特異な動きをするので、「関数っぽい言語機能」とみなすべきですね。 ['変数名' => $変数名] この配列を作るのを compact('変数名') という形で書けます。
ryohasegawa

2017/06/03 07:48

もし、 ['変数名1' => $変数名1]、 ['変数名2' => $変数名2] と値を2つ入れる場合だと使えないということでしょうか?
mpyw

2017/06/03 07:49

使えます。 compact('変数名1', '変数名2') あるいは compact(['変数名1', '変数名2'])
ryohasegawa

2017/06/03 08:56

順番に挿入されていくわけですか?
mpyw

2017/06/04 10:59

2つ入れるってどういう意味ですか? $this->db->prepare('select * from users where ... = :変数名1 AND ... = :変数名2'); このようにプレースホルダを2個用意していて,execute時に ['変数名1' => $変数名1, '変数名2' => $変数名2] こういう配列を渡したい,というシーンを想定したのですが
ryohasegawa

2017/06/05 04:00

なるほど!その方法なら出来るという事ですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問