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

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

ただいまの
回答率

90.60%

  • PHP

    19862questions

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

  • jQuery

    6540questions

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

php exec 「"」エラー

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 825

come25136

score 240

<?php
    if (isset($_POST["pwm"])) {
        exec("gpio pwm 18 $_POST["pwm"]");
    } else {
    }
?>
現在jQuery-ajax(post)から受け取った変数でexecを実行しようとしているのですが
「"」が原因でうまく動きません><
"pwm"の「"」を取ればうまくいくのですが
そうすると変数が取れないのでダメなんです

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

動作環境は
  raspberry pi b+
  gpio18(pwm)
です
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/27 21:50

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

    キャンセル

checkベストアンサー

+1

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

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

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


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

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

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/27 22: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/

    キャンセル

  • 2015/04/28 10: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`に置き換える必要があります。

    キャンセル

  • 2015/04/28 20:27

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

    キャンセル

  • 2015/04/28 20: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`のようなコマンドになります。

    キャンセル

  • 2015/04/28 21:17

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

    キャンセル

  • 2015/04/29 06: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 '不正なアクセス';
    }
    ```

    キャンセル

  • 2015/04/29 09:19

    早朝からコメントありがとうございます

    > 直前のコメントで例示したコードにおいて、検証用に書き換えていた箇所を戻していませんでした。

    こちらこそすみません全く気づいていませんでした(-_-;)
    ただ今回のような仕組みが簡単な場合は一応どういうものか理解してから使っているので
    前回の編集ではif文の所だけ書き換えていたのであまり支障は出ませんでした

    ---
    最後までアドバイスをくださり有難うございました(_ _)
    おかげで自分が思っていたものが作れました

    また近々php関連で質問をすることがあると思いますのでその時もアドバイスを貰えると嬉しいです

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    raspberrypiのGPIO制御について

    raspberrypiのGPIOを用いて2つのDCモーターの制御を行うためのコードをpythonかcで書きたいです。 ソースコードは落ちてるんですが、pwmoutput.Chang

  • 解決済

    【PHP】リダイレクト時のメッセージと文字判定

    form.php→check.php→send.phpの3つのファイルを使ったお問い合わせフォームで、 未入力の場合の(check→formへ)リダイレクトは成功したのですが、 1

  • 解決済

    PHPパスをPHPから調べる方法はありますか?【その2】

    cron,execコマンドを実行する時に必要となる php パス の調査方法について 下記のような方法があることを教えていただきました。 https://teratail.com/

  • 解決済

    PHP ファイルをアップロードできません。

    phpでフォームからcsvファイルを受け取るコードを書いています。 受信側で「アップロードできません」のエラーが取れず困っています。 ファイルサイズは小さく、php.iniのfil

  • 解決済

    PHP:簡易掲示板の編集機能

    PHPで簡易掲示板を作っております。 下記コードで編集機能を実装しようとしています。 「各投稿番号とPOST送信されてきた編集番号を比較し、等しい場合、配列値を取得する」 ことはで

  • 解決済

    ラジオボタンにチェックが入ったら関数を呼び出したい。

    よろしくお願いします。 ラジオボタンにチェックが入ったら、phpの関数を呼び出したいです。 <?php //ラジオボタンにチェックが入ったらこの関数を呼び出す function

  • 解決済

    header関数でURLパラメータに$_REQUEST['hoge']を使いたい

    header関数のパラメータとして、リクエストに格納されている情報を渡したいのですが、 下記のように記述するとエラーになってしまいます。 /* エラー発生 */ heade

  • 解決済

    phpで作るhigh&low ゲームについて

     前提・実現したいこと 結果表示画面を作成して、送信情報を画面に表示させたい ■■な機能を実装中に以下のエラーメッセージが発生しました。  発生している問題・エラーメッセー

同じタグがついた質問を見る

  • PHP

    19862questions

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

  • jQuery

    6540questions

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