사자자리

[PHP & MySQL] UPDATE 본문

웹기초/생활코딩 WEB 3 - PHP & MySQL

[PHP & MySQL] UPDATE

renne 2022. 8. 7. 21:02

1. index.php에 update 링크 생성하기

 - id 값이 있을 때만 update 링크가 나오도록, if(isset($_GET['id'])) 안에 $update_link 변수를 설정한다.

<!--htdocs\index.php-->
<?php
//title을 목차로 만들기
$conn = mysqli_connect('localhost', 'root', '021103', 'opentutorials');
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
  $escaped_title = htmlspecialchars($row['title']);
  $list = $list."<li><a href=\"index.php?id={$row['id']}\">{$escaped_title}</a></li>";
}
//기본적인 상태
$article = array(
  'title'=>'Welcome',
  'description'=>'Hello, WEB'
);

$update_link = '';

//id값이 있을 때, 즉 목차를 클릭했을 때
if(isset($_GET['id'])){
  $filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
  $sql = "SELECT * FROM topic WHERE id={$filtered_id}";
  $result = mysqli_query($conn, $sql);
  $row = mysqli_fetch_array($result);
  $article['title'] = htmlspecialchars($row['title']);
  $article['description'] = htmlspecialchars($row['description']);

  $update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';
}
?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>WEB</title>
  </head>
  <body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?=$list?>
    </ol>
    <a href="create.php">create</a> <!--글쓰기 기능 링크-->
    <?=$update_link?> <!--수정하기 기능 링크-->
    <h2><?=$article['title']?></h2>
    <?=$article['description']?>
  </body>
</html>

 

2. update.php 파일 생성하기

 - 수정할 title과 description을 입력하는 페이지

<!--htdocs\update.php-->
<?php
//title을 목차로 만들기
$conn = mysqli_connect('localhost', 'root', '021103', 'opentutorials');
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
$list = '';
while($row = mysqli_fetch_array($result)){
  $list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}
//기본적인 상태
$article = array(
  'title'=>'Welcome',
  'description'=>'Hello, WEB'
);

$update_link = '';

//id값이 있을 때, 즉 목차를 클릭했을 때 update 표시하기
if(isset($_GET['id'])){
  $filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
  $sql = "SELECT * FROM topic WHERE id={$filtered_id}";
  $result = mysqli_query($conn, $sql);
  $row = mysqli_fetch_array($result);
  $article['title'] = htmlspecialchars($row['title']);
  $article['description'] = htmlspecialchars($row['description']);

  $update_link = '<a href="update.php?id='.$_GET['id'].'">update</a>';

}
?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>WEB</title>
  </head>
  <body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?=$list?>
    </ol>
    <a href="create.php">create</a> <!--글쓰기 기능 링크-->
    <?=$update_link?> <!--수정하기 기능 링크-->
    <h2>Update</h2>
    <form action="process_update.php" method="post">
      <input type="hidden" name="id" value="<?=$_GET['id']?>">  <!--수정할 id값이 필요하기 때문에 hidden으로 전달-->
      <p><input type="text" name="title" placeholder="title" value="<?=$article['title']?>"></p>
      <p><textarea name="description" placeholder="description"><?=$article['description']?></textarea></p>
      <p><input type="submit"></p>
    </form>
  </body>
</html>

 

3. process_update.php 파일 생성하기

 - update.php에서 수정한 내용을 반영하고, 성공했으면 BACT TO PAGE 링크를 띄운다.

 - 사용자의 눈에 보이지 않게 hidden과 POST 방법을 사용한다.

<!--htdoc\process_update.php-->
<?php
$conn = mysqli_connect('localhost', 'root', '021103', 'opentutorials');
settype($_POST['id'], 'integer'); //$_POST['id'] 값 중 정수(integer)만 살린다.
$filtered = array(
  'id'=>mysqli_real_escape_string($conn, $_POST['id']),
  'title'=>mysqli_real_escape_string($conn, $_POST['title']),
  'description'=>mysqli_real_escape_string($conn, $_POST['description'])
);

$sql="
  UPDATE topic
  SET title = '{$filtered['title']}', description = '{$filtered['description']}'
  WHERE id = {$filtered['id']}
";
$result = mysqli_query($conn, $sql);

if($result === false){
  echo "ERROR";
  error_log(mysqli_query($conn));
}
else {
  echo '성공했습니다. <a href="index.php?id='.$filtered['id'].'">BACK TO PAGE</a>';
}
?>

 

4. 실습

MariaDB [opentutorials]> SELECT * FROM topic;
+----+------------+-------------------------------+---------------------+
| id | title      | description                   | created             |
+----+------------+-------------------------------+---------------------+
|  4 | MySQL      | MySQL but we're using MariaDB | 2022-08-01 23:23:34 |
|  5 | Oracle     | Oracle is ...                 | 2022-08-01 23:24:00 |
|  6 | SQL Server | SQL Server is ...             | 2022-08-01 23:24:17 |
|  7 | MongoDB    | MongoDB is ...                | 2022-08-01 23:24:31 |
|  8 | MariaDB    | MariaDB is ...                | 2022-08-02 21:34:31 |
+----+------------+-------------------------------+---------------------+
5 rows in set (0.001 sec)
Comments