728x90

킴스큐 RB2 게시판 생성이 어떻게 되는지 순서를 알아두고 싶어서 적어둔다.


1. 관리자 모드에서 게시판을 생성한다.




2. 게시판이 생성되면 rb_bbs_list 테이블에 정보가 기록된다.





rb_bbs_data 에 게시글이 추가된다.

추가될 때 rb_bbs_list 에 생성된 테이블의 gid => bbs, id => bbsid 로 매핑되는 걸 확인할 수 있다.



게시판과 메뉴 연결



728x90

'Web 프로그램 > 킴스큐RB' 카테고리의 다른 글

버그 찾기 힘들다  (0) 2016.02.15
[SQL] 회원정보 중에서 필요한 거 뽑아보기  (0) 2015.09.30
RB2 Layout 설정  (0) 2015.08.20
킴스큐 RB2 모듈 삭제 방법  (0) 2015.08.01
[RB1] 회원테이블 이전시  (0) 2015.07.27
블로그 이미지

Link2Me

,
728x90

PHP 높은 버전, MySQL  높은 버전을 설치할 수 있는 autoset 9 가 있다고 해서 설치를 해봤다.

결론부터 말하면 APMSetup 설치를 해서 연습했던 초보자는 과감하게 지우고 이걸 설치하길 권장한다.

PHP 도 7.0 대 버전으로 가고 있는데 책이나 구글링을 해서 자료를 구하면 대부분 MySQLi 절차지향 방식으로 코딩이 되어 있다.

PHP 를 Morden PHP 로 처음부터 배우고 싶으면 autoset10 을 설치(PHP 7.0 + MariaDB + Apache)하고 PDO 세팅을 해서 배우면 좋을 거 같다.

PHP 5.2 버전은 한참 오래된 버전이므로 가능하면 PHP 5.6 버전대를 사용하는 걸 권장하고 싶다.

 

다운로드 : http://autoset.net/xe/download_autoset_10_7_2

에서 32비트용과 64비트용 중에서 본인 PC 사양에 맞는 것을 선택해서 다운로드 받아 설치하면 C:\AutoSet9 폴더에 기본 설치된다.

 

설치후에 웹서버와 MySQL 을 실행해준다.

 

 

웹브라우저에서 http://localhost 을 입력하고 엔터키를 치면 아래 화면이 나온다.

 

c:\AutoSet9\public_html\ 폴더에 있는 index.php 파일을 지우고 원하는 파일을 설치하면 홈페이지를 만들 수가 있다.

무엇보다도 MySQL 버전이 5.6.0 버전을 사용해 볼 수 있다는게 장점이라고 볼 수 있다.

 

http://localhost/phpmyadmin/ 에서 DB에 대한 사용 정보를 볼 수 있다.

접속 암호 : root, autoset 입력하면 phpmyadmin 으로 접속이 가능하다.

 

Apache 환경설정 방법

http://link2me.tistory.com/426 참조하면 도움된다.
http://link2me.tistory.com/999 날짜별로 로그기록 남기기

 

PHP.ini 설정 게시글
-  http://link2me.tistory.com/967
-  http://link2me.tistory.com/986 PHP 보안설정

PHP dbconnect.php 만드는 방법
http://link2me.tistory.com/1110

MySQL DB 생성 및 사용자 권한 부여 방법
http://link2me.tistory.com/431
MySQL DB 생성 및 사용자 추가, 권한 부여 ★★★★★

출처: http://link2me.tistory.com/431 [소소한 일상 및 업무TIP 다루기]
MySQL DB 생성 및 사용자 추가, 권한 부여 ★★★★★

출처: http://link2me.tistory.com/431 [소소한 일상 및 업무TIP 다루기]


php.ini 에서
extension=php_pdo_mysql.dll
를 활성화 시킨다.
 

 

728x90
블로그 이미지

Link2Me

,
728x90

KIMSQRB2 의 레이아웃에서 기본적인 정보를 설정하는 방법이다.

맨처음 화면에 나오는 글씨를 변경하고 싶을 때 사이트 제목에 default 값은 My Homepage 로 나온다.

아래 그림처럼 변경하면 화면 내용이 변경된다.


로그인 출력폼은 테스트를 해보니 모달 로그인이 좀 더 편하다.



설정 정보가 저장되는 걸 확인해봤더니 아래에 저장된다.




728x90
블로그 이미지

Link2Me

,
728x90

How to I hide the "information_schema" from users.


DB를 생성하고 User 에서 MySQL DB 접속권한을 부여했더니 phpmyadmin 에서 information_schema 테이블 정보가 보인다.

생성한 DB만 볼 수 있어야 하는데 information_schema 까지 보여서 폭풍검색을 했더니 할 수 있다, 없다 등 많은 정보들이 있다.


phpmyadmin 이 설치된 경로의 root 에 config.sample.inc.php 라는 파일이 있다.

이 파일을 복사해서 config.inc.php 파일로 만들고 나서


/*
 * First server
 */
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
/* Select mysqli if your server has it */
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

/* rajk - for blobstreaming */
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';
$cfg['Servers'][$i]['hide_db'] = 'information_schema';


한줄을 추가해줬더니 phpmyadmin 에서 보이던 것이 사라졌다.


더 참고할 정보는 http://www.electrictoolbox.com/hide-databases-phpmyadmin/

에서 보면 도움이 된다.




728x90
블로그 이미지

Link2Me

,
728x90

APMSetup7 은 오래된 툴이므로 사용을 권장하지 않는다.

윈도우에서 APM(Apache + PHP + MySQL)을 이용해서 기능 테스트나 홈페이지 만드는 연습, PHP 사용법 등을 익히고자 한다면 Autoset9 을 설치할 것을 권장한다.

PHP 7.0 기반으로 동작되는 걸 테스트 해보고 싶다면 Autoset10 을 설치하면 된다.

하지만 책이나 대부분의 오픈 소스를 이용하여 테스트 하고자 한다면 Autoset9 을 이용하는 것이 좋다.

본 게시글에서는 phpMyAdmin 사용법만 읽어보면 좋을 거 같다.


========================================================================

윈도우에서 홈페이지를 만들어보기 위해서는 APMSetup7 을 설치하면 된다.


리눅스용으로 홈페이지를 구축하고 있기 때문에 필요성을 느끼지 못해서 설치를 안하다가 C# 과 MySQL 연동을 배우려고 윈도우용 APM을 설치했다. 테스트 하는데는 윈도우용이 편할 거 같아서다.


설치파일 받기 : http://www.apmsetup.com/download.php

설치를 하고 나서 웹브라우저에서 http://localhost 를 입력하면 아래 화면이 나온다.



MySQL 클라이언트와 서버간에 통신 인코딩 설정정보는 c:\APM_Setup\Server\MySQL5\data\my.ini 파일에 설정되어 있다.

# The following options will be passed to all MySQL clients
[client]
default-character-set=utf8
port        = 3306

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
default-character-set=utf8
port        = 3306

로 나와 있다.


SHOW VARIABLES LIKE 'c%';
로 확인해봤더니 ....

로 나온다.

테스트를 해봤더니 한글이 입력되지 않는다.


c:\APM_Setup\Server\MySQL5\my.ini
가 되도록 아래 파일을 받아서 폴더에 넣어준다.


my.ini


그리고 MySQL 을 재기동해준다.

트레이아이콘에서 마우스 왼쪽을 두번 눌러주면 아래 그림이 나온다.

MySQL STOP 을 한 후에 다시 START 를 눌러주면 재기동이 된다.



DB에서 확인해보니 이제 정상적으로 변경된 것이 보인다.




phpmyadmin 접속하기

127.0.0.1/myadmin/

로 접속해서 phpmyadmin 상에서 MySQL DB와 접속하여 작업하면 편리하다.

기본설정된 root 의 패스워드는 apmsetup 이다. 처음에 이걸 모르면 개고생을 좀 하게 된다.


phpmyadmin 에 접속하고 나서 mysql DB에 접속한 다음에

select host, user, password from user; 를 입력하고 실행버튼을 누르면



현재 설정된 사용자 정보가 나온다.


MySQL DB에 직접 접속해서 작업을 하려면 아래 그림처럼 하면 된다.



mysqld.exe 가 실행되고 있어서

mysql -u root -p 를 입력하고 패스워드 apmsetup 을 입력하면 MySQL DB에 접속된다.


이제 mysql DB로 접속을 해보자.


phpmyadmin 상에서 select host, user, password from user;

라고 입력한 것과 동일한 결과를 보여준다.


root 패스워드 변경 방법은 http://link2me.tistory.com/432 참조하면 되고

DB 접속권한 설정 방법은 http://link2me.tistory.com/431 참조하면 된다.


DB 생성하는 것도 phpmyadmin 상에서 하면 무척 편하다. 단, 보안에 신경써야 한다. http://link2me.tistory.com/1476 참조해보면 해킹시도 흔적을 알 수 있다. ipFiltering.php 소스는 올리지 않는다. 각자 알아서 구현하시라.

본인 PC에 설치하는 APMSETUP 이나 Autoset9 등은 이런거 크게 신경쓰지 않아도 될 수 있다.

만약 공유기 환경에서 사설 IP를 쓰는 환경이라면....

공유기 외부에서 접속 가능하게 Port Forwarding 을 설정한 경우에는 보안에 신경써야 한다.



test DB가 생성된 것을 확인할 수 있으며, MySQL DB 접속된 상태에서 Create database `test'; 라고 입력한 것과 동일하게 처리가 되는 걸 알 수 있다.



이제는 생성된 test DB를 삭제하는 법을 알아보자.




삭제 명령어가 Drop database `test`; 라는 걸 알 수 있다.


그럼 이제 cmd 창에서 DB를 생성해보자.

create schema DB명 default character set utf8;

create schema `test` default character set utf8;  -- 또는

create database `test` default character set utf8;

라고 입력한다.

정상적으로 test DB가 생성되었다고 OK 가 된 것을 볼 수 있다.

mysql 에서 빠져나오는 명령어는 exit 이므로 비정상적으로 종료하지 말고 exit 로 빠져오는 것이 좋다.


그럼 다른 방법으로 test1 DB 를 생성해보자.

SQL 탭을 눌러서 cmd 창에서 입력했던 명령어를 직접 입력하고 실행을 누른다.

create schema `test1` default character set utf8;



DB가 생성된 것을 확인할 수 있다.

이 정도만 알면 윈도우 상에서 MySQL DB 생성/삭제를 자유자재로 할 수 있으며, 테이블 생성/수정/삭제도 편하게 할 수 있다.


php 와 apache 상에서 MySQL 을 접속하기 위한 용도가 아니라서 이 부분은 설명을 하지 않았다.

이 부분까지 설정하려면 http://blog.naver.com/chhh92/70186382090 블로그 게시글을 참조하면 된다.


낮은 버전의 phpMyAdmin 파일을 받으려면 http://link2me.tistory.com/486 게시글 하단에 있으니 받으면 된다.


728x90
블로그 이미지

Link2Me

,
728x90

PHP에서 날짜 다루는 함수를 정리해봤다.

mktime : 주어진 시간을 유닉스 형식의 시간으로 반환

time : 현재의 시간을 유닉스 형식의 시간으로 반환

date : 날짜와 시간을 지정한 형식에 맞추어 반환


<?php
// 날짜, 시간 받아오기
// mktime(시간, 분, 초, 달, 일, 년, is_dst)
// date 함수에서 Y : 4자리수 연도, y : 2자리수 연도, m : 2자리수 월
date("Y-m-d"); // 오늘날짜

$date = date("Y/m/d", mktime(0,0,0,date("m"),date("d"), date("Y")));    // 오늘
echo $date;
echo "<br />";

echo date("Y-m-d", mktime(0,0,0, date("m"), date("d")-1, date("Y"))) ."<br />";    // 어제
echo date("Y-m-d", mktime(0,0,0, date("m"), date("d")+1, date("Y"))) ."<br />";    // 내일
echo date("Y-m-d H:i:s", mktime(date("H"), date("i"), date("s"), date("m"), date("d")-1, date("Y"))) ."<br />";



// 오늘부터 5일후의 날짜

date("Y-m-d",strtotime ("+5 days"));


//현재의 날짜인 time형식에서 strtotime에 의해 한달을 뺀 time을 date형식으로 변환
date("Y-m-d",strtotime ("-1 months"));


//현재의 날짜인 time형식에서 strtotime에 의해 하루를 더한 time을 date형식으로 변환
date("Y-m-d",strtotime ("+1 days"));

//현재의 날짜인 time형식에서 strtotime에 의해 1년을 더한 time을 date형식으로 변환
date("Y-m-d",strtotime ("+1 years"));

//현재의 날짜인 time형식에서 strtotime에 의해 24시간을 더한 time을 date형식으로 변환
date("Y-m-d",strtotime ("+24 hours"));

//현재의 날짜인 time형식에서 strtotime에 의해 1000분을 더한 time을 date형식으로 변환
date("Y-m-d",strtotime ("+1000 minutes"));

//현재의 날짜인 time형식에서 strtotime에 의해 1주일을 더한 time을 date형식으로 변환
date("Y-m-d",strtotime ("+1 week"));

// 20170411의 날짜를 timestamp형식으로 변환후 1일을 더한후 다시 timestamp형식으로 변환후 Ymd 형식의 문자열로 출력
date("Ymd",strtotime ("+1 days", strtotime('20170411')));
date("Ymd",strtotime ("+1 days", strtotime('2017-04-11')));


$date = "2015-08-02";
echo get_date($date,-5);
echo "<br />";
// strtotime 함수는 날짜형식의 문자열을 타임스탬프 즉, 밀리세컨드 형식의 데이터로 변환한다
// 날짜 뒤에 "+1 day", "+1 month", "+1 year" 등의 문자열을 붙여서 날짜를 계산할 수 있다
echo date("Y-m-d", strtotime($date.'-5 day')) ."<br />";
// 아래 코드도 동일한 결과를 보여준다
echo date("Y-m-d", strtotime('2015-08-02 -5 day')) ."<br />";

$date = "20150802";
echo get_date($date,20)."<br />";

// 입력된 날로부터 차이가 발생하는 날짜 반환하기

function get_date( $date, $gap ) {
    // 년월일로 되어 있는 포멧인 경우
    $date = preg_replace("/[^0-9]/", "", $date); // 숫자 이외 제거
    $y = substr( $date, 0, 4 );
    $m = substr( $date, 4, 2 );
    $d = substr( $date, 6, 2 );
    return date("Y-m-d", mktime(0,0,0, $m, $d + $gap, $y));
}

$date = "20150802";
echo get_day($date)."<br />";

// 해당 날짜의 요일(day)을 구하는 함수

function get_day( $date ) {
    // 년월일로 되어 있는 포멧인 경우
    $date = preg_replace("/[^0-9]/", "", $date); // 숫자 이외 제거
    $y = substr( $date, 0, 4 );
    $m = substr( $date, 4, 2 );
    $d = substr( $date, 6, 2 );
    $day_show = date("D", mktime(0,0,0, $m, $d, $y));
    switch($day_show) {
        case('Mon'): echo "월"; break;
        case('Tue'): echo "화"; break;
        case('Wed'): echo "수"; break;
        case('Thu'): echo "목"; break;
        case('Fri'): echo "금"; break;
        case('Sat'): echo "토"; break;
        case('Sun'): echo "일"; break;
    }
}

echo "<br />";
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 second')) ."<br />"; // 1초를 더함
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 minute')) ."<br />"; // 1분을 더함
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 hour')) ."<br />"; // 1시간을 더함
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 day')) ."<br />"; // 1일을 더함
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 month')) ."<br />"; // 1개월을 더함
echo date('Y-m-d H:i:s',strtotime('2015-08-02 14:30:50 +1 year')) ."<br />"; // 1년을 더함

echo "<br />";
$time = time();
echo date("Y-m-d",strtotime("-1 day", $time))." // 하루 전(어제)"."<br />";
echo date("Y-m-d",strtotime("now", $time))." // 현재"."<br />";
echo date("Y-m-d",strtotime("+1 day", $time))." // 하루 후(내일)"."<br />";
echo date("Y-m-d",strtotime("+15 day", $time))." // 오늘부터 15일후"."<br />";
echo date("Y-m-d",strtotime("+15 days", $time))." // 오늘부터 15일후"."<br />";
echo date("Y-m-d",strtotime("+15 days", strtotime("2013-08-02")))." // 특정일로부터 몇일 전후"."<br />";
echo date("Y-m-d",strtotime("+1 week", $time))." // 일주일 후"."<br />";
echo date("Y-m-d",strtotime("-1 month", $time))." // 한달 전"."<br />";
echo date("Y-m-d",strtotime("+1 month", $time))." // 한달 후"."<br />";
echo date("Y-m-d",strtotime("+6 month", $time))." // 6달 후"."<br />";
echo date("Y-m-d",strtotime("+12 month", $time))." // 12달 후"."<br />";
echo date("Y-m-d",strtotime("next Thursday", $time))." // 다음주 목요일"."<br />";
echo date("Y-m-d",strtotime("last Monday", $time))." // 지난 월요일"."<br />";
echo date("Y-m-d",strtotime("10 September 2015", $time))." // 2015년 9월 10일 "."<br />";
echo strtotime("+5 minutes")." // 현재 시간보다 5분 후"."<br />";

echo "<br />";
$week = array("일", "월", "화", "수", "목", "금", "토");
$week_string = $week[date("w")];
$output_today_message = sprintf('%s년 %s월 %s일 %s요일 ', date('Y'),date('m'),date('d'),$week_string);
echo $output_today_message;
?>


getdate() : 날짜와 시간을 배열을 통해 반환해준다.

아래 예제를 실행해보면 출력된 결과가 어떤 것들인지 알 수 있다.

<?php
$today = getdate();
foreach($today as $key => $val){
    echo $key.":".$val.'<br />';
}

echo "오늘은 ".$today['year']."년 ".$today['mon']."월 ".$today['mday'];
?>



2015년 4월 13일로부터 10년 10일후를 다음과 같이 나타내라.
(2025-04-23:14:34:56)
(2015/04/23에서 10년 10일후를 yyyy-mm-dd: hh:mm:ss형식으로 표현)


$R = strtotime('+10 years, +10 days', mktime(14, 34, 56, 4, 13, 2015));
echo date('Y-m-d: H:i:s', $R);

728x90
블로그 이미지

Link2Me

,
728x90

관리자 페이지에서 모듈을 삭제할 수 있다.



728x90
블로그 이미지

Link2Me

,
728x90

회원테이블 이전시 백업 받아야 할 테이블 정보

rb_s_mbrid, rb_s_mbrdata


rb_s_mbrid 테이블의 uid 칼럼은 rb_s_mbrdata 테이블의 memberuid 와 연관되어 있다.


728x90
블로그 이미지

Link2Me

,
728x90

별도로 커스터마이징한 모듈 게시판에 접근권한을 설정하기 위해서는

환경설정에서 회원레벨에 따른 레벨을 설정하고, main.php 파일에서는 레벨에 따른 접근이 가능한지 불가능한지를 보여줘야 한다.


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
31
32
33
34
35
36
37
38
39
40
41
42
<?php
// main.php
//권한없음, 둘다 참이면 조건 실행
if (!$my['admin'] && $my['level']<=$d['bbs']['level']){
    getLink($g['s'].'/?r='.$r,'','접근 권한이 없습니다!','');
}
?>
<!--// config.php 파일에서 -->
<tr>
    <td class="td1">
        본문접근
        <img src="<?php echo $g['img_core']?>/_public/ico_q.gif" alt="도움말" title="도움말" class="hand" onclick="layerShowHide('guide_level','block','none');" />                
    </td>
    <td class="td2">
        <select name="level" class="select1">
        <option value="">&nbsp;+ 사용안함</option>
        <option value="">--------------------------------</option>
        <?php $_LVLARR = array()?>
        <?php $levelnum = getDbData($table['s_mbrlevel'],'gid=1','*')?>
        <?php $LVL=getDbArray($table['s_mbrlevel'],'','*','uid','asc',$levelnum['uid'],1)?>
        <?php while($_L=db_fetch_array($LVL)):$_LVLARR[$_L['uid']] = $_L['name']?>
        <option value="<?php echo $_L['uid']?>"<?php if($_L['uid']==$d['bbs']['level']):?> selected="selected"<?php endif?>><?php echo $_L['name']?> (<?php echo number_format($_L['num'])?>)</option>
        <?php endwhile?>
 
        <div id="guide_level" class="guide hide">
            본문접근레벨.<br />
        </div>
    </td>
</tr>
 
<?php
// a.config.php
$_tmpdfile = $g['dir_module'].'var/var.php';
 
$fp = fopen($_tmpdfile,'w');
fwrite($fp"<?php\n");
fwrite($fp"\$d['bbs']['level'] = \"".$level."\";\n");
fwrite($fp"?>");
fclose($fp);
@chmod($_tmpdfile,0707);
 
?>
cs


728x90
블로그 이미지

Link2Me

,
728x90

switch 문은 조건으로 들어온 변수와 case 값을 비교하여 참(true) 이면 실행하고, 참이 아니면 실행하지 않는 역할을 한다.

if {} elseif {} else {} 문과 유사하나 if 문은 조건이 참일때 해당하는 소스코드만 실행하지만

switch는 조건이 참인 case 부터 그 이하 case 와 default 까지 모두 실행하는 차이점이 있다.

그래서 해당되는 case 만 실행되도록 break 를 사용한다.


switch (n) {    // n은 대부분 변수
    case label1:
        code to be executed if n=label1;
        break;  // Use break to prevent the code from running into the next case automatically
    case label2:
        code to be executed if n=label2;
        break;
    case label3:
        code to be executed if n=label3;
        break;
    ...
    default:  // The default statement is used if no match is found.
        code to be executed if n is different from all labels;
}


실제코드에서 사용하는 예제

 <td><?php switch($R['goods']) {case "0":echo "미가입";break; case "1":echo "판매";break; case "9":echo "해지";break;}?></td>

728x90

'Web 프로그램 > PHP 문법' 카테고리의 다른 글

PHP isset 과 empty 설명  (1) 2016.04.27
PHP 대체 문법  (0) 2016.04.05
[PHP] 문자열 자르기 substr  (0) 2015.05.16
음악 재생 1  (0) 2015.03.28
[PHP기초] 삼항연산자 ?  (0) 2015.03.06
블로그 이미지

Link2Me

,
728x90

RB2 설치를 하고 나면 로그인이 가능하다.


그런데 회원가입하는 것을 달고 싶은데 어디서 찾아야 할지 구조를 제대로 파악하지 못하는 나로서는 매우 어렵다.

default layout 에서 아무리 찾아봐도 회원가입 하는 곳을 못찾겠다.

관리자로 로그인하니까 보이는 "프로필관리", "접속기록" 이라는 글자를 힌트로 자료를 검색해봤다.

find ./ -name "*.*" | xargs grep -l "프로필관리"
find ./ -name "*.*" | xargs grep -l "접속기록"

원하는 자료를 찾을 수 없어서

find ./ -name "*.*" | xargs grep -l "join"
으로 찾아봤다.


를 찾았고 내용을 확인해보고 나서 회원가입 페이지 링크하는 걸 알 수 있었다.

파일을 열어서 80번째 라인에


추가를 해주면 된다.

아니면 19번째 라인에다가

                <?php if(!$my['uid']):?>
                     <li><a href="<?php echo $g['s']?>/?m=bskrmbr&amp;front=join">회원가입</a></li>
                <?php endif?>
를 추가해줘도 된다.


그러면 이렇게 회원가입 페이지로 접속할 수 있다.


회원가입 페이지 내용을 수정하는 것은 회원모듈에서 step1.php 파일을 찾으면 된다.




728x90
블로그 이미지

Link2Me

,
728x90

설문조사를 만들다보면 체크박스를 여러개 선택하도록 해야 하는 경우가 있다.
이 경우에 사용할 수 있는 자바스크립트 코드이다.
자바스크립트는 초보수준이라 잘 모르는 것은 네이버지식인, 주변 지인 문의, 블로그 검색 등을 하면서 배우고 있는 중이다. 필요한 순간에 써먹을 수 있도록 하기 위해 기록해둔다. 아래 코드는 100% 동작되는 코드이다.

자바스크립트는 자신을 호출한 객체를 가르킬 때 this 키워드를 사용한다. 자바스크립트는 모든 호출이 객체를 통해 이루어지는 매커니즘이다.

this 키워드는 '명시적 객체' 만을 참조한다. 명시적 객체가 없으면 전역객체를 찾는다.



<SCRIPT LANGUAGE="JavaScript">
<!--
function fchk() {
    var chk_obj = document.getElementsByName("box_chk");
    var chk_leng = chk_obj.length;
    var checked = 0;
    for (i=0; i < chk_leng; i++) {
        if (chk_obj[i].checked == true) {
            checked += 1;
        }
    }
    if (checked < 2 ) {
        alert("항목을 2개 선택해주세요");
        return;
    }
}

// 정해진 개수 이상 체크 불가.
var count = 0;
function check_q1(chk_obj) {
    if(chk_obj.checked == true) {
        count++;
    } else {
        count--;
    }
    if(count <= 2) {
        return true;
    } else {
        count--;
        return false;
    }
}

function check(obj,condition, n) {
    if(condition == false){
        obj.checked = false;
        alert(n + "개를 초과 선택 불가합니다");
    }
}
//-->
</SCRIPT>

<form name="bbssearch" method="post" action="" onsubmit="return fchk();">
<input name="box_chk" type="checkbox" value="1" onclick="check(this,check_q1(this),2);" />박스1
<input name="box_chk" type="checkbox" value="2" onclick="check(this,check_q1(this),2);" />박스2
<input name="box_chk" type="checkbox" value="3" onclick="check(this,check_q1(this),2);" />박스3
<input name="box_chk" type="checkbox" value="4" onclick="check(this,check_q1(this),2);" />박스4
<input name="box_chk" type="checkbox" value="5" onclick="check(this,check_q1(this),2);" />박스5

<input type="submit" value=" 검색 " class="btngray" />
</form>



onSubmit="return fchk()" → 폼 전송이 이루어지기 전에 먼저 fchk() 함수를 실행하고, 함수실행 결과로 전달 받은 값이 false라면 폼전송을 하지 않고, true라면 폼 전송을 해라

728x90
블로그 이미지

Link2Me

,
728x90

RB2 회원모듈을 설치하는 과정이다.




로그인이 상태가 유지되지 않은 경우에는 에러가 발생한다. 그럴때는 다시 재로그인을 한 다음에 설치하면 설치가 된다.



회원모듈이 설치되었다는 표시이며, 설치된 폴더는 아래 그림과 같다.



회원비밀번호를 변경하는 기능까지 포함시켜서 모듈을 설치했다.



그리고 관리자가 회원을 수동으로 등록해주는 기능도 포함시켰다.


무식하면 손발이 고생한다고 수차례 설치와 삭제를 반복해봤다.

728x90
블로그 이미지

Link2Me

,
728x90

킴스큐 RB 2.0 을 어떻게 설치하는지 몰라서 설치하고 지우기를 수십번 반복하고 나서야 설치하는 방법은 알게되었다. 1.2 버전과 설치방식이 다르게 변경되었다.


리눅스 서버에 root 권한으로 접속해서 처리한 사항이다.

1. cd /home/httpd/설치할디렉토리

2. unzip rb2-installer.zip

3. rb 폴더 권한 변경

   chown -R apache:apache rb/


4. http://www.abc.com/rb/index.php 를 Web browser 에서 입력한다.

그러면






DB명, user, password 는 MySQL 상에서 미리 생성해야 한다.


// MySQL에 접속하여 새로운 Database 를 생성하고 사용자에게 권한을 부여하는 방법


mysql >create database DB명 default character set utf8;  -- DB 생성

mysql > use mysql;
mysql > create user userid@localhost identified by '패스워드';
// 사용자(userid)를 추가하면서 패스워드까지 설정

mysql > grant all privileges on DB명.* to userid@localhost identified by '패스워드';
// user 에게 DB명(ex, test) DB의 모든 테이블에 대한 권한 부여

mysql > flush privileges;    -- // 변경된 내용을 메모리에 반영(권한 적용)


이렇게 작업을 해주고 빠져나오면 된다.

사이트를 운영할 관리자 정보를 입력한다. (기본정보, 추가정보)


관리자의 이름과 관리자 E-Mail 주소, 관리자 ID, 관리자 패스워드를 입력하고 나면 rb 2.0 해당 테이블에 정보가 저장된다.


수차례 지우고 다시 설치하면서 알게된 사실은 사이트코드는 화면에 나오는 그대로 두어야 한다는 것이다. 변경하고 이러면 제대로 동작이 안된다. rb1.2 URL 도 확인하면서 이걸 다르게 변경하니까 오류가 난다는 사실 ㅠㅠㅠ





시작하기를 누르면 관리자 모드로 접속된다.


이제 회원모듈, 게시판모듈 등을 설치하면 된다.





728x90
블로그 이미지

Link2Me

,
728x90

document.getElementsByName(이름) 은 object 의 name 을 통해 인식한다.

id나 name을 이용해서 value 값을 가져오는 건데, 차이점이라면 getElementById(아이디)로 가져오면 단일값을 가져오고 getElementsByName(이름)은 해당 이름으로 된 객체를 모두 배열로 받아올 수 있다는 점이다.

ID를 가져오는 함수인 getElementById 와 다르게, name은 중복될 수 있는 요소이기 때문에 Element 에 s가 붙어 복수형이 된다. getElementsByName 을 쓸때에는 첫글자를 대문자로 쓰면 안된다.

비록 객체가 한개일지라도 배열로 값을 받아야 받을 수 있다. 즉,

    var obj = document.getElementsByName("objectName");

    alert(obj[0].value);

 


<SCRIPT LANGUAGE="JavaScript">
<!--
function fchk() {
    var chk_obj = document.getElementsByName("box_chk");
    var chk_leng = chk_obj.length;
    var checked = 0; //체크된 개수 파악을 위한 초기변수
    for (i=0; i < chk_leng; i++) {
        if (chk_obj[i].checked == true) {
            checked += 1;

              alert(chk_obj[i].value);    // 선택된 순서대로 값을 출력
        }
    }
    if (checked == 0 ) {
        alert("선택된 정보가 없습니다");
        return;
    } else {
        alert(checked + "개 선택");
        return;
    }
}
//-->
</SCRIPT>

<form name="bbssearch" method="post" action="" onsubmit="return fchk();">
<input name="box_chk" type="checkbox" value="1" />박스1
<input name="box_chk" type="checkbox" value="2" />박스2
<input name="box_chk" type="checkbox" value="3" />박스3
<input name="box_chk" type="checkbox" value="4" />박스4
<input name="box_chk" type="checkbox" value="5" />박스5

<input type="submit" value=" 검색 " class="btngray" />
</form>


특정한 값을 직접 변수로 저장하고 싶은 경우에는

function fchk() {

   var selectedvalue = document.bbssearch.box_chk[3].value;

   alert(selectedvalue);

}

로 해서 확인해 볼 수 있다.

form 이름 bbssearch 밑에 input name 인 box_chk 의 배열값을 직접 적어준다.


jQuery checkbox 선택 개수 체크는 http://link2me.tistory.com/1448 참조하면 된다.


728x90
블로그 이미지

Link2Me

,
728x90

설문조사를 하고자 할 경우 날짜를 체크하는 간단한 로직이다.


<?php
$start = mktime(10, 00, 10, 04, 28, 2015); // start를 2015년 4월 28일 10시 0분 10초로 설정
$end = mktime(19, 00, 10, 12, 05, 2015); // start를 2015년 12월 05일 19시 0분 10초로 설정
$now = time();

//------------ 설문조사가 종료된 경우 -------------
if($end < $now) {
   echo "<script> window.alert('설문조사 기간이 만료되었습니다'); history.back();</script>";
}

?>


728x90

'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글

킴스큐 함수 활용  (0) 2016.04.19
[PHP] 날짜 함수 정리  (0) 2015.08.03
[PHP] 쿠키와 세션, 그리고 보안  (0) 2015.05.27
[PHP] 홈페이지 설정 정보 확인  (0) 2015.04.28
PHP 기본 함수  (0) 2015.03.07
블로그 이미지

Link2Me

,
728x90

출처 : http://cacung82.blog.me/10035514681


n         쿠키란?

ü        쿠키란 서버측에서 클라이언트측에 상태 정보를 저장하고 추출할 수 있는 메커니즘

ü        클라이언트의 매 요청마다 웹 브라우저로부터 서버에게 전송되는 정보패킷의 일종

ü        HTTP에서 클라이언트의 상태 정보를 클라이언트의 하드 디스크에 저장하였다가 필요 시 정보를 참조하거나 재사용할 수 있음.

ü        사용 예

   방문했던 사이트에 다시 방문 하였을 때 아이디와 비밀번호 자동 입력

   팝업에서 오늘 이 창을 다시 보지 않음체크

ü        쿠키의 제약조건

   클라이언트에 총 300개까지 쿠키를 저장할 수 있다

   하나의 도메인 당 20개의 값만을 가질 수 있다

   하나의 쿠키 값은 4096Byte까지 저장 가능하다

하나의 도메인에서 설정한 쿠키값이 20개를 초과하면 가장 적게 사용된 쿠키부터 지워짐. 또한 쿠키는 기존에 설정한 값이 있는 곳에 값을 저장하거나 배열형태의 쿠키에 단일 값을 저장하려고 할 때 아무런 경고 없이 덮어쓰기 때문에 주의를 해야 한다.

 

n         세션이란?

ü     세션이란 클라이언트와 웹서버 간에 네트워크 연결이 지속적으로 유지되고 있는 상태를 말함

ü     클라이언트가 웹서버에 요청하여 처음 접속하면 JSP(혹은ASP)엔진은 요청한 클라이언트에 대하여 유일한 ID를 부여하게 되는데, ID를 세션이라 부른다

ü     세션 ID를 임시로 저장하여 페이지 이동 시 이용하거나, 클라이언트가 재 접속 했을 때 클라이언트를 구분할 수 있는 유일한 수단이 된다

ü     세션의 장점

  각각의 클라이언트마다 고유의 ID 부여

  세션 객체마다 저장해 둔 데이터를 이용하여 서로 다른 클라이언트의 요구에 맞게 서비스 제공

  클라이언트 자신만의 고유한 페이지를 열어놓아서 생길 수 있는 보안상의 문제 해결 용이

n         쿠키와 세션의 차이점

 쿠키(cookie)와 세션(session)은 기능상 비슷한 역할을 하고, 동작원리도 비슷하다. 왜냐하면, 일반적인 세션은 쿠키를 바탕으로 동작하기 때문이다. 그러나 가장 중요한 차이점은 저장되는 곳이 다르다는 것이다. 쿠키는 클라이언트에 저장되고, 세션은 서버에 저장된다. 쿠키의 경우에는 서버의 자원을 전혀 사용하지 않지만, 세션의 경우에는 서버에 저장되기 때문에 서버의 자원을 사용할 수가 있다. 쿠키와 세션의 만료 되는 기간도 다르다.

n    쿠키와 세션의 차이점()

구분

쿠키

세션

저장 위치

클라이언트

서버

저장 형식

텍스트형식

Object

종료 시점

쿠키 저장 시 설정(설정하지 않으면 브라우저 종료 시 소멸)

정확한 시점을 알 수 없다

    

클라이언트의 자원을 사용

서버의 자원을 사용

용량 제한

한 도메인 당 20, 쿠키 하나 당 4KB, 300

서버가 허용하는 한 용량에 제한이 없음

 

아래 내용은 위의 출처와는 별개로 별도 작성한 사항이다.


세션은 서버 측에 존재하기 때문에 web 서버가 주기적으로 세션의 상태를 확인할 수 있어서 특정 시간동안 web site 내에서 어떠한 이동도 발생하지 않으면 사용자가 나간 것으로 간주하여 세션을 삭제할 수 있다.

기본적으로 24분을 기준으로 하여 세션을 삭제한다.


※ PHP 5.4 부터 session_register 기능이 없어졌다.

<?php

// PHP에서 세션을 사용하려면 세션을 시작해줘야 한다.

// 세션을 시작하지 않은 페이지에서는 세션 값을 사용할 수 없다.

if(!isset($_SESSION)) {
    session_start();
}

if(!function_exists('session_register'))
{
    // PHP 5.4 부터 session_register 가 없어져 만들어진 코드
    // var_dump($_SESSION);
    foreach($_SESSION as $sKey => $sVal)
    {
        if(!isset(${$sKey}))
        {
            ${$sKey} = $sVal;
        }
    }

    function session_register($key)
    {
        $_SESSION[$key] = $GLOBALS[$key];
    }
}

?>


이런 코드도 사용하지 않는게 좋다.

PHP에서 권고하는 $_GET, $_POST, $_REQUEST 배열로 변수를 넘기는 걸 사용하는게 좋다.

그래야 android 연동, C# 과의 연동할 때에도 제대로 연동된다.


index.php 파일에서 코드 작성시에 기본적으로 이런 형태로 구성된다.

세션 값이 존재하면 자동으로 main.php 파일로 이동하고, 세션이 없으면 Login Form 을 띄운다.


if(isset($_SESSION['userID'])){
    echo("<meta http-equiv='Refresh' content='0; URL=main.php'>");
} else {
    include($_SERVER['DOCUMENT_ROOT'].'/loginForm.php');
}


세션 유지 시간 설정값은 php.ini 파일에 있다.

session.cache_expire = 180

로 3분으로 되어 있다. 늘리고 싶으면 값을 조정하고 Apache 를 restart 해야 한다.


[Session]
session.save_handler = files
session.save_path = "/temp"    //세션이 저장될 경로
session.use_cookies = 1          //클라이언트의 쿠키로 세션 아이디를 저장함
session.name = PHPSESSID     //세션아이디를 저장할 쿠키 이름
session.auto_start = 0            // 자동으로 세션을 시작함
session.cookie_lifetime = 0     // 세션아이디를 저장할 쿠키의 폐기시간
session.cookie_path = /         //세션 아이디를 저장할 쿠키 경로
session.cookie_domain =        //세션 아이디를 저장할 쿠키의 도메인


세션을 사용하기 원하는 파일에서 맨 위에 아래와 같이 코드를 추가해준다.

<?php

if(!isset($_SESSION)) {
    session_start();
}

?>

보통은 session_start(); 만 적어주면 되는데 jQuery 를 이용하여 코딩을 하다보면 파일을 include_once, require_once 로 파일을 include 하는 경우가 많다.

이때 세션이 있는 상태에서 또 세션이 들어오면 세션 중복 경고 메시지가 뜬다.

이런 경우를 방지하기 위해서 위와 같이 코드를 적어주는게 좋다.


<?php
// DB 연동후에 가져온 결과값
if(is_array($row)){
    if($row[0]==1){
        if(!isset($_SESSION)) {
            session_start();
        }
        $_SESSION['userID'] = $row['userID'];;
        $_SESSION['userIdx'] = $row['idx'];
    }
}
?>


세션이 동작하지 않을 때

ㅇ 웹브라우저 보안 수준이 높게 설정된 경우

ㅇ 웹브라우저 도구->인터넷옵션->개인정보에서 설정이 모든 쿠키를 차단하는 경우


세션 삭제

<?php
if(!isset($_SESSION)) {
    session_start();
}
session_destroy(); 
?>


session_unset("변수");  // 현재 변수의 값을 삭제하고 변수도 소멸시키는 함수

session_unset($_SESSION['userID']);


-----------------------------------------------------------------------------------------------

<?php
if(!isset($_SESSION)) {
    session_start();
}
$POST['userID']='jsk005@naver.com';
$_SESSION['userID']=$POST['userID'];
$id=$_SESSION['userID'];

if (isset($_SESSION['userID']) && !empty($_SESSION['userID']))
 echo $_SESSION['userID']. "님 반갑습니다.";
else
 echo "SESSION 없다.";
?>


세션 공격 방어


세션 토큰이 생성과는 과정은 위의 그림과 같다.

1. 서버에서 로그인 성공이후 세션 정보를 생성하면 해당 정보를 지정한 디렉토리에 PHPSESSIONID 를 저장한다.

2. 클라이언트는 세션 정보를 브라우저를 통해 COOKIE로 저장해둔다.


세션 쿠키의 값을 알아낼 수 있다면 아이디와 비번 따위는 훔칠 필요도 없다.

세션 쿠키를 사용하면 남의 아이디로 로그인된 상태로 만들 수 있다.

세션 고정 공격은 공격자가 정상적으로 얻을 수 있는 권한보다 높은 권한을 가진 SID를 획득하기 위해 수행하는 공격이므로, 로그인 하는 등 권한이 변경될 때마다 SID를 재생성한다면 무력화시킬 수 있다.

session_regenerate_id();
이 함수는 현재 세션ID를 새로운 세션 ID로 바꿔주는 함수다.
이 함수는 session_save_path 함수에서 절대 경로를 사용해야 한다.
주로 세션 고정 공격을 방지하는 데 도움이 된다.
그럼 언제 사용해야 하는가? 인증(Authentication) 단계(login, logout)가 바뀔 때마다 변경하는게 좋다.

$user = $c->getUser($userID, $password);
if ($user != false) {
    session_regenerate_id();
    $_SESSION['userID'] = $user['userID'];
    $_SESSION['userNM'] = $user['userNM'];
    $_SESSION['access'] = $user['access']; // Authorization (인가) : 특정 리소스에 접근할 수 있는 권한을 부여
}

이렇게 하고 크롬 브라우저 개발자 모드 network 에서 헤더정보를 확인해보면

Cookie: PHPSESSID=h0mf6k6ok9vhitq2v4l605d6d4
Cookie: PHPSESSID=q9or3cl6t8njqui5t28ql3ksi6
로그인/로그아웃 할 때마다 새로운 세션 ID로 변경된 것을 확인할 수 있다.


http/https 혼합 환경에서 세션 보안 강화하기 https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=79296 참조


변수에 대한 이해 http://link2me.tistory.com/996 에 isset 과 empty 에 대한 설명이 있다.

728x90

'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글

[PHP] 날짜 함수 정리  (0) 2015.08.03
[PHP] 설문조사 종료날짜 체크  (0) 2015.05.27
[PHP] 홈페이지 설정 정보 확인  (0) 2015.04.28
PHP 기본 함수  (0) 2015.03.07
[PHP] 한글자르기 substr  (0) 2015.01.04
블로그 이미지

Link2Me

,
728x90

PHP 소스파일의 위치를 빨리 찾는 방법이다.

예전에는 리눅스상에서 파일 찾는 방법을 몰라서 소스 전부를 다운로드 한 다음에 Total Commander 를 이용하여 소스에 찾고자하는 단어 검색을 해서 자료를 찾았다.

리눅스 상에서 파일 찾는 법을 배우고 나서는 그럴 필요가 전혀 없다.


로그인창을 띄우는 소스가 어디인지 궁금해서 찾아봤다.

위 그림에서 보면 "이메일 또는 아이디" 라는 글자가 보인다.

그리고 "아이디/비밀번호 기억" 이라는 글자도 보인다.

이걸 검색어로 넣고 검색을 했다.


find ./ -name "*.php" | xargs grep -l "이메일 또는 아이디"
find ./ -name "*.php" | xargs grep -l "아이디/비밀번호 기억"


찾고자 하는 파일의 위치를 정확하게 알려주었다.

방법을 모를 때는 완전 노가다를 해가며 육안찾기를 했었다.

728x90

'Web 프로그램 > 킴스큐RB' 카테고리의 다른 글

킴스큐 RB2 회원모듈 설치  (0) 2015.05.28
킴스큐 RB 2.0 설치  (0) 2015.05.28
글 등록자만 수정버튼 보이게 하기  (0) 2015.04.01
킴스큐 함수  (0) 2015.03.01
최고관리자 비밀번호 변경  (0) 2014.08.14
블로그 이미지

Link2Me

,
728x90

substr() : 문자열에서 필요한 부분만을 가져오고자 할 때 사용하는 함수

substr(문자열, 시작위치, 길이);

  - 시작위치 : 0 부터 시작한다.


$string = "Good Morning!!";
$result = substr($string, 3, 5);

echo $result.'<br/>';


str_replace : 문자열에 포함된 문자를 바꾸고자 할 때 사용하는 함수

str_replace(찾을문자, 교체문자, 문자열);

입력받은 문자열을 정해진 길이만큼 잘라서 리턴하는 함수이다.

if ($d['bbs']['badword_action']){
    $badwordarr = explode(',' , $d['bbs']['badword']);
    $badwordlen = count($badwordarr);
    for($i = 0; $i < $badwordlen; $i++) {
        if(!$badwordarr[$i]) continue;

        if(strstr($subject,$badwordarr[$i]) || strstr($content,$badwordarr[$i])) {
            if ($d['bbs']['badword_action'] == 1) {
                getLink('','','등록이 제한된 단어를 사용하셨습니다.','');
            } else {
                $badescape = strCopy($badwordarr[$i],$d['bbs']['badword_escape']);
                $content = str_replace($badwordarr[$i],$badescape,$content);
                $subject = str_replace($badwordarr[$i],$badescape,$subject);
            }
        }
    }
}


728x90

'Web 프로그램 > PHP 문법' 카테고리의 다른 글

PHP 대체 문법  (0) 2016.04.05
[PHP] switch 문  (0) 2015.06.01
음악 재생 1  (0) 2015.03.28
[PHP기초] 삼항연산자 ?  (0) 2015.03.06
[PHP기초] continue 문  (0) 2015.03.05
블로그 이미지

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>


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


728x90
블로그 이미지

Link2Me

,