Опубликован: 16.01.2007 | Уровень: для всех | Доступ: платный
Дополнительный материал 1:

PHP и MySQL

< Лекция 11 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >

Сохранение данных в базе данных

Мы научились извлекать данные из базы и выводить их на странице. Теперь давай попробуем осуществить обратное действие. С PHP это не составит большого труда.

Создадим простую форму:

<html>
  <body>
    <form method="post" action="<?php echo $PHP_SELF?>">
      First name:<input type="Text" name="first"><br>
      Last name:<input type="Text" name="last"><br>
      Address:<input type="Text" name="address"><br>
      Position:<input type="Text" name="position"><br>
      <input type="Submit" name="submit" value="Enter information">
    </form>
  </body>
</html>

Обратите внимание, мы опять используем переменную $PHP_SELF. Как мы уже сказали, PHP-код можно как угодно перемешивать с обычным HTML. Также обратите внимание, что название каждого элемента формы совпадает с названием поля в базе данных.

Вообще-то, это не обязательно, но весьма удобно, чтобы в дальнейшем не запутаться в том, какая переменная какому полю в базе данных соответствует.

Помимо этого мы присвоили имя кнопке Submit. Это сделано для того, чтобы в коде затем проверить, есть ли переменная $submit. Таким образом, когда страница будет вызываться, мы будем узнавать, вызывается ли она в первый или во второй раз.

Следует еще раз отметить, что вовсе не обязательно писать код так, чтобы страница снова и снова вызывала саму себя. Программу можно разделить на две, три и более страниц, если угодно. Но при таком подходе, вся программа находится в одном файле, а это бывает весьма удобно.

Итак, давайте добавим код, который будет проверять, введены ли в форму данные. Пока это будет лишь простая проверка, при которой все переменные, передаваемые странице, будут выводиться на экран с помощью переменной $HTTP_POST_VARS. Эта переменная удобна в случае отладки. Если вы хотите вывести на экран вообще все переменные, используемые в странице, вызовите переменную $GLOBALS.

<html>
  <body>
    <?php
      if ($submit) 
      {
        // process form
        while (list($name, $value) = each($HTTP_POST_VARS)) {
          echo "$name = $value<br>\n";
        }
      } else
      {
        // display form
    ?>
        <form method="post" action="<?php echo $PHP_SELF?>">
          First name:<input type="Text" name="first"><br>
          Last name:<input type="Text" name="last"><br>
          Address:<input type="Text" name="address"><br>
          Position:<input type="Text" name="position"><br>
          <input type="Submit" name="submit" value="Enter 
          information">
        </form>

    <?php
      } // end if
    ?>
  </body>
</html>

Теперь давайте возьмем переданную через форму информацию и внесем ее в базу данных.

<html>
  <body>
    <?php
    if ($submit) 
    {
      // process form
      $db = mysql_connect("localhost", "root");
      mysql_select_db("mydb",$db);

      $sql = "INSERT INTO employees (first,last,address,position) 
      VALUES ('$first','$last','$address','$position')";

      $result = mysql_query($sql);

      echo "Thank you! Information entered.\n";
    } else{
      // display form
    ?>

      <form method="post" action="<?php echo $PHP_SELF?>">
        First name:<input type="Text" name="first"><br>
        Last name:<input type="Text" name="last"><br>
        Address:<input type="Text" name="address"><br>
        Position:<input type="Text" name="position"><br>
      <input type="Submit" name="submit" value="Enter information">
      </form>
    <?php
    }
    // end if
    ?>
  </body>
</html>
Листинг 12.2.

Мы внесли данные в базу. Тем не менее наш код далек от идеального. Что случится, если при заполнении формы кто-то оставит пустые поля или введет текст в поле, в которое надо ввести число? Что произойдет, если в поданных данных будет ошибка?

Ранее мы записывали SQL-выражение в переменную ( $sql ), прежде чем передать запрос в базу данных через функцию mysql_query(). Это делается на случай отладки. Если что-то пойдет не так, мы всегда сможем вывести интересующее нас SQL-выражение на экран и проверить, нет ли в нем ошибок.

Мы уже знаем, как вставлять данные в базу. Теперь давайте научимся менять записи, которые уже находятся в таблице.

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

<html>
  <body>
    <?php
      $db = mysql_connect("localhost", "root");

      mysql_select_db("mydb",$db);

      if ($id) {
        // query the DB
        $sql = "SELECT * FROM employees WHERE id=$id";
        $result = mysql_query($sql);
        $myrow = mysql_fetch_array($result);
    ?>
      <form method="post" action="<?php echo $PHP_SELF?>">
        <input type=hidden name="id" value="<?php echo 
        $myrow["id"] ?>">
        First name:<input type="Text" name="first" value="<?php
        echo $myrow["first"] ?>"><br>
        Last name:<input type="Text" name="last" value="<?php 
        echo $myrow["last"] ?>"><br>
        Address:<input type="Text" name="address" value="<?php 
        echo $myrow["address"] ?>"><br>
        Position:<input type="Text" name="position" value="<?php
        echo $myrow["position"] ?>"><br>
        <input type="Submit" name="submit" value="Enter 
        information">
      </form>

    <?php
    } else {
      // display list of employees
      $result = mysql_query("SELECT * FROM employees",$db);
      while ($myrow = mysql_fetch_array($result)) {
        printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF,
        $myrow["id"], $myrow["first"],
        $myrow["last"]);
      }
    }
    ?>
  </body>
</html>
Листинг 12.3.

В этой странице мы просто вывели в каждое поле формы соответствующее значение из базы данных. Теперь усложним программу. Добавим к ней возможность внесения отредактированных данных назад в базу. Опять таки мы прибегаем к помощи кнопки Submit, которой присваиваем имя, чтобы при втором проходе страницы проверить, какую часть кода нам надо выполнять.

Также мы здесь используем слегка измененное SQL-выражение.

<html>
  <body>
    <?php
      $db = mysql_connect("localhost", "root");
      mysql_select_db("mydb",$db);

      if ($id) {
        if ($submit) {
          $sql = "UPDATE employees SET first='$first',last='$last',
          address='$address',position='$position' WHERE id=$id";

          $result = mysql_query($sql);
          echo "Thank you! Information updated.\n";
        } else {
          // query the DB
          $sql = "SELECT * FROM employees WHERE id=$id";
          $result = mysql_query($sql);
          $myrow = mysql_fetch_array($result);
    ?>
          <form method="post" action="<?php echo $PHP_SELF?>">
            <input type=hidden name="id" value="<?php echo 
            $myrow["id"] ?>">
            First name:<input type="Text" name="first" value="<?php 
            echo $myrow["first"] ?>"><br>
            Last name:<input type="Text" name="last" value="<?php 
            echo $myrow["last"] ?>"><br>
            Address:<input type="Text" name="address" value="<?php 
            echo $myrow["address"] ?>"><br>
            Position:<input type="Text" name="position" value="<?php
            echo $myrow["position"] ?>"><br>
            <input type="Submit" name="submit" value="Enter 
            information">
          </form>
    <?php
    }
      } else {
        // display list of employees
        $result = mysql_query("SELECT * FROM employees",$db);
        while ($myrow = mysql_fetch_array($result)) {
          printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", 
          $PHP_SELF, $myrow["id"], $myrow["first"],
          $myrow["last"]);
        }
      }
    ?>
  </body>
</html>
Листинг 12.4.

Вот так. Нам удалось вместить все, что мы знаем и умеем в один код. Здесь вы можете увидеть, как мы используем выражение if() внутри другого выражения if() для последовательно проверки нескольких условий.

Теперь пришло время свести все вместе.

<html>
  <body>
    <?php
      $db = mysql_connect("localhost", "root");
      mysql_select_db("mydb",$db);

      if ($submit) {
        // here if no ID then adding else we're editing
        if ($id) {
          $sql = "UPDATE employees SET first='$first',last='$last',
          address='$address',position='$position'
          WHERE id=$id";
        } else {
          $sql = "INSERT INTO employees (first,last,address,position)
          VALUES
          ('$first','$last','$address','$position')";
        }
        // run SQL against the DB
        $result = mysql_query($sql);
        echo "Record updated/edited!<p>";
      } else if ($delete) {
        // delete a record
        $sql = "DELETE FROM employees WHERE id=$id";
        $result = mysql_query($sql);
        echo "$sql Record deleted!<p>";
      } else {
        // this part happens if we don't press submit
        if (!$id) {
          // print the list if there is not editing
          $result = mysql_query("SELECT * FROM employees",$db);
          while ($myrow = mysql_fetch_array($result)) {
            printf("<a href=\"%s?id=%s\">%s %s</a> \n", $PHP_SELF, 
            $myrow["id"], $myrow["first"],
            $myrow["last"]);
            printf("<a href=\"%s?id=%s&delete=yes\">(DELETE)</a><br>",
            $PHP_SELF, $myrow["id"]);
          }
        }
    ?>
    <P>
    <a href="<?php echo $PHP_SELF?>">ADD A RECORD</a>
    <P>
    <form method="post" action="<?php echo $PHP_SELF?>">
      <?php
      if ($id)
      {
        // editing so select a record
        $sql = "SELECT * FROM employees WHERE id=$id";
        $result = mysql_query($sql);
        $myrow = mysql_fetch_array($result);
        $id = $myrow["id"];
        $first = $myrow["first"];
        $last = $myrow["last"];
        $address = $myrow["address"];
        $position = $myrow["position"];
        // print the id for editing
      ?>
      <input type=hidden name="id" value="<?php echo $id ?>">
      <?php
      }
      ?>
      First name:<input type="Text" name="first" value="<?php echo 
      $first ?>"><br>
      Last name:<input type="Text" name="last" value="<?php echo 
      $last ?>"><br>
      Address:<input type="Text" name="address" value="<?php echo 
      $address ?>"><br>
      Position:<input type="Text" name="position" value="<?php echo
      $position ?>"><br>
      <input type="Submit" name="submit" value="Enter information">
    </form>
  <?php
  }
  ?>
  </body>
</html>
Листинг 12.5.

На первый взгляд код выглядит сложным, однако это не так. Программа делится на три части. Первое if() выражение проверяет, была ли нажата кнопка Submit, и если была, проводится проверка, есть ли в поданных данных переменная $id. Если ее нет, значит происходит добавление новой записи. В противном случае мы редактируем уже существующую запись.

Далее мы проверяем, определена ли переменная $delete. Если да, мы удаляем запись. Обратите внимание, что в первом выражении if() мы проверяем переменную, которая была подана с помощью метода POST, а в данном if() выражении мы проверяем переменную, которая является частью данных отправленных с помощью метода GET.

Наконец, мы переходим к действию, которое будет выполняться по умолчанию: то есть выводим просто список служащих и форму. Здесь мы опять проверяем существование переменной $id. Если она существует, мы просим базу данных выдать сведения о выбранном служащем. В противном случае выводим пустую форму.

Все, что мы рассмотрели, мы поместили в один большой код. Мы использовали циклы while() и выражения if(), а также целую гамму основных команд языка SQL - SELECT, INSERT, UPDATE, и DELETE.

Наконец, мы рассмотрели, как можно передавать информацию от одной страницы к другой через URL с помощью ссылок и через формы.

< Лекция 11 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >
Александра Каева
Александра Каева
Диляра Кенжебай
Диляра Кенжебай