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

时间:2011-06-01 03:11:14

标签: php forms post

我有一个问题,我是PHP新手,我一直在做一些练习。我目前正在研究的是创建一个简单的表单来搜索数据库(名字,姓氏)。然后应将返回的结果填充到另一个表单中。这样,如果我想更新记录,我所要做的就是更改填充表单的值并点击Update。我创建数据库没问题。

以下是代码。 (请不要笑,我很新......我相信有更有效的方法可以做到这一点,但我现在只是在玩耍)

以下是表格:

<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子句。

同样,我很新,只是在这种东西上弄湿了......任何帮助都会很棒

由于

4 个答案:

答案 0 :(得分:1)

我认为你的代码中有拼写错误。您的POST数据将保存到变量$first_name,但在查询SQL时,您使用的是$first_name_r而不是$first_name

答案 1 :(得分:0)

我认为错字是答案,但我必须指出你犯了一个致命的错误,那就是你将用户提供的输入直接传递给SQL查询。这会将您的代码打开,引发一系列名为SQL injection攻击的恶意攻击。我并不是在试图说教,但是阅读和理解那篇文章非常非常重要,尤其是关于底部缓解的部分。

我建议你改用这样的东西:

$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, "s", '%'.$last_name.'%');
$result = mysqli_execute($sth);

我知道它有点长,更复杂,但相信我,它会为你节省头痛的世界。你越早了解这一点,并在你的心灵深处根深蒂固,你永远不会永远编写一个将未经过输入的输入直接传递到数据库的查询,我们将会更快乐(并且你最终能保住工作的时间越长。;)。

很抱歉,如果我的表现强劲,但在我看来,在开发数据库驱动的网站时需要尽早掌握的最重要的一课是,你真的需要精通发现注入漏洞。它是自动的,当你看到它时,你会想,“哦!不!不要那样做!”

答案 2 :(得分:0)

上面的回答找到了你的答案,但是旁注:

 $first_name = $_POST['fname'];
 $last_name  = $_POST['lname'];

不要这样做 。我的朋友是php应用程序最常见的安全漏洞。

编写脚本时最重要的两件事是

  1. 过滤输入,和 2:逃生输出。
  2. See this write-up for more details ..

    在您的情况下,不会过滤输入值,也不会检查恶意/不正确的值。

    以下是this page的另一篇文章,介绍了一些技巧以及如何解决过滤问题。

    坚持下去,这些练习是拾取排骨的好方法。

    快乐的编码朋友。

答案 3 :(得分:0)

好的,重新阅读你的帖子,我想我会看到你正在尝试做什么以及你遇到困难的地方。通常情况下,您不会有两个单独的页面用于同一个相同的表单。通常情况下,你会在这些方面对它进行更多的编码,请记住,我正在将它从头顶开始,而不是实际测试它,因此可能需要进行微小的修正和/或调整:

<?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, $user, $password, $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>