我的代码中有一个错误,可能看起来非常简单,但是我已经看了好几个小时,而且还没有能够确定问题。
要编辑数据库记录,我使用以下链接将记录ID传递到编辑页面:
<a href="edit_short.php?id=<?php echo $short->id; ?>">Edit</a>
...这里是edit_short.php
文件:
$title = "";
$short_text = "";
$id = 0;
if (isset($_GET['id'])) {
$id=$_GET['id'];
$short = (object)Short::find_by_id($id);
$title = $short->title; //my problem is the scope of $title and $short_text
$short_text = $short->short_text; //is limited within this if statement
}
if (isset($_POST['edit_short_btn'])) {
echo $title."<br/>";
echo $short_text."<br/>";
}
这是提交的表单:
<form method="POST" action="edit_short.php" id="post_form">
<table>
<tr>
<td><input type="text" name="title" value="<?php echo $title; ?>" class="textField" placeholder="Title of short"></td>
</tr>
<tr>
<td><textarea name="short_text" id="short_text" placeholder="Short text"><?php echo $short_text; ?></textarea></td>
</tr>
<tr>
<td><input type="submit" name="edit_short_btn" value="Update short"></td>
</tr>
</table>
</form>
我能够验证提交的id是使用$_GET['id']
设置的,我可以将其值传递给edit_short.php
中的$ id,但是当我获取记录并设置$ title和$ short_text变量时,我无法在if (isset($_POST['edit_short_btn']))
声明中访问它们。
如何检查$_GET['id']
和$_POST['edit_short_btn']
是否已设置且仍能显示$title
和$short_text
感谢您的帮助
答案 0 :(得分:3)
根据您的代码,您将永远不会同时拥有$_GET
案例和$_POST
案例。单击链接(页面URL将包含$_GET
查询字符串)后,您将点击?id=...
案例,并在提交表单后点击$_POST
案例(无查询字符串)。< / p>
答案 1 :(得分:2)
GET
仅在链接点击时发送。您的表单正在发送POST
,因此您需要的所有数据点都应该在表单中。您可以使用hidden
输入类型在表单中隐藏值。所以你应该可以使用:
<form method="POST" action="edit_short.php" id="post_form">
<input type="hidden" value="<?php echo intval($_GET['id']);?>" name="id" />
<table>
<tr>
<td><input type="text" name="title" value="<?php echo $title; ?>" class="textField" placeholder="Title of short"></td>
</tr>
<tr>
<td><textarea name="short_text" id="short_text" placeholder="Short text"><?php echo $short_text; ?></textarea></td>
</tr>
<tr>
<td>
</form>
然后在处理脚本上使用$_POST['id']
来获取id
。 intval
是一种XSS预防方法,因为id
只是一个整数。对于其他防止XSS注入的方法,请参阅(这不会停止SQL注入,参数化查询仍应用于处理脚本):
How to prevent XSS with HTML/PHP?
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet