PHP,有关搜索和更新记录的问题

问题描述

| 我有一个问题,我是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>
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...