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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2285閲覧

PythonとPHPの連携方法

Yt182

総合スコア4

MySQL

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/10 15:45

編集2021/05/11 07:01

システムのログイン機能を作成しており、

PythonからIDやPWの入ったリクエストをPHPへ送り、PHPは受け取った情報を元にMySQLへ一致するIDとPWが存在するか照会を行い、「ログイン成功/ログイン失敗」のいずれかを返し、Pythonでその後の動きを分岐していく、という流れで作成したいと思っております(分かりづらかったらすみません)

Python→PHPへ何かしらの値を渡す部分は書けました。以下です。

Python

1import requests, json 2TO_URL = "http://localhost:8888/------/test/jsonposttest.php" 3json_data = { 'hoge': 'piyo' } 4headers = { 'Content-Type': 'application/json' } 5response = requests.post( TO_URL, data=json.dumps(json_data), headers=headers ) 6print( "status:", response.status_code ) # 200

上記はテストとして簡単なJSONファイルをURLで渡すような形にしていますが(本来であればIDをやPWの情報が入ったJSONファイル)、
エラーを起こさず完了しているので、TO_URLにて指定したPHPへ無事JSONファイルは渡せているのでは、と思っています。

以下、受け取る側のPHPのコードです。

PHP

1<?php 2//application/jsonで送信されてきた場合の処理 3$request = json_decode(file_get_contents('php://input'), true); 4 5//$requestの内容を元にjsonを作成(実際はIDとPASSWORDの突き合わせ処理など色々な処理が入ると思いますがそこは省略) 6$json = ['auth' => 'false']; 7 8//application/jsonでpython側に返す 9header("Content-Type: application/json; charset=utf-8"); 10echo json_encode($json);

本来であれば、Python側から受け取ったJSON形式の文字列(IDやPW)をデコードし、MySQLへ接続して照合を行い、その結果「ログイン成功/失敗」を返すような仕様ですが、
取り急ぎ、簡単なPythonとPHPでのJSON形式配列のやり取りをテストとして実現したく思っております。
この場合、PHPのecho部分をPythonへ返し、表示させたいです。

どなたかご協力頂けると助かります。
何卒、宜しくお願い致します。

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

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

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

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

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

AbeTakashi

2021/05/10 16:07 編集

何が疑問なのかイマイチつかみかねるのですが、PHP側でjsonデータ(ログイン成功 o r失敗)を返して、pythonでそのデータを受け取ればいいだけの話なのでは? そういう話じゃないんですかね? 参考) https://note.nkmk.me/python-requests-web-api/ PHP側の書き方が何一つ分からないというレベルの話であれば、さすがに一から教えるのは大変だと思うのですが・・・
m.ts10806

2021/05/10 21:51

>簡単なJSONファイルをURLで渡すような形にしていますが コード見た感じファイルではなくJSON形式の配列のように見えます。
m.ts10806

2021/05/10 21:51

ひとまず jsonposttest.php のコードも提示してください。
Yt182

2021/05/11 00:44

TakashiAbe様 >PHP側でjsonデータ(ログイン成功 o r失敗)を返して、pythonでそのデータを受け取ればいいだけの話なのでは? そのとおりです。PHP側かわPython側への返し方がわからず、、、、
Yt182

2021/05/11 00:44

m.ts10806様 PHPコードを追記しました
Y.H.

2021/05/11 07:12

print( "body:", response.text ) で見るとレスポンスの内容が見られませんか?
Yt182

2021/05/11 07:15

Y.H様 見れました 完全に仕組みを履き違えておりました 精進します
guest

回答1

0

ベストアンサー

PHP

1<?php 2//application/jsonで送信されてきた場合の処理 3$request = json_decode(file_get_contents('php://input'), true); 4 5//$requestの内容を元にjsonを作成(実際はIDとPASSWORDの突き合わせ処理など色々な処理が入ると思いますがそこは省略) 6$json = ['auth' => 'false']; 7 8//application/jsonでpython側に返す 9header("Content-Type: application/json; charset=utf-8"); 10echo json_encode($json);

PHP側は超シンプルに書けばこんな感じでしょうか(最低限なので細かいところで色々足りないかもしれませんが)。PHPとMySQLとのやりとりはまた長くなるのでご自身で色々調べてやってみてください。

PHPにはWEBフレームワークが豊富で、すべてを一から書かずにWEBフレームワークに任せちゃうのが楽です(使い方覚える必要がありますが)。DBとのやりとりやjsonの出力もWEBフレームワークにはあらかじめ用意されています。ググるとLaravelとかCakePHPとか色々出てきますので、そういうのも調べてみるといいと思います。

Pythonはある程度理解されてるようですので、おそらくPHPの理解が足りていないだけだと思います。普通にPHPを基礎から学ばれて、Python程度まで理解できればこの辺まではすらっと普通に書けるようになると思います。WEBフレームワークに手を付けるにしても、まずはPHPの基礎を学ばれるといいと思います。


現状は学習フェーズだと思うのでここまでお伝えする必要はないかもしれませんが、生パスワードをJSONに入れてそれをそのまま送って認証をするようなことは、現実世界ではあまり行われていないというか、セキュリティ的にはよろしくありません(生パスワードをJSONに入れるかどうかまでは言及されてませんが)。個人のローカルネットワーク内だけでやるとかならいいですが。普通の安全な認証を行いたいのであれば、やはりこの辺は自前でやらずにWEBフレームワークに頼った方がいいです。

投稿2021/05/11 01:20

編集2021/05/11 04:23
AbeTakashi

総合スコア4853

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

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

Yt182

2021/05/11 03:28

TakashiAbe様 ご回答ありがとうございます。 $jsonに格納した['auth' => 'false'];はPython側で確認ができました。 この場合、$requestにPythonから受け取りJSON配列が正しく格納されているかどうかを確認する方法はありますでしょうか? 自分なりに、Abe様のコードの「$json =」以下を「$json = $request」にしてみたりしましたが、 Python側ではNULLと返ってきてしまいました。 この場合、PythonからPHPへJSON配列が正しく受け渡しできていないということでしょうか? PHPの学習不足ですみません。 ご回答、お待ちしております。
AbeTakashi

2021/05/11 04:14

「$requestにPythonから受け取りJSON配列が正しく格納されているか」についてですが、JSONフォーマットのチェックはjson_last_error関数でチェックできます https://www.php.net/manual/ja/function.json-last-error.php もしくはPHP7.3以降ならJSON_THROW_ON_ERRORで例外を受け取れます(実は私も今調べて初めて知った) https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc#json_throw_on_error JSONフォーマットは正しいけど中身が正しいかどうかは普通にif文と$requestを使って判断するしかないと思います。 後半の「自分なりに…」以降はちょっと意味が分からないというか、何をしているか分かりません。修正したコードとやろうとしていることを提示してもらえば何かしらお伝えできることはあるかもしれません。その場合はここに書かずに、質問文を修正なり追記なりして頂ければと思います(私以外の人も答えられるように)。
Yt182

2021/05/11 05:01

Abe様 最後のecho json_encode($json);では、「$json」に格納された値をJSON形式にエンコードして出力、という意味かと思いますが、(ここでは['auth' => 'false'];をJSON形式にエンコードして出力) ここで出力された値をPythonで拾ってプリントして確認している形になります。 なので、コード1行目にある「$request」を出力するように書き換えれば(echo json_encode($request);)、「$request = json_decode(file_get_contents('php://input'), true);で一度デコードしたPythonから受け取ったJSON配列を再度エンコードして出力するので、1行目でちゃんとPythonからJSON配列を受け取れているか確認できるはずだ」と考えました。 わかりづらかったら申し訳ございません
AbeTakashi

2021/05/11 06:16

「現状だと$requestの中にpythonで送ったデータが入ってこない」ということでしょうか?  わざわざpythonに$requestの中身をそのまま返そうとする意味が分からなくて(私の理解力が低いからかもしれませんが)。そういうことであれば別の原因がありそうなので、別の調査をしないとなりませんが。
Yt182

2021/05/11 07:03

Abe様 すみません。完全に私の理解不足です。 書いていただいたコードの、 header("Content-Type: application/json; charset=utf-8"); echo json_encode($json); ↑この部分で何らかの値をPythonに返せているのでしょうか? ターミナルからPythonデータを実行しても何も表示されず、返ってきているのかどうかがわかりません。 初歩的すぎるかもしれませんが、宜しくお願い致します。
AbeTakashi

2021/05/11 08:12

そういうことだったんですね。解決して良かったです。「ターミナルからPythonデータを実行しても何も表示されず」この一文があれば私ももう少し違った方向からアドバイスできたと思います。質問に関しては以下のページを熟読して必要な情報を載せるようにした方がいいと思います。 参考) https://teratail.com/help/question-tips 回答する前にも書きましたが、何が分からない、何が困っているのかを伝えていただかないと厳しいです。「表示させたいです」だけではダメで、「現状はこうです」というのもしっかり伝えるといいと思います(それを引き出せなかった私にも非はあるのですが)。 最後に回答の最後に認証について追記してあるので、こちらも読んで頂ければと思います。繰り返しになりますが、生のパスワード文字列をそのままJSONに含めて送るとかは通常はしてはいけないので、この辺もしっかり学んで頂ければと思います。
Yt182

2021/05/12 02:25

Abe様 色々とありがとうございました。 私の質問の仕方が悪く、お手数おかけしました。 PWをJSONでそのまま送信することについても追々学んでいきたいと思います。 また機会がございましたら宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問