是否可以通过 html 表单传递非用户信息


Is it possible to pass non-user information through an html form?

提前为菜鸟问题道歉:

我想要一个将 1) 用户定义的变量和 2) 预定义变量传递给 php 脚本的 html 表单。

这是 html:

<form action="update_db.php" method="post">
Before Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>
<form action="update_db.php" method="post">
After Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>

以下是update_db.php:

$rating=$_POST["rating"]; 
mysql_connect("localhost", "uname", "password") or die(mysql_error());
mysql_select_db("dbname") or die(mysql_error());
mysql_query("INSERT INTO ratings_table
(rating, before_or_after) VALUES($rating,$before_or_after)")
or die(mysql_error()); 

如您所见,我想为"之前"评级表单和"之后"评级表单调用相同的 php 脚本,然后使用用户定义的变量("rating")和预定义变量(before_or_after)更新数据库。我希望"before_or_after"在"之前"形式调用时update_db.php为"1",当"之后"形式调用时为"2"。

确信这个问题有一个简单的答案,或者我正在以完全错误的方式思考这个问题。

有什么建议吗?

那么为什么不在HTML中使用不同的post变量并编写一些额外的PHP呢?

<form action="update_db.php" method="post">
Before Rating: <input type="number" name="rating_before"><br>
<input type="submit">
</form>
<form action="update_db.php" method="post">
After Rating: <input type="number" name="rating_after"><br>
<input type="submit">
</form>

现在我们只检查在 PHP 中设置了哪一个。

if(isset($_POST["rating_after"])) $rating = $_POST["rating_after"]; 
if(isset($_POST["rating_before"])) $rating = $_POST['rating_before'];
mysql_connect("localhost", "uname", "password") or die(mysql_error());
mysql_select_db("dbname") or die(mysql_error());
mysql_query("INSERT INTO ratings_table
(rating, before_or_after) VALUES($rating,$before_or_after)")
or die(mysql_error()); 

将形式更改为:

<form action="update_db.php" method="post">
Before Rating: <input type="number" name="before_rating">
<input type="hidden" name="before_or_after" value="before"><br>
<input type="submit">
</form>
<form action="update_db.php" method="post">
After Rating: <input type="number" name="after_rating">
<input type="hidden" name="before_or_after" value="after"><br>
<input type="submit">
</form>

你的 PHP 使用 $_POST['before_or_after']

现在对于警告mysql_*不应再使用,这容易受到SQL注入攻击。

<form action="update_db.php?mood=1" method="post">
Before Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>
<form action="update_db.php?mood=2" method="post">
After Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>

并在update_db.php初始化 $before_or_after $before_or_after = $_GET['mood'];

您可能希望使用 $_GET 来解决问题:

<form action="update_db.php?r=1" method="post">
Before Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>   
<form action="update_db.php?r=2" method="post">
After Rating: <input type="number" name="rating"><br>
<input type="submit">
</form>   

那么在 PHP 中:

$r = (int)$_GET['r'];
if($r==1){//it's before 
}
else{//it's after
}

但是,请注意,$_GET 和"隐藏"值不能 100% 信任,而一些用户可以故意替换它们,例如,用 JavaScript(例如,他们可以发布一个"评级后"表单,参数指出它是"评级前")。如果用户发布一个表单而不是另一个表单没有多大意义,那么请这样做。