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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1888閲覧

php exec 「"」エラー

come25136

総合スコア258

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2015/04/27 09:22

lang

1<?php 2 if (isset($_POST["pwm"])) { 3 exec("gpio pwm 18 $_POST["pwm"]"); 4 } else { 5 } 6?>

現在jQuery-ajax(post)から受け取った変数でexecを実行しようとしているのですが
「"」が原因でうまく動きません><
"pwm"の「"」を取ればうまくいくのですが
そうすると変数が取れないのでダメなんです

どうか解決方法を教えて下さいm(_ _)m

動作環境は
raspberry pi b+
gpio18(pwm)
です

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

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

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

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

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

guest

回答2

0

exec("gpio pwm 18 $_POST["pwm"]");

exec("gpio pwm 18 " . $_POST["pwm"]);

にしてみたらいかがでしょうか?

投稿2015/04/27 09:24

shu21

総合スコア106

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

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

come25136

2015/04/27 12:50

回答有難うございます 今回はsounisi5011さんのほうが詳しく書いてくれたので ベストアンサーにはしませんでしたが 回答が早かったのでフォローさせてもらいました
guest

0

ベストアンサー

回答とは無関係ですがいくつか指摘が。

まず、実行する処理が無いならば、elseは省略してしまったほうが良いでしょう。

また、$_POSTを直接execに渡すことは非常に危険です。
(Ajaxからの送信であろうと)$_POSTはいくらでも改変できますので、ホワイトリスト等による検証を行ってください。
PHP - $_GET, $_POSTなどを受け取る際の処理 - Qiita


普通に、結合演算子ではだめでしょうか?

lang

1<?php 2if (isset($_POST['pwm'])) { 3 exec('gpio pwm 18 '.$_POST['pwm']); 4}

どうしても埋め込みたいなら、以下のようにして埋め込めます。
{}が無いとうまく動きません。

lang

1<?php 2if (isset($_POST['pwm'])) { 3 exec("gpio pwm 18 {$_POST['pwm']}"); 4}

ただし、上記のいずれも、コマンドに直接文字列を指定している点で問題です。
Raspberry Piには詳しくないので、gpioコマンドがどのようなものなのかは把握できていませんが…
以下のような実装にした方がより良いでしょう。

コマンドに渡している文字列$_POST["pwm"]を単一の引数と仮定し、文字列をコマンドの引数として安全になるようescapeshellarg関数でエスケープしています。

lang

1<?php 2if (isset($_POST['pwm'])) { 3 exec('gpio pwm 18 '.escapeshellarg($_POST['pwm'])); 4}

ただし、これも「より良い」実装でしかありません。
コマンドに渡す文字列がある程度決まっているならば、その「決まっている文字列」のみを受け付け、他をエラーとする実装が最も適切です。
(これは、ホワイトリストと呼ばれる手法です)

前述したように、gpioコマンドについて詳しく知らないので、これ以上の回答は出せません。

投稿2015/04/27 09:58

編集2015/04/28 01:46
sounisi5011

総合スコア697

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

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

come25136

2015/04/27 13:02

詳しい回答有難うございます 今回ホワイトリストと言う言葉が出てきたのですが 使わないかなと最初は思っていたのですが (LAN内だけ&gpioが数字以外弾く&認証システムがあるから) 勉強も兼ねて使ってみることにしました で最終的にアドバイス&拡張性も含めてこうなりました <?php if (isset($_GET["pwm"])) { if (preg_match_all('/^[0-9]+$/', $_GET["pwm"])){ exec('gpio pwm 18'.$_GET["pwm"]); } else { echo '<meta charset="UTF-8">'; echo '不正なアクセス'; } } else { echo '<meta charset="UTF-8">'; echo '不明なアクセス'; } ?> 最後にgpioについてはこちらのサイトで詳しく書かれています http://www.e-ark.jp/2013/05/06/wiringpi-gpio-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
sounisi5011

2015/04/28 01:48

文字列が数字文字のみかどうかを判定するだけならば、ctype_digit関数というものがあります。 正規表現はPHPでは重いので、こちらを利用したほうが良いです。 http://php.net/manual/ja/function.ctype-digit.php また、filter_input関数を使用することで、$_POST["pwm"]が定義されていることと文字列であることを一回で検証できます。 (すみません、文字列が必要である事は質問本文のコードを見れば分かることでしたが、回答ではfilter_input関数について言及できていませんでした) http://qiita.com/mpyw/items/2f9955db1c02eeef43ea#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E3%81%BF%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B これらを踏まえ、私ならば以下のように実装します。 ```lang-php <?php $pwm = filter_input(INPUT_POST, 'pwm'); if ($pwm && ctype_digit($pwm)){ exec('gpio pwm 18 '.$pwm); } else { echo '<meta charset="UTF-8">'; echo '不正なアクセス'; } ``` なお、コメントのコードが質問本文とは違い、`$_POST["pwm"]`ではなく`$_GET["pwm"]`な点が気になりますが… 上記のコードでは質問本文に従い、`$_POST["pwm"]`と仮定します。 `$_GET["pwm"]`の場合、filter_input関数の第一引数に指定している定数`INPUT_POST`を`INPUT_GET`に置き換える必要があります。
come25136

2015/04/28 11:27

色々とアドバイスありがとうございます(_ _) しかし「0」だけfalseになってしまいます(使う数値は0から1023の間) あとPOSTの件については拡張性を含めた結果POST→GETとなりました
sounisi5011

2015/04/28 11:52

> しかし「0」だけfalseになってしまいます(使う数値は0から1023の間) すみません、見落としていました。 PHPでは、文字列の"0"もfalseと判定されてしまいます。 ちゃんと動作テストを行っていませんでした、申し訳ありません。 以下、処理を見直し、動作テストを行ったコードになります。 ```lang-php <?php $pwm = (string)filter_input(INPUT_GET, 'pwm'); if ($pwm!=='' && ctype_digit($pwm)){ echo('gpio pwm 18 '.$pwm); } else { echo '不正なアクセス'; } ``` "0"も正しく通ることを確認しました。 ただしこのコードでは、"0025"のような文字列を渡すと`gpio pwm 18 0025`のようなコマンドになります。
come25136

2015/04/28 12:17

ありがとうございます!! > "0025"のような文字列を渡すと`gpio pwm 18 0025`のようなコマンドになります。 に関しては$pwmの入力がhtml5から追加されたスライダーを使うので問題はないですが仕組み的に実行できると何かと気持ち悪いのでどうしたら良いのか教えてくれるとうれしいです
sounisi5011

2015/04/28 21:27

まず始めに謝罪を。 直前のコメントで例示したコードにおいて、検証用に書き換えていた箇所を戻していませんでした。 具体的には、4行目のexec関数をecho文に変更しており、また'<meta charset="UTF-8">'を省略してしまっていました。 申し訳ありません。 --- > $pwmの入力がhtml5から追加されたスライダーを使うので問題はないですが仕組み的に実行できると何かと気持ち悪いのでどうしたら良いのか教えてくれるとうれしいです 数値の先頭の0を取る方法にはいくつかあるのですが、ここでは最も簡単で、速度も早く、今回の用途にも適合する、int型への変換という手法を取ります。 http://kihon-no-ki.com/remove-0-at-the-beginning-of-the-string ```lang-php <?php $pwm = (string)filter_input(INPUT_GET, 'pwm'); if ($pwm!=='' && ctype_digit($pwm)){ exec('gpio pwm 18 '.(int)$pwm); // $pwmをint型に変換することで、先頭の0を取る } else { echo '<meta charset="UTF-8">'; echo '不正なアクセス'; } ```
come25136

2015/04/29 00:19

早朝からコメントありがとうございます > 直前のコメントで例示したコードにおいて、検証用に書き換えていた箇所を戻していませんでした。 こちらこそすみません全く気づいていませんでした(-_-;) ただ今回のような仕組みが簡単な場合は一応どういうものか理解してから使っているので 前回の編集ではif文の所だけ書き換えていたのであまり支障は出ませんでした --- 最後までアドバイスをくださり有難うございました(_ _) おかげで自分が思っていたものが作れました また近々php関連で質問をすることがあると思いますのでその時もアドバイスを貰えると嬉しいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問