在HTML中编写一些简单的嵌入式PHP来执行python脚本,该脚本使用一些循环来根据HTML表单中多个文件输入的可能性多次运行脚本。它适用于单数,但就目前而言,当运行多个文件时,它似乎重复一些,并且仔细检查,似乎第一次被python脚本收到的变量是不正确的。我不知道它为什么这样做,它可能是非常明显的。所有帮助赞赏。
$len = count($_FILES["inputFile"]["name"]);
echo "length";
echo $len;
for($i = 0; $i < $len; $i++){
$dataIn = $_FILES["inputFile"]["tmp_name"][$i];
$originalName = $_FILES["inputFile"]["name"][$i];
echo "TMP Name:";
echo $dataIn;
echo "OriginalName";
echo $originalName;
exec("python /home/will/public_html/OrderAnalyser.py '$dataIn' '$originalName' 2>&1",$output);
foreach ($output as $out){
echo $out;
echo "<br />";
}
}
输出如下:
Executing...
length2TMP Name:/var/www/tmp/phpHzJFtQOriginalNamemicro_b001.jsonAnalysis Starting on file:
Input File: /var/www/tmp/phpHzJFtQ
Original Name: micro_b001.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
24
There is NO subargument of node:
24
Analysis Complete
TMP Name:/var/www/tmp/php9vQumSOriginalNamemicro_b002.jsonAnalysis Starting on file:
Input File: /var/www/tmp/phpHzJFtQ
Original Name: micro_b001.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
24
There is NO subargument of node:
24
Analysis Complete
Analysis Starting on file:
Input File: /var/www/tmp/php9vQumS
Original Name: micro_b002.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
22
20
is child of
22
21
is child of
22
Subargument of node:
22
is:
Post Order
There is NO subargument of node:
20
There is NO subargument of node:
21
Analysis Complete
Completed...
从这里可以看出,一旦它完成第一个文件(micro_b001.json),它应该移动到micro_b002。 PHP中的回声显示PHP中的变量是正确的,但是从python脚本看到的打印显示它再次使用初始变量(micro_b001)运行。为什么会这样?正如你所看到的,一旦它由于某种原因再次运行第一个,它实际上正确运行第二个,然后完成。为什么这样做很奇怪?我只是想不出来。
(另外,我意识到这是易受攻击的代码,等等,它现在并不重要)
答案 0 :(得分:5)
(按设计破解)exec
函数将命令的输出追加给定数组:
<强> 参数 强>
...
output
如果存在
output
参数,则指定的数组将填充该命令的每一行输出。尾随空格(例如\n
)不包含在此数组中。 请注意,如果数组已包含某些元素,exec()
将附加到数组的末尾。如果您不希望该函数附加元素,请在将数组传递给unset()
之前调用数组exec()
。
(强调我的)
因此你的python程序正确执行了两次。在第二个循环中,第一个命令的输出仍然存在于$output
中,第二个命令的输出附加到此。
修复应该是:
unset($output);
exec("python /home/will/public_html/OrderAnalyser.py '$dataIn' '$originalName' 2>&1",$output);