1. trim()
- 문자 앞뒤 공백제거
if (!$searchTerm) {
echo "검색기간을 입력하세요.";
exit;
}
2. get_magic_quotes_gpc()
- 서버에서 자동으로 문자열을 escape 해 주도록 세팅되어 있는지 확인하는 함수
3. addslashes(), doubleval()
- 데이터베이스 쿼리 조건절의 파라미터로 사용된다면 addslashed() 함수를 이요하여 escape 해줘야 한다.
- 데이터베이스 숫자 필드의 경우에는 이상한 문자를 제거하기 위해서 doubleval()을 이요한다.
$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()
- 기본 데이터 베이스 변경
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();
}