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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2384閲覧

laravel5.1でwebAPIを利用したい

退会済みユーザー

退会済みユーザー

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/09/15 06:25

編集2016/09/15 08:46

【追記】
回答者様のアドバイスの元試行錯誤した結果、恥ずかしいことにただのsql文の間違いだったようです。これに2時間以上ついやしてたので本当恥ずかしいです。ただ、http_build_queryは言われなければ気づかなかったので感謝しています。

どうしてもわからなかったのでどこが間違っているのかを教えていただきたいです。開発環境はローカルでXAMPPを使ってます。

laravel5.1で入力フォームを作り、そこから入力されたデータをコントローラーで以下のように処理してみました。

public function test(Request $request) { $data =array('id'=>$request->id,'password'=>$request->password); $data = http_build_query($data, '', '&'); $url = 'http://localhost/apitest/apitest.php'; $header = ['Content-Type: application/x-www-form-urlencoded', 'Content-Length: '.strlen($data)]; $context = [ 'http' => [ 'method' => 'POST', 'header' => implode("\r\n", $header), 'content' => $data, 'ignore_errors' => true ] ]; $result = file_get_contents($url, false, stream_context_create($context)); $arr = json_decode($result,true); return view('testviews.view1')->with('arr',$arr); }

入力されたデータを別のphpファイルに送って返ってきた値をview側に渡すような感じで作りました。そしてphp側は

<?php $id=$_POST['login_id']; $password=$_POST['password']; $dsn='mysql:dbname=test;host=localhost'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT name FROM accessmngs WHERE login_id=? AND password=?'; $data[]=$id; $data[]=$password; $stmt=$dbh->prepare($sql); $stmt->execute($data); $dbh=null; $rec=$stmt->fetch(PDO::FETCH_ASSOC); $result = json_encode($rec['name']); ?>

こんな感じで作りました。正直、laravel側から送られたデータの受け取り方がこれでいいのかわからないのですが、あってると仮定します。

そしてview側はこのように作りました

<?php var_dump($arr); ?>

とりあえずデータが渡ってきてるかが気になるのでこうしてます。
そして実行して結果を見たのですが、ただNULLとしか書かれてませんでした。
欲しかった結果はデータベースに登録されてるnameのデータなのですが・・。一体どこが間違っているのでしょうか

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

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

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

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

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

guest

回答2

0

ベストアンサー

PHP

1$data =array('id'=>$request->id,'password'=>$request->password); 2$data = http_build_query([], '', '&');

1行目にリクエストパラメータを受け取っていますが、
2行目で、空の配列ベースでクエリ文字列を作成してしまっているため、idとパスワードの情報が消えていませんか?


あとは、ビューから$resultを出力して確認していますが、コントローラーで

PHP

1return view('testviews.view1')->with('arr',$arr)

と呼び出しているので、値は$arrでアクセスできます。

投稿2016/09/15 07:35

Archsted

総合スコア452

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

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

Archsted

2016/09/15 07:43

直接の回答では無いのでコメントにしますが、一度に処理の全てを作ろうとせずに 途中途中で、変数に値がちゃんと入っているか? 送信するデータはあってるか? 等を確認しながら進めていくといいと思います。 Laravelでは、処理を中断してデータを確認しやすくなるdd関数が用意されているので、 コントローラの中ですと、$data や $context、$results や $arr あたりを dd($data); などを挟んで確認してみるといいと思います。
退会済みユーザー

退会済みユーザー

2016/09/15 07:48

回答ありがとうございます。確かに空になってたので $data = http_build_query($data, '', '&'); と直したのですが、それでもだめでした。arrは単に書きミスです、すみません
退会済みユーザー

退会済みユーザー

2016/09/15 08:29

回答ありがとうございます。アドバイスの通り地道に頑張ることにします。
guest

0

APIサーバ側はLaravelではないようなので、タイトルの「laravel5.1でwebAPIを作りたい」は不適当な気がします。「Laravel5.1でWebAPIを利用したい」が適当ではないでしょうか?

APIを叩くHTTPメソッドがPOSTのようですので、LaravelからのPOSTパラメタはこれで取ることができます。

php

1$id = $_POST['login_id']; 2$password = $_POST['password'];

追記

パラメタはAPIサーバ側に渡っているようですね。
DBにきちんと接続できているか以下のように書き換えてみてください。

php

1 2$dsn = 'mysql:dbname=test;host=localhost'; 3$user = 'root'; 4$password = ''; 5try { 6 $dbh = new PDO($dsn,$user,$password); 7 $dbh->query('SET NAMES utf8'); 8 $data = [$id, $password]; 9 $stmt = $dbh->prepare($sql); 10 $stmt->execute($data); 11 $dbh = null; 12 13 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 14 15 //jsonとして出力 16 header('Content-type: application/json'); 17 echo json_encode($rec['name']); 18 19} catch (PDOException $e) { 20 exit('データベース接続失敗。'.$e->getMessage()); 21}

投稿2016/09/15 07:25

編集2016/09/15 08:29
natady

総合スコア606

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

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

退会済みユーザー

退会済みユーザー

2016/09/15 07:31

指摘ありがとうございます。修正しておきました。その方法でやってみたのですが、いまだにNULLのままです・・・
natady

2016/09/15 07:38

API側にパラメタが渡っているか`var_dump($_GET, $_POST)`で確認してみてください。
退会済みユーザー

退会済みユーザー

2016/09/15 07:52

laravel側でvar_dump($_GET, $_POST)を付け加えてみたところ、 array(0) { } array(3) { ["_token"]=> string(40) "CuJR5dLiDnoCAbnWh4qaDU2zPUu13nO90y3ZIfBC" ["login_id"]=> string(14) "test@gmail.com" ["password"]=> string(8) "testtest" } と表示されました。渡っては入るのですかね・・・
natady

2016/09/15 08:28

回答に追記しましたので御覧ください。もしかして単にjsonをechoしていなかっただけでは…?
退会済みユーザー

退会済みユーザー

2016/09/15 08:39

回答ありがとうございます。sqlはちゃんとつながってたので原因ではなかったです。いろいろと調べた結果原因は本当に結果がNULLだったみたいです笑 $recの時点ですでにNULLになってました。ただ、sql文が間違ってるようにも見えないのでそこらへん調べてみます。もしsql自体間違ってたら教えてください・・・
退会済みユーザー

退会済みユーザー

2016/09/15 08:47

ほぼ解決しました。お付き合いいただいて本当に感謝しています。またなにか機会がありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問