I. 파라미터 체크 및 변환
    1. trim()
        - 문자 앞뒤 공백제거 
$searchTerm = trim($searchTerm);
if (!$searchTerm) {
    echo "검색기간을 입력하세요.";
    exit;

    2. get_magic_quotes_gpc()
        - 서버에서 자동으로 문자열을 escape 해 주도록 세팅되어 있는지 확인하는 함수

    3. addslashes(), doubleval()
        - 데이터베이스 쿼리 조건절의 파라미터로 사용된다면 addslashed() 함수를 이요하여 escape 해줘야 한다.
        - 데이터베이스 숫자 필드의 경우에는 이상한 문자를 제거하기 위해서 doubleval()을 이요한다.
if (!get_magic_quotes_gpc()) {
    $searchTerm = addslashes($searchTerm);
    $prive = doubleval($prive);

    4. stripslashes()
        - 서버가 자동으로 escape 하도록 세팅되어 있으면 데이터베이스에서 추출한 데이터는 stripslashes()를
          호출하여 / 문자를 제거해야 한다.

    5. htmlspecialchars()
        - HTML에서 특별한 기능을 하는 문자를 인코딩한다. ( & < > " )

II. 데이터 베이스 접속 및 쿼리
    1. mysqli()
        - 서버 접속을 위해서 mysqli(서버명, 사용자id, 패스워드, 데이터베이스명) 을 사용한다.

    2. mysql_connect_errno()
        - 서버에 접속해서 유효한 데이터베이스 접속을 얻었는지 확인 한다.
        - 오류가 나며 오류 번호를, 성공했을 경우에는 0 을 리턴한다.
        - 데이터베이스에 접속하려 했을 때 코드 앞에 오류 억제 연산자 @ 를 사용한다.
          이렇게 하면 오류가 났을 때 자신의 코드로 처리할 수 있다.
        - Apache의 maxClients(1.x 버전), ThreadsPerChild(2.x버전) 는 httpd.conf 에서,
          MySQL의 max_connections 는 my.conf 에서 수정한다.

$con = @new mysqli($GLOBALS['gServerName'], $GLOBALS['gUserId'],
                   $GLOBALS['gPassword'], $GLOBALS['gDatabase']);

if ($con->connect_errno) {

    printf("%d : %s <br/>", $con->connect_errno, $con->connect_error);
    exit(); 

}


    3. $con->select_db()
        - 기본 데이터 베이스 변경
$con->select_db($GLOBALS[gDatabase]);

    4. $con->query()
        - 데이터베이스 쿼리를 수행하여 결과 값을 $result 에 저장한다.
        - 아래와 같은 코드는 보안에 문제가 있으니 문법을 이해하는 정도로만 사용

$userId = "skanddh";
$sql =
"select * from User where userId = " . $userId;

$result = $con->query($sql);


    5. $result->num_rows
        - 데이터베이스에서 조회된 결과 row 수를 알 수 있다.

$rowCount = $result->num_rows;


    6. $result->fetch_assoc()
        - 각 row 마다 호출하여 한 row의 값을 배열로 받는다.
        - 결과 값을 출력한다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_assoc();

    print("userId = " . htmlspecialchars(stripslashes($row['userId'])) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row['userName'])) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row['age'])) . "<br/>");
}


    7. $result->fetch_object()
        - $result->fetch_assoc() 호출 시의 배열과는 다르게 결과가 object 로 넘어온다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_object();

    print("userId = " . htmlspecialchars(stripslashes($row->userId)) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row->userName)) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row->age)) . "<br/>");

}


    8. $result->free(), $db->close();
        - 결과 값 release  및 데이터베이스 접속 끊기

$result->free();

$con->close();


    9. $con->affected_row
        - query 가 insert, delete, update 문일 경우 affected_row 로 영향받은 row의 갯수를 알 수 있다.
        - query() 메소드 보다는 statement 의 execute() 메소드를 사용하는 것이 좋다.

$userId = 'me';

$userName = 'john';

$age = 30;

$sql = " insert into User (userId, userName, age) " .

       "     values ('" . $userId . "', '". $userName . "', ". $age . ") ";

$con->query($sql);

printf("%d user inserted into database.<br/>", $con->affected_rows);

$con->commit(); 


    10. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute()
         - Prepared Statement 를 사용하여 보안성을 높힌다.
         - bind_param() 호출 시 첫번째 전달인자의 의미,    s : string,   i : integer,   d : double

$sql = " insert into User (userId, userName, age) " .

       "           values (?, ?, ?) ";

$stmt = $con->prepare($sql);

$stmt->bind_param("ssi", $userId, $userName, $age);

$stmt->execute();

printf("%d user inserted into database.<br/>", $con->affected_rows);

$stmt->close();


    11. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute(),   $stmt->bind_result(),  $stmt->fetch()
         - bind_result() 를 이용하여 조회되어 넘어오는 값을 변수에 할당할 수 있다. 

$sql = " select userId, userName, age from User ";

if ( $stmt = $con->prepare($sql) ) {

    $stmt->execute();

    if ($stmt->errno) {
        printf(
"execute() >> %d : %s <br/>",$stmt->errno, $stmt->error);
    } 

    $stmt->bind_result($rUserId, $rUserName, $rAge);

    $count = 0;

    while ($stmt->fetch()) {

        $count++;

        print("userId = " . htmlspecialchars(stripslashes($rUserId)) .
              "<br/>");

        print("userName = " . htmlspecialchars(stripslashes($rUserName)) .
              "<br/>");

        print("age = " . htmlspecialchars(stripslashes($rAge)) . "<br/>");

    }
    printf("%d row seleted. <br/>", $count);

    $stmt->close();

}



 



 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG ,