0

我正在尝试创建一个 php 表单来更改我的 vps 上文件中的值。这是我正在尝试的代码:

<?php
echo "<form ";  
    $type = (int)$_POST['animal_type'];                  
    echo exec("sed -i 's/animal=*/animal=$type/g' /home/user1234/animals/file.props");
    echo "method='post'>";
    echo '<select name="animal_type" onChange="this.form.submit()">';
    echo '<option value="bat">bat</option>';
    echo '<option value="fish">fish</option>';
    echo '<option value="cat">cat</option>';
    echo '<option value="dog">dog</option>';
    echo '</select>';
 echo '</form>';
?>

我再次更新了我的代码。目前,它只是将 00 添加到 file.props 中的 animal= 值,而不是用表单中选择的值覆盖当前值。

php 页面上表单中的值也永远不会改变,并且始终保持为 bat。

每次我尝试刷新页面时,我也会收到此消息:“要显示此页面,Firefox 必须发送将重复之前执行的任何操作(例如搜索或订单确认)的信息。”

除了 sed 和 exec 之外,还有更好的方法来更改这些值吗?或者我还在我的代码中做一些不正确的事情吗?

4

1 回答 1

1

表单的action 属性需要指定一个 URI。相反,有一个exec函数返回一个字符串。我假设这个字符串不是有效的 URI。所以在 html 的源代码中,它看起来像这样:

<form action=some string returned by exec>

正在发生的事情如下:

  1. 页面已加载
  2. exec('sed....') 被处理并将结果放入 html
  3. 用户单击提交并被带到操作中指定的 URI。在这种情况下,它是 exec('sed....') 结果的最后一行

我建议您通过更改表单以发布到另一个页面<form action="changeFile.php">然后在 changeFile.php 添加逻辑来修改 VPS 文件来简化此操作。

例如,在 changeFile.php 添加逻辑以更改内容,如下所示:

<?php    
exec("sed -i 's/animal=*/animal=$_REQUEST['type']/g' /home/user1234/animals/file.props");
echo 'file modified'
?>

这也可以通过将页面发布到自身来实现,如下所示:

<?php
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

if(!empty($_REQUEST['animal_type'])){
    exec('sed -i '.escapeshellarg('s/animal=*/animal='.$_REQUEST['animal_type'].'/g')." /home/user1234/animals/file.props");
    echo 'File has been updated';
}
?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <select name="animal_type">;
        <option value="true">bat</option>;
        <option value="false">fish</option>;
        <option value="cat">cat</option>;
        <option value="dog">dog</option>;
    </select>
    <input type="submit" name="Submit" value="Submit" />
</form>
于 2013-03-06T21:32:09.273 回答