PHP, вопрос о поиске и обновлении записи - PullRequest
0 голосов
/ 01 июня 2011

У меня вопрос, я новичок в 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.

Опять же, я очень новичок и просто намочил ногис такими вещами ... Любая помощь будет отличной

Спасибо

Ответы [ 4 ]

1 голос
/ 01 июня 2011

Я думаю, что в вашем коде есть опечатка. Ваши данные POST сохраняются в переменной $first_name, но при запросе SQL вы используете $first_name_r вместо $first_name.

0 голосов
/ 01 июня 2011

Хорошо, перечитайте ваш пост, я думаю, что вижу, что вы пытаетесь сделать, и где у вас возникают трудности. Обычно у вас не будет двух отдельных страниц для одной и той же формы, как эта. Как правило, вы будете кодировать его более точно по этим направлениям, и, пожалуйста, имейте в виду, что я вычеркиваю это из головы, а не проверяю его, поэтому могут потребоваться незначительные исправления и / или настройка:

<?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>
0 голосов
/ 01 июня 2011

Над ответом нашёл свой вопрос, но по sidenote:

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

Не делайте этого .Мой друг - самая распространенная уязвимость безопасности для приложений php.

2 наиболее важных вещи, которые следует помнить при написании сценариев:

  1. Вход фильтра и 2: Выход Escape.

См. Эту статью для получения более подробной информации ..

В вашем случае входные значения не фильтруются или проверяются на наличие вредоносных / неправильных значений.

Вот еще один учебник по на этой странице , где приведены несколько советов и способы фильтрации адресов.

Так держать, эти упражнения - отличный способ собрать отбивные.

Счастливый кодирующий друг.

0 голосов
/ 01 июня 2011

Я думаю, что опечатка - это ответ, но я должен указать на одну смертельную ошибку, которую вы допустили, а именно на то, что вы вводите введенные пользователем данные непосредственно в 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, "s", '%'.$last_name.'%');
$result = mysqli_execute($sth);

Я знаю, что это немного дольше и сложнее, но поверьте мне, это избавит вас от мира головной боли. Чем раньше вы узнаете об этом и глубоко укоренитесь в своей психике, что вы никогда и никогда не сможете когда-либо написать запрос, который будет передавать неанизированный ввод прямо в базу данных, тем счастливее мы все будем (и чем дольше со временем ты сможешь сохранить свою работу.;).

Извините, если я продолжаю в том же духе, но, на мой взгляд, самый важный урок, который вам нужно извлечь на ранних этапах разработки веб-сайтов на основе баз данных, заключается в том, что вам действительно нужно уметь обнаруживать уязвимости, связанные с внедрением. где это происходит автоматически, и когда вы видите это, вы думаете: «Ооооооооо! Не делай этого !!!»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...