🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Python

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

Q&A

解決済

4回答

1376閲覧

PHPのexec()からSQLのINSERT文を実行するpythonを動かすことはそもそもできないのでしょうか?

tomoyuki500219

総合スコア21

PHP

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

Python

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

0グッド

0クリップ

投稿2021/01/18 05:36

編集2021/01/19 05:38

PHPのexec()からSQLのINSERT文を実行するpythonを動かすことはそもそもできないのでしょうか?
INSERTされなくて困っています。
ご教示の程、よろしくお願いいたします

python側(HCN682.py)  connect = MySQLdb.connect(user='root',passwd='9999',host='192.168.0.100',db='tool') cursor = connect.cursor() cursor.execute("insert into td_hcn6800_2_test (pkno,tno) values(%s,%s)" % (1,1)) connect.commit() cursor.close connect.close PHP側 $name = 'python HCN682.py'; exec($name);

追記1:
exec()に$statusを加えてvar_dump($status);してみたら、int(1)が返ってきました。失敗しているようです

$name = 'python HCN682.py'; exec($name,$output,$status); var_dump($status);

追記2:
PHPからpythonは実行することはできるのですが、やはりpython内でINSERT文が効きません。
なにかMySQL側で権限の付与等が必要なのか…と思ってしまいます。ご意見ありましたら、よろしくお願いいたします。

追記3:
import MySQLdbでコケている感じもします。フルパスは必要?(フルパスがわかりません)

追記4:
下記コマンドを実行すると、
$name = 'python HCN682.py 2>&1';
exec($name,$output,$status);
var_dump($status);
var_dump($output);

下記が表示されました。

int(1) array(4) { [0]=> string(34) "Traceback (most recent call last):" [1]=> string(74) " File "C:\Apache24\htdocs\mazak\mazak_php\HCN682.py", line 4, in " [2]=> string(18) " import MySQLdb" [3]=> string(46) "ModuleNotFoundError: No module named 'MySQLdb'" }

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

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

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

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

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

m.ts10806

2021/01/18 05:50

なにかエラー等起きてませんか。
tomoyuki500219

2021/01/18 06:55

ご回答ありがとうございます ターミナルでpython HCN682.pyを実行すると正常にINSERTされています。 PHPでもブラウザにエラー表示がされていることもなく、エラーの確認方法がわかりません。
m.ts10806

2021/01/18 07:30

PHPのデバッグ方法が分からないということでしょうか? そのまま検索ワードにして出てきます
tomoyuki500219

2021/01/18 23:19

ありがとうございます。すぐにできなかったのですが、デバッグ環境作成試みる予定です
Y.H.

2021/01/19 02:03

以下のように標準エラー出力も$outputに出力できるようにして、var_dump()で$outputの内容を表示し実行結果を質問に追記ください。 $name = 'python HCN682.py 2>&1'; exec($name,$output,$status); var_dump($status); var_dump($output);
tomoyuki500219

2021/01/19 03:37

下記が表示されました。 int(1) array(4) { [0]=> string(34) "Traceback (most recent call last):" [1]=> string(74) " File "C:\Apache24\htdocs\mazak\mazak_php\HCN682.py", line 4, in " [2]=> string(18) " import MySQLdb" [3]=> string(46) "ModuleNotFoundError: No module named 'MySQLdb'" }
Y.H.

2021/01/19 03:42

ここに記載されても埋もれてしまいますので に追記した方が解決に繋がりやすいですよ。
tomoyuki500219

2021/01/19 05:40

ご指摘ありがとうございます 追記として記入しました。 (やはりMySQLdbのモジュールがないように読めました。読めるようにインポートするのか…。そうであれば、思いつかずで…)
guest

回答4

0

出来ないわけがありませんので、エラーメッセージなどで原因を調べましょう。

おそらくは、

$name = 'python HCN682.py';

で、相対パスで指定しているのでファイルが見つかっていない。
絶対パス相対パスの使いやけや、カレントディレクトリの概念を理解していない場合、プログラム中で書くファイル名は全部絶対パスにしましょう。絶対パスというのは分かりますか?

投稿2021/01/18 05:55

otn

総合スコア85886

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

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

tomoyuki500219

2021/01/18 06:59

ご回答ありがとうございます PHPと同じフォルダにpythonも置いています。 フルパスで実行してみましたが、やはりダメでした。
tomoyuki500219

2021/01/18 10:54

できない訳ないですよね!… なにか想像できる解決案がありましたら、引き続きご教示お願いいたします
tomoyuki500219

2021/01/19 00:35

Web環境ではできない、apache からの実行では、権限が厳重に封止されているので。という意見を伺いました…。
otn

2021/01/19 01:45

> エラーメッセージなどで原因を調べましょう。
tomoyuki500219

2021/01/19 08:34

追記4:にエラーを記載させていただきましたが、やはりMySQLdbのモジュールがないように読めました。読めるようにインポートするのか…。そうであれば、思いつかずで…
otn

2021/01/19 09:34

モジュールをインストールしたつもりなのに、importでエラーが出ていると言うことであれば、 このサイトで頻繁に質問されているように、Pythonの環境が複数あって、インストールした環境と、実行している環境が違うのでしょう。 環境を把握して、正しく使いましょう。
otn

2021/01/19 22:58

↑意味がわかりませんか?
tomoyuki500219

2021/01/20 08:49

回答遅くなり申し訳ございません。 意味はわかっていると思います 確かに、pythonの環境は複数あると思います。ただ、私の判断では今の環境を変えれない状況でして…。
otn

2021/01/20 09:55

変える必要は無くて、自分がどのPythonを使うか、1つを選択すれば良いだけだと思いますけど。
guest

0

自己解決

"ModuleNotFoundError: No module named 'MySQLdb'"からヒントを得て、MySQLdb関連のライブラリをphpファイルのあるフォルダ直下に格納したら、INSERTできました。
なぜ、PHPから実行するときはpythonだけで実行したときのMySQLdbのフォルダを参照しに行かないのか疑問ですが。

投稿2021/01/19 22:55

tomoyuki500219

総合スコア21

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

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

0

まず、動いているpythonが同じものかどうかの確認をしましょう。
pythonコマンドの存在するディレクトリは以下で求められます。

python

1import io 2x = io.__file__ 3path = x[:x.find('lib')] 4print(path)

このプログラムを以下の2通りで動かしてみてください。
0. ターミナルでpython test.py として動かす
0. PHPから呼び出す。

これが違っていたら、それが原因です。
その場合は、PHPから呼び出すのを

PHP

1$name = 'python test.py'; 2exec($name);

を、上記のターミナル事項結果で示されたフルパスとソースファイルフルパスを使って

PHP

1$name = 'フルパス\python ソースファイルフルパス\test.py'; 2exec($name);

に変更するとどうなるかを試してみてください。

投稿2021/01/18 11:50

編集2021/01/18 12:00
ppaul

総合スコア24670

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

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

tomoyuki500219

2021/01/18 22:58

ご回答ありがとうございます。恐縮です。 ターミナル、PHPどちらもパスは同じとなりました。 C:\Program Files (x86)\Python\ $name = 'フルパス\python ソースファイルフルパス\test.py';もやってみましたが、ダメです。
guest

0

厳密に言えばできないことはないでしょうけど、phpかpythonで
完結させたほうが効率的で問題も起こりにくいと思います

投稿2021/01/18 05:50

yambejp

総合スコア116681

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

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

tomoyuki500219

2021/01/18 07:03

ご回答ありがとうございます わかりにくい文章で恐縮ですが、INSERTしたいデータをC言語で取得するAPIがあるのですが、C言語をpythonで置き換えをする処理をしていて、このpythonで取得したデータをDBにINSERTするためpythonで処理させたい感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問