달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'분류 전체보기'에 해당되는 글 49건

  1. 2010.10.22 Chapter09. 일반적인 프로그래밍 테크닉 - 1 ('10.10.22)

오늘 공부한 내용은 MySQL과 PHP를 연동하는 기법이다.
예제로 소개된 view_users.php는 8장에서 만든 페이지이다.
이 페이지 소스를 일부 수정하여 각 문단에 대한 해설로 이야기가 전개된다.




스크립트로 값을 전달하는 방법 두가지가 소개된다.

첫 번째 방법은 HTML의 'hidden' 입력 타입을 사용하는 것이다.
<input type="hidden" name="do" value="this" />
이 코드가 form 태그 사이에 위치하게 되면, 폼을 전달받는 PHP 스크립트의 $_POST['do'] 변수에 'this'가 저장된다.

두 번째 방법은 URL을 통해 값을 전달하는 것이다.
www.example.com/page.php?do=this
이 기법은 HTML폼의 GET method를 흉내 낸 것이다. page.php 페이지에서는 $_GET['do']를 호출하여 'this'라는 값을 넘겨 받을 수 있다.

예제로 소개된 소스는 두 번째 방법의 사용법이 나와있다.




<?php # Script 8.4 - view_users.php

$page_title = 'View the Current Users';
include ('includes/header.html');

echo '<h1>Registered Users</h1>';

require_once('../mysqli_connect.php');

$q = "SELECT last_name, first_name, DATE_FORMAT(registration_date, '%M %d, %Y') AS dr, user_id FROM users ORDER BY registration_date ASC";
$r = @mysqli_query($dbc, $q);

$num = mysqli_num_rows($r); // mysqli_num_rows() 함수에 query결과가 저장된 $r를 넣어 row(tuple)의 개수를 알아낸다.

if($num > 0) {
    echo "<p>There are currently $num registered users.</p>\n";

    echo '<table align="center" cellspacing="3" cellpadding="3" width="75%">
    <tr>
        <td align="left"><b>Edit</b></td>
        <td align="left"><b>Delete</b></td>
        <td align="left"><b>Last Name</b></td>
        <td align="left"><b>First Name</b></td>
        <td align="left"><b>Date Registration</b></td>
    </tr>
    ';

    while($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) { // mysqli_fetch_assoc($r)과 동일하다.
        echo '<tr>
          <td align="left"><a href="edit_user.php?id=' . $row['user_id'] . '">Edit</a></td>
          <td align="left"><a href="delete_user.php?id=' . $row['user_id'] . '">Delete</a></td>
            <td align="left">' . $row['last_name'] . '</td>
            <td align="left">' . $row['first_name'] . '</td>
            <td align="left">' . $row['dr'] . '</td>
        </tr>
        ';
    }

    echo '</table>';

    mysqli_free_result ($r); // mysqli_free_result()를 사용하여 query리소스를 해제한다. 필수적이진 않으나 좋은 습관이다.

} else {
    echo '<p class="error">The current users could not be retrieved. We apologize for any inconvenience.</p>';

    echo '<p>' . mysqli_error($dbc) . '<br /><br />Query: ' . $q . '</p>';
}

mysqli_close($dbc); // mysqli_close()를 사용하여 database 접속을 해제한다. argument로 들어간 $dbc는 mysqli_connect.php에서 생성된 db접속 정보를 지니고 있다.

include ('includes/footer.html');
?>




mysqli_fetch_array()

이 함수는 SELECT 쿼리의 결과를 처리하는 가장 중요한 함수이다. 쿼리 결과 값을 인자로 사용하며, 한 번에 한 데이터 배열의 형태로 반환한다. 이 함수는 더 이상 배열의 형태로 반환할 데이터가 없을 때까지 true를 반환하여 반환된 데이터 행을 반복적으로 접근하는 루프문의 조건절에서 사용될 것이다.

while($row = mysqli_fetch_array($r)) {
// $row 변수를 처리한다.
}

보통은 SELET 쿼리로부터 반환된 결과를 가져올 때에는 항상 while루프를 사용할 것이다.

mysqli_fetch_array() 함수는 반환될 배열의 타입(연관 배열, 인덱스 배열 또는 둘 다)을 지정하는 선택적인 2번째 인자를 받아들인다. 연관 배열은 이름으로 칼럼의 값을 참조할 수 있고, 인덱스 배열은 배열의 인덱스 숫자 값(첫 번째 칼럼으로부터 0으로 시작한다)만을 사용 할 수 있다. 각 매개변수는 상수로 정의되어 있다.

MYSQLI_NUM을 사용하면 다른 옵션들에 비해 쿼리가 조금 더 빠르게 처리된다(메모리도 적게 사용한다).
MYSQLI_ASSOC는 알아보기 쉽고($row[3]보다 $row['column']가 알기 쉽다) 쿼리가 변경되어도 잘 작동한다.

mysqli_fetch_array() 함수를 사용한 후에는 사용이 끝난 쿼리 결과 리소스를 선택적으로 해제할 수 있다.

mysqli_free_result($r);
위 행은 $r 변수가 가지고 있는 부하(메모리)를 제거한다. 이 작업은 선택적이다. PHP는 페이지의 끝에서 모든 리소스를 자동으로 해제하기 때문이다. 그러나 리소스 해제를 명기하는 것은 좋은 프로그래밍 방식이다.

mysqli_fetch_array() 상수
 MYSQLI_ASSOC $row['column']
 MYSQLI_NUM $row[0]
 MYSQLI_BOTH $row['column'] 또는 $row[0]
기본설정은 MYSQLI_BOTH이다.

mysqli_fetch_row()는 mysqli_fetch_array($r, MYSQLI_NUM);와 동일하다.
mysqli_fetch_assoc()는 mysqli_fetch_array($r, MYSQLI_ASSOC);와 동일하다.




<td align="left"><a href="edit_user.php?id=' . $row['user_id'] . '">Edit</a></td>
<td align="left"><a href="delete_user.php?id=' . $row['user_id'] . '">Delete</a></td>

이 부분이 GET method 기법을 이용하여 값을 전달하는 방법이다.
쿼리문으로 받은 last_name, first_name, registration_date, user_id 중 user_id를 링크에 넣어 전송한다.
Edit 페이지와 Delete 페이지에서 $_GET['id'] 을 사용하여 읽을 수 있도록 한다.

아직 이해가 되지않은 부분은 . 을 이용하여 edit_user.php?id= 와 $row['user_id']를 연결하는 부분이다.
기존에 사용하는 방법인 "   " . $row . "   " 과 다른 방식으로 사용하고 있다.
' . $row['user_id'] . ' 의 ' '가 어디에서 어디까지를 포함하고 있는지 이해가 되지 않는다.

→ echo '<tr>  ... "edit_user?id=' 까지, '">Delete</a></td> ... </tr>' 까지를 포함한다.
    . $row['user_id'] . 은 ' '과 ' ' 사이에 위치하여 연결된다.




URL을 통해 여러 변수를 쿼리 스트링으로 전달하는 방법은 다음과 같다.

page.php?name1=value1&name2=value2&name3=value3

위와 같이 &로 구분하고, 또 다른 name=value쌍을 추가하면 된다.


Posted by CloudySky
|