问题描述
|
我有一个问题,我是PHP的新手,我一直在从事一些练习。我目前正在研究的是创建一个简单的表单,该表单将搜索数据库(名字,姓氏)。然后应将返回的结果填充为另一种形式。这样,如果我想更新记录,我所要做的就是更改填充表格的值,然后单击“更新”。我创建数据库没问题。
以下是代码。 (请别笑,我是新手...我敢肯定有更有效的方法可以做到这一点,但我现在只是在玩耍)
形式如下:
<form action=\"\" method=\"post\">
<strong>Search for name</strong><br>
<label for=\"fname\">First Name</label>
<input type=\"text\" name=\"fname\">
<label for=\"lname\">Last Name</label>
<input type=\"text\" name=\"lname\">
<input type=\"submit\" name=\"submit\" value=\"Search\">
</form>
这是PHP:
if( isset( $_POST[\'submit\'] ) ){
$first_name = $_POST[\'fname\'];
$last_name = $_POST[\'lname\'];
if ( $first_name == NULL || $last_name == NULL ) {
echo \"please enter search record\";
}
else {
$query = \"SELECT first_name,last_name FROM formdata WHERE first_name LIKE \'%$first_name%\' OR last_name LIKE \'%$last_name%\'\";
$result = MysqLi_query( $conn,$query );
$result_array = MysqLi_fetch_row( $result );
$fname_value = $result_array[0];
$lname_value = $result_array[1];
echo \"
<form action=\'\' method=\'post\'>\\n
<label for=\'fname_u\'>First Name</label>\\n
<input type=\'text\' name=\'fname_u\' value=\'$fname_value\'>\\n
<label for=\'lname_u\'>Last Name</label>\\n
<input type=\'text\' name=\'lname_u\' value=\'$lname_value\'>\\n
<input type=\'submit\' name=\'update\' value=\'Update\'>\\n
</form>\";
}
}
if( isset( $_POST[\'update\'] ) ) {
$first_name_u = ( $_POST[\'fname_u\'] );
$last_name_u = ( $_POST[\'lname_u\'] );
$query_update = \"UPDATE formdata SET first_name = \'$first_name_u\',last_name = \'$last_name_u\' WHERE first_name = \'$fname_value\';\";
echo $query_update; // this is just for testing
}
直到我提交更新的信息为止,这段代码似乎都能正常工作并达到我想要的目的。我无法弄清楚如何将$ fname_value变量的值传递给条件条件if(isset($ _POST [\'update \']))。我以为我不能,因为他们是两个不同的职位?我真的不知道...我只需要找到一种方法来获取检索到的表单数据的值并将其用于WHERE子句。
再说一次,我很新,只是被这种东西弄湿了……任何帮助都会很棒
谢谢
解决方法
我认为您的代码中有错字。您的POST数据将保存到变量
$first_name
,但是在查询SQL时,您使用的是$first_name_r
而不是$first_name
。
, 我以为错字是答案,但我必须指出您犯的一个致命错误,那就是您正在将用户提供的输入直接传递到SQL查询中。这将使您的代码遭受一系列称为SQL注入攻击的恶意攻击。我并不是想讲道,但阅读并理解该文章,尤其是底部有关缓解的部分,非常重要。
我建议您改用以下方式:
$query = \'SELECT first_name,last_name \'.
\'FROM formdata WHERE first_name LIKE ? OR last_name LIKE ?;\';
$sth = mysqli_prepare($dbh,$query);
mysqli_stmt_bind_param($sth,\"s\",\'%\'.$first_name.\'%\');
mysqli_stmt_bind_param($sth,\'%\'.$last_name.\'%\');
$result = mysqli_execute($sth);
我知道它的时间更长且更复杂,但是请相信我,它将为您节省很多麻烦。越早了解这一点并使其根深蒂固,您永远也永远不会编写将未经消毒的输入直接传递到数据库的查询,我们所有人都会越快乐(并且您越会保持更长的时间)最终的工作。
很抱歉,如果我要坚挺,但我认为,在开发数据库驱动的网站时,您需要尽早学习的最重要的一课是,您确实需要精通发现注入漏洞是自动的,当您看到它时,会想到:“哦!不!不这样做!!!”
, 上面的答案找到了您的问题,但在旁注中:
$first_name = $_POST[\'fname\'];
$last_name = $_POST[\'lname\'];
不要这样做。我的朋友是php应用程序中最常见的安全漏洞。
编写脚本时要记住的最重要的两件事是
过滤输入,以及
2:转义输出。
有关更多详细信息,请参见此文章。
在您的情况下,不会过滤输入值,也不会检查输入的恶意/不正确值。
这是此页面上的另一本入门手册,以了解一些提示以及如何解决过滤问题。
继续努力,这些练习是捡起排骨的好方法。
快乐的编码朋友。
, 好的,重新阅读您的帖子,我想我知道您正在尝试做什么以及您遇到的困难。通常,对于一种相同的形式,您不会有两个单独的页面。通常,您将按照以下方式对它进行更多编码,并且请记住,我将其从我的头上移开,而不是实际对其进行测试,因此可能需要进行较小的更正和/或调整:
<?php
$fname_value = \'\';
$lname_value = \'\';
if (isset($_POST[\'submit\']) && $_POST[\'submit\'] === \'Search\') {
if (isset($_POST[\'fname\']) && isset($_POST[\'lname\'])) {
// We are processing a submitted form,not displaying a brand new one
// from scratch. Code any post-validation steps.
// Fetch the user information from the database. You\'ll need to define
// the $host,$user,$password,and $dbname variables above,or
// substitute literal strings with real information in here.
$dbh = new mysqli($host,$dbname);
$sql = \'SELECT first_name,last_name\'.
\'FROM formdata WHERE first_name LIKE ? OR last_name LIKE ?;\';
$sth = $dbh->prepare($sql); // Use parameters to avoid injection!
$sth->bind_param(\'s\',$_POST[\'fname\']);
$sth->bind_param(\'s\',$_POST[\'lname\']);
if ($sth->execute()) {
$result = $sth->get_result();
if (($row = $result->fetch_assoc()) != NULL) {
// Set the default values displayed in the text edit fields.
$fname_value = $row[\'first_name\'];
$lname_value = $row[\'last_name\'];
}
}
// Whatever other processing you want to do if this is a submitted
// form instead of displaying the page from scratch.
}
}
?>
<html>
<body>
<form action=\"<?= $_SERVER[\'PHP_SELF\'] ?>\" method=\"POST\">
<strong>Search for name</strong><br />
<label for=\"fname\">First Name</label>
<input type=\"text\" name=\"fname\" value=\"<?= htmlentities($fname_value) ?>\">
<label for=\"lname\">Last Name</label>
<input type=\"text\" name=\"lname\" value=\"<?= htmlentities($lname_value) ?>\">
<input type=\"submit\" name=\"submit\" value=\"Search\">
</form>
</body>
</html>