2011-07-17 4 views
2

斐伊川私はこのコードを持っている:php popen()はその中にスペースを入れますか?

  $handle = popen("php -q nah.php -p=". '$part' . " 2>&1", "r"); 
      while (!feof($handle)) 
      { 
       $read = fread($handle, 2096); 
        echo $read; 
      } 
      pclose($handle); 

そしてnah.phpは次のようになります。

yaya1アレイ(:

echo "yaya1\n"; 
$options = getopt("p:"); 
$part = $options["p"]; 
echo $part; 
print_r($options); 

これの出力は次のようにして出てきます [p] =>)

Whileメインファイルの$部分には内容があります。 エラーには何がありますか? エラーを修正するにはどうすればよいですか? おかげ そしてこのすべては、PHP-CLI

+0

PHP 5.3を実行していますか?そのバージョンで使用している関数のいくつかが変更されたため、確認する必要があります。 – EdoDodo

+0

はい5.2.3または5.3.2 lol – kritya

+0

これはどちらですか? 5.3.2では、実行したようにコマンドライン引数を等号で区切って指定することができます。 5.2.3ではそれを許さず、あなたが説明した出力を与えるでしょう。コマンドラインで 'php --version'を実行すると、バージョンを確認できます。 – EdoDodo

答えて

2

で行われますが、これとpopenを走るラインを交換したいと思うでしょう:

$handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r"); 

これは中escapeshellarg()[docs]機能を使用しています$part変数を引用符で囲んで(そしてその中に引用符をエスケープして)シェル引数として安全に使用できるようにする必要があります。

$partが一重引用符で囲まれていたため、値がPHPに置き換えられる代わりに、直接$partとしてシェルに送信されました。シェルはシェルという変数を検索しようとしましたが、それを置き換えるのに$partという変数がありましたが、何もなかったので空白で置き換えました。

このコードはまた、働いているだろう:

$handle = popen("php -q nah.php -p=". $part . " 2>&1", "r"); 

をしかし、それにスペースがあったので、もし、単一引用符内の変数をラップしなかったであろうこと、最初の単語だけが値と見なされていたであろう引き数pの場合、他のすべては異なる引き数とみなされていました。

シェルコマンドに引数を送るときは、引数を引用して処理するので、通常escapeshellarg()を使用することをお勧めします。

+0

ありがとうございます:D。 Btwそれで何が間違っていたのか教えてください。だから将来私はそれらを克服することができますか? – kritya

+0

前回のコードがうまくいかなかった理由を説明しました。あなたが理解できないことがあれば教えてください。 – EdoDodo

+0

そうですよね – kritya

関連する問題