2011-07-17 32 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看起來是這樣的:

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

這樣做的輸出出來是:

yaya1陣列( [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變量包含在引號中(並將其中的任何引號轉義),以便它可以安全地用作shell參數。

錯誤是你在單引號內有$part,所以它被直接發送到shell作爲$part,而不是被PHP替換的值。然後shell試圖尋找所謂$part來取代它外殼變量,但因爲當時沒有,它只是一個空白代替它。

此代碼還會工作:

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

然而,就不會包裹在單引號的變量,因此,如果有在任何空間,只有第一個字會被認爲價值的論點p,所有其他的將被視爲不同的論點。

它一般是發送參數時,一個shell命令,因爲它需要引用的論據,你的護理使用escapeshellarg()好的做法。

+0

作品感謝:d。 順便說一句,你可以告訴我什麼是錯誤。所以在將來我可以克服這些? – kritya

+0

我已經添加了更多的細節來解釋爲什麼你以前的代碼不工作。讓我知道是否有什麼你不明白的。 – EdoDodo

+0

是的,我讀到 – kritya