php 입문 | PDO를 사용한 데이터베이스 액세스 | PDO으로 테이블 데이터 추가하기


여기서는 레코드 추가에 대해서 설명하겠다. 레코드의 추가도 조회와 동일하게 SQL 쿼리를 실행하여 수행한다. 이 레코드 조회를 하는 경우와는 조금 차이가 있기 때문에 주의가 필요하다.

레코드 조회 쿼리를 실행하면 데이터베이스에서 레코드의 데이터가 반환된다. 이 레코드의 추가는 단순히 명령을 쓰기만 하기 때문에, 결과 데이터를 받을 필요가 없다. 이러한 쿼리의 실행은 query 대신 “exec"라는 메소드를 이용한다.

$변수 = $pdo->exec(쿼리);

반환 값은 업데이트된 레코드 수를 나타내는 int 값이다. exec는 데이터의 추가 이외에도 여러가지 처리도 할 수도 있기 때문에, “얼마나 많은 레코드가 업데이트 되었는지"를 알게 된다. 아무것도 변하지 않으면 반환 값은 0이 된다.

레코드를 추가할 경우 인수는 다음과 같은 쿼리가 설정된다.

"insert into 테이블 (컬럼명1, 컬럼명2, ...) values (값1, 값2, ...) "

insert 문 작성은 다른 밥법도 있지만 이것이 가장 이해하기 쉬울 것이다. “insert into 테이블"다음에 ()에 값을 설정하는 컬럼명을 쉼표로 구분하여 작성한 다음에 “values"를 붙이고, 또 다른 ()에 값을 쉼표로 구분하여 작성한다. 이 때, 칼럼명의 ()와 값의 ()에 작성하는 내용은 순서가 맞아야 한다.

그럼 앞의 예제를 수정해서 레코드의 추가 기능을 구현하자.

index.php

<?php
<?php
$result = "";
try {
    $pdo = new PDO("mysql:host=localhost:3306;dbname=mysampledata;charset=utf8", "root","1234");
    $statement = $pdo->query("select * from sampletable");
    while($record = $statement->fetch(PDO::FETCH_ASSOC)){
        $result .= "<tr>";
        foreach($record as $column){
            $result .= "<td>" . htmlspecialchars($column) . "</td>";
        }
        $result .= "</tr>";
    }
} catch(PDOException $e){
    $result = "#ERR:" . $e->getMessage();
}
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
        <style>
        h1 { font-size:14pt;
            padding:5px;
            background-color:#AAFFFF; }
        table tr td {
            padding:5px;
            background-color:#DDFFCC; }
        </style>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <table>
        <form method="post" action="./add.php">
            <tr><td>NAME:</td><td><input type="text" name="name"></td></tr>
            <tr><td>MAIL:</td><td><input type="text" name="mail"></td></tr>
            <tr><td>TEL:</td><td><input type="text" name="tel"></td></tr>
            <tr><td>MEMO:</td><td><textarea name="memo"></textarea></td></tr>
            <tr><td></td><td><input type="submit" value="추가"></td></tr>
        </form>
        </table>
        <hr>
        <table>
        <?php echo $result; ?>
        </table>
    </body>
</html>

add.php

<?php
$name = $_POST['name'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$memo = $_POST['memo'];
try {
    $pdo = new PDO("mysql:host=localhost:3306;dbname=mysampledata;charset=utf8", "root","1234");
    $query = "insert into sampletable (name, mail, tel, memo) values ('$name', '$mail', '$tel', '$memo')";
    $pdo->exec($query);
} catch(PDOException $e){
    echo "<html><body><h1>ERR:" . $e->getMessage() + "</h1></body></html>";
}
$pdo = null;
header('Location: index.php');

여기에서는 index.php 외에 새롭게 “add.php"라는 파일을 추가되었다. index.php에 액세스하고 표시된 양식에 “이름, 이메일 주소, 전화 번호, 메모"를 써서 보내면 레코드가 새로 추가된다.

add.php는 먼저 폼에서 전송된 값을 각각 변수에 꺼낸다.

$name = $_POST['name'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$memo = $_POST['memo'];

이러한 값을 함께 쿼리 문을 작성하고 exec한다. 쿼리 문은 위의 값을 정리하고 다음과 같이 작성한다.

$query = "insert into sampletable (name, mail, tel, memo)  values ('$name', '$mail', '$tel', '$memo')";

id 값은 필요하지 않기 때문에 4개의 컬럼의 값만 넣는다. 이를 exec하면 레코드가 추가된다. 이 후에는 index.php로 리다이렉트하여 목록이 표시되면, 추가된 레코드가 나타날 것이다.