728x90

게시판에서 본문을 입력하는 내용은 줄바꿈을 하면서 자료를 입력하게 된다.

DB에서는 자료를 어떻게 저장할까?
사용자가 엔터키를 사용해 문자열을 입력했다고 해도 DB에 저장될 때는 한 라인으로 저장된다.

사용자가 입력한 엔터키는 개행문자(\n)로 대치되어 저장된다.

phpMyAdmin 에서 해당 게시물을 조회하고 해당 게시물에 직접 들어가서 저장된 텍스트 내용을 확인해 보면 알 수 있다.


DB에 존재하는 한 라인 이상의 문자열을 Web browser 의 화면에 출력하면 출력이 될까?

안된다. 이유는?


HTML 문서는 개행문자(\n)를 인식하지 못한다.

HTML 문서는 <br> 태그나 <p> 태그에 의해서만 라인이 구분된다.


Web browser 의 화면에 출력하기 위해서는 반드시 nl2br()함수를 사용해 개행문자(\n)를 <br> 태그로 변환해야 한다.

nl2br()함수는 문자열 내에 개행문자(\n)가 존재한다면 모든 개행문자를 <br>태그로 변환한다.


그러므로 보통 DB에 저장할 때 nl2br()함수를 이용해서 개행문자(\n)를 <br>로 저장한다.


입력된 글에 인용부호나 특수문자가 들어간 경우에는 각 문자 앞에 역슬래쉬(\)를 추가하는 addslashes() 함수를 적용해야 한다.

화면에 출력하는 경우 반드시 stripslashes() 함수를 먼저 적용하고 나중에 nl2br()함수를 적용해야 한다.

stripslashes() 함수는 addslashes() 함수를 통해 표기된 \ 문자를 원래대로 돌려준다.


텍스트 파일이나 CSV 파일을 읽어서 DB에 있는 자료와 중복 여부를 체크해야 하는 경우

문자열에 싱글쿼테이션이 들어가 있다면 어떻게 해야 할까?

DB에는 이미 addslashes() 함수를 적용해서 싱글쿼테이션 문자 앞에 역슬레쉬(\) 문자가 추가되어 있다.

따라서, Select * FROM 테이블명 Where eng =' addslashes($line[2])' 를 해야 한다.


블로그 이미지

Link2Me

,
728x90

검색창에서 키워드를 넣고 검색을 하면 원하는 결과를 DB에서 가져와서 화면에 뿌려준다.

하지만 몇번의 과정을 거쳐서 원하는 결과를 얻다보니 좀 불편하다.

한번에 해결할 수 있는 방법을 찾기 위해서 자바스크립트로 만들어봤더니 된다.


아래에서 색깔 표시된 부분이 자바스크립트에서 어떻게 표시가 되는지 확인해보면 된다.


<form   name="bbssearchf" method="POST" action="" onsubmit="return fchk();">
<select name="where">
<option value="name"<?php if($where=='name'):?> selected="selected"<?php endif?>>이름</option>
<option value="nic"<?php if($where=='nic'):?> selected="selected"<?php endif?>>닉네임</option>
<option value="id"<?php if($where=='id'):?> selected="selected"<?php endif?>>아이디</option>
<option value="uid_extra"<?php if($where=='uid_extra'):?> selected="selected"<?php endif?>>UID확장</option>
</select>

<input type="text" name="keyword" size="30" value="<?php echo stripslashes($_keyword)?>" class="input" />
<input type="submit" value="검색" class="btngray" />
</form>


검색폼이 위처럼 되어 있다.


이중에서 uid 라고 되어 있는 걸 자바스크립트로 만들어서 자동으로 실행하는 걸 해보고 싶어서 해봤다.


<script language="javascript">
//<![CDATA[
// UID 확장검색 스크립트
function SelectedSearch(suid)
{
    var where, keyword, suid;
    document.bbssearchf.where.value='uid_extra';
    document.bbssearchf.keyword.value=suid;
    document.bbssearchf.submit();
}

function fchk()
{
    var f = document.bbssearchf.getElementById('keyword');
    if(!f.value || f.value.length<2) {
        alert('값이 없거나, 너무 짧습니다.');
        f.focus();
        return false;
    }
}
//]]>
</script>


이제 list.php 파일의 subject 에 아이콘을 만들고 누르면 해당 자바스크립트가 실행되도록 했다.

게시물 리스트에서
<a href="javascript:SelectedSearch('<?php echo $R['uid']?>')" title="UID 확장"><img src="/public/b_scrap.gif" class="imgpos2"></a>


이렇게 하면 검색 키워드를 넣고 검색해서 나오는 결과와 동일한 결과를 얻을 수 있다.


블로그 이미지

Link2Me

,
728x90

PHP 에서 검색어를 여러개 입력하여 AND 조건이나 OR 조건을 검색해야 하는 경우가 있다.


검색어가 여러개면 보통 이렇게 검색어 처리를 하기 쉽다.

$keystr = explode(" ", $keyword);

$sqlque .= " and (eng LIKE '%".trim($keystr[0])."%')";


if($keystr[1]) {
    $sqlque .= " and (eng LIKE '%".trim($keystr[1])."%')";
}
if($keystr[2]) {
    $sqlque .= " and (eng LIKE '%".trim($keystr[2])."%')";
}
if($keystr[3]) {
    $sqlque .= " and (eng LIKE '%".trim($keystr[3])."%')";
}
if($keystr[4]) {
    $sqlque .= " and (eng LIKE '%".trim($keystr[4])."%')";
}
if($keystr[5]) {
    $sqlque .= " and (eng LIKE '%".trim($keystr[5])."%')";
}


이걸 좀더 깔끔하기 처리하는 방법은 아래처럼 array 와 join 함수를 이용하는 것이다.

$keystr = explode(" ", $keyword);
$exp_query = array();
for ($i = 0; $i < count($keystr) ; $i++) {
    array_push($exp_query, "eng LIKE '%".$keystr[$i]."%'" );
}
if(count($exp_query) > 0){
    $sqlque .= " and ( ";
    $sqlque .= join(" and ", $exp_query);
    $sqlque .= " ) ";
}
echo $sqlque; // 쿼리문이 정상인지 확인


블로그 이미지

Link2Me

,
728x90

addslashes 함수의 필요성

 

addslashes(string str) 함수는 php와 데이터베이스의 연동 db insert,update 시 필수적으로 해줘야 한다.


addslashes 함수는 매개변수로 넘겨준 문자열 안에 single quote(') 혹은 double quote("), 백슬래쉬(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가해 주는 함수다.

insert into dbtable (text) values (''사랑해'라고 말해줘요'); // DB 입력시 에러 발생

 

$text = addslashes($text);
insert into dbtable (text) values ('\'사랑해\'라고 말해줘요');

insert into dbtable (text) values ('I\'m sorry, I can\'t help you after all.');

 

DB에 있는 걸 읽어와서 Web 브라우저에 뿌려줄 때는 역슬래쉬(\)를 제거하는 함수인 stripslashes()를 사용한다.
검색어를 입력할 때 \\\ 가 많이 생긴다면 이걸 제대로 처리해주지 못해서 생기는 증상이다.

 

post해서 넘어온 변수를 일일이 addslashes해주는 건 귀찮은 일이고 화면에 출력할 때 stripslashes 하는 것도 상당히 귀찮은 일이다.

array_map() 함수를 사용하면 쉽게 해결된다.

post경우
$data = array_map('addslashes', $data);

select경우
while($data=mysql_fetch_array($row)){
 $data=array_map('stripslashes', $data);
}


대체 문법으로 표현하면


while($data=mysql_fetch_array($row)) :
 $data=array_map('stripslashes', $data);

endwhile;


 

블로그 이미지

Link2Me

,