728x90

킴스큐RB 1.2 에서 정해준 폴더에 출력하는 것이 아니라 완전 다른 폴더에서 별도로 만드는 게시판을 연동하는 경우를 테스트해봤다.

모양 출력 제대로 보이게 하는 것은 생락하고 화면에 출력되는 것만 보기 위해서다.

연동에 필요한 함수는 더 필요한 것을 찾아서 넣어야겠지만 기본적으로는 아래 4개 정도면 될거 같다.

테이블명은 직접 테이블명을 적어줘여 한다.


<?php
########## KIMSQRB와 연동된 로그인 정보 가져오기 ##########
defined('__KIMS__');
include_once '../_var/db.info.php';
include_once '../_core/function/db.mysql.func.php';
include_once '../_core/function/sys.func.php';
include_once '../_core/function/lib/getContent.lib.php';

$DB_CONNECT = isConnectDb($DB); // 데이터베이스 연결하기 완료

$sqlque = 'display=1';

$RCD = getDbArray('rb_guide_data',$sqlque,'*','uid','desc',0,1);
$NUM = getDbRows('rb_guide_data',$sqlque);
$TPG = getTotalPage($NUM,10);

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
echo $NUM;  // 게시물 개수
echo $TPG;  // 페이지 출력수
echo '<table border=1>';
echo '<tr>';

$i=1;
while ($R = db_fetch_array($RCD)){
    $_CAT1 = getUidData('rb_guide_category',$R['category1']);

    echo '<td ALIGN=CENTER>'.$i.'</td>';
    echo '<td ALIGN=CENTER>'.$_CAT1['classname'].'</td>';
    echo '<td>'.$R['eng'].'</td>';
    echo '<td>'.$R['kor'].'</td>';
    echo '<td>'.$R['kor'].'</td>';
    echo '<td>'.$R['kor1'].'</td>';
    echo '<td>'.$R['kor2'].'</td>';
    echo '<td>'.$R['kor3'].'</td>';
    echo '<td>'.LIB_getContents($R['content'],$R['html']).'</td>';
    echo '</tr>';
    $i++;
}
echo '</table>';
exit;

?>



블로그 이미지

Link2Me

,
728x90

자바스크립트에서 값이 참일 경우에만 폼 전송이 이루어지게 하는 예제이다.


<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<script language="JavaScript">
function send(f) {
    if (confirm('폼의 값을 전송할까요?')==1) {
        f.submit();
        window.close();
    }
}
</script>
</HEAD>
<BODY>
<form name=bbsSearch action= "http://www.naver.com">
<input type=button value="보내기" onClick=send(this.form) >
</form>
</BODY>
</HTML>


설명

조건문에서 1은 참(true), 0 은 거짓(false)을 나타낸다.

send(form) 에서 f 은 호출할 때 전달받은 인자(객체, 값 등)를 담은 함수의 매개변수다.

onClick=send(this.form) 에서 this.form 이 send 함수의 f 변수에 담겨진다.

var f = <form name=bbsSearch action= "http://www.naver.com"> 와 같은 의미다.

하지만 자바스크립트에서는 위와 같이 적어 사용할 수 없고

this.form 대신에 직접 객체를 찾아 대입한다면

var f=document.forms['bbsSearch'];  // form 중 이름이 bbsSearch 인 form 객체를 변수 f 에 대입

처럼 사용해야 한다.


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


자바스크립트 로그인 예제 파일이다. 첨부파일은 하단에 있으니 받아서 테스트해보면 된다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="form1.css"  />
</head>
<body>
<script>
function validateForm(){
    var sform = document.forms["s_form"];
    if(!sform.loginID.value){
        alert('아이디를 입력하세요');
        sform.loginID.focus();
        return false;
    }
    if(sform.loginPW.value ==''){
        alert('패스워드를 입력하세요');
        return false;
    }
}
</script>
<div class="container">
<h2>Form 예제1</h2>
<form name="s_form" method="post" action="form1.action.php" onsubmit="return validateForm();">
    <table>
        <tr>
            <td>로그인 ID</td>
            <td><input type="text" name="loginID" value=""></td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td><input type="password" name="loginPW"></td>
        </tr>
        <tr>
            <td colspan='2' align='center'><input type="submit" value="전송"></td>
        </tr>
    </table>
</fom>
</div>
</body>
</html>


아래 예제는 전송 버튼에 onclick 를 추가해서 시도해본 예제다.

<form name="s_form" method="post" action="#"> 기본 action 경로를 파일명으로 지정하지 않고도 자바스크립트에서 추가해서 보낼 수 있다는 걸 확인할 수 있다.

만약 <form name="s_form" action="#"> 와 같이 method 방식을 지정하지 않으면 default 인 method="get" 으로 동작된다는 것도 알아두자.

자바스크립트 코드에서 sform.method = "post"; 를 추가해주면 POST 방식으로 전송된다.

즉, 이 예제는 Form 의 기본 속성을 자바스크립트가 제어할 수 있다는 걸 보여주는 예제이다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="form1.css"  />

</head>
<body>
<script>
function validateForm(){
    var sform = document.forms["s_form"];
    if(!sform.loginID.value){
        alert('아이디를 입력하세요');
        sform.loginID.focus();
        return false;
    }
    if(sform.loginPW.value ==''){
        alert('패스워드를 입력하세요');
        sform.loginPW.focus();
        return false;
    }
    sform.method = "post";
    sform.action = "form1.action.php"; // 이 줄을 주석처리하면 어떤 결과가 될까?
}
</script>
<div class="container">
<h2>Form 예제2</h2>
<form name="s_form" method="post" action="#">
    <table>
        <tr>
            <td>로그인 ID</td>
            <td><input type="text" name="loginID" value=""></td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td><input type="password" name="loginPW"></td>
        </tr>
        <tr>
            <td colspan='2' align='center'><input type="submit" value="전송" onclick="return validateForm();"></td>
        </tr>
    </table>
</fom>
</div>
</body>
</html>


여기서 onclick="return validateForm();" 대신에 onclick="validateForm();" 로 하면 어떤 현상이 발생할까?

아래에서 첫번째 것은 아이디, 패스워드 등을 물어보는 팝업창이 한번 뜨고 form 전송 이벤트가 바로 실행되는 걸 확인할 수 있을 것이다.

두번째 것은 form action 을 자바스크립트에서 지정해주었기 때문에 순차 실행을 하다가 return false 를 실행하고 나서 form action 을 실행할 수가 없기 때문에 화면이 action 파일명으로 넘어가지 못한다.

sform.action = "form1.action.php"; 를 if 조건문 위쪽에 적었다면 팝업창을 띄워 입력값을 확인하지만 값이 입력되지 않았음에도 불구하고 실행된다는 걸 확인할 수 있다.

<form name="s_form" method="post" action="form1.action.php">

<script>
function validateForm(){
    var sform = document.forms["s_form"];
    if(!sform.loginID.value){
        alert('아이디를 입력하세요');
        sform.loginID.focus();
        return false;
    }
    if(sform.loginPW.value ==''){
        alert('패스워드를 입력하세요');
        sform.loginPW.focus();
        return false;
    }
}
</script>

<form name="s_form" method="post">

<script>
function validateForm(){
    var sform = document.forms["s_form"];
    if(!sform.loginID.value){
        alert('아이디를 입력하세요');
        sform.loginID.focus();
        return false;
    }
    if(sform.loginPW.value ==''){
        alert('패스워드를 입력하세요');
        sform.loginPW.focus();
        return false;
    }
    sform.method = "post";
    sform.action = "form1.action.php";
}
</script>


jsfrm1.zip



도움이 되셨다면 00 00 해 주세요.

블로그 이미지

Link2Me

,
728x90

PHP 에서 버그찾기가 참 힘들다.

C# 에서는 프로그램이 버그이면 메시지를 뿌려주니까 그 부분을 집중적으로 살펴보면 되는데 PHP는 에러가 발생한 곳을 찾아내기가 힘들다.

내가 뭔가 세팅을 잘못하고 있는 부분이 있는가 보다.


관리자 모드에서는 동작이 정상적으로 되는데 사용자 모드에서 동작이 안되길래 너무 이상하다고 버그 잡기에 나섰는데 킴스큐 RB 구조를 완벽하게 이해를 못하니까 버그 잡기가 쉽지 않다.

list.php 파일이 잘못되었나 살펴봐도 이상이 없다.

main.php 파일을 한줄 한줄 살펴보면서 원인을 찾아냈다.

if (!$my['admin']){
       $sqlque .= ' and hidden=0';
}

원인은 이거였다.

테이블을 설계하면서 hidden 필드 자체가 불필요해서 없애버렸다.

필드가 없으니까 당연히 에러가 보여야 되는데 화면에서는 데이터가 없다고만 나온다. ㅋㅋ

C# 이라면 필드 자체가 없으니까 에러가 나왔을 것인데 에러가 나오지를 않았다.

에러메시지 출력하라는 옵션을 제거해서 그런가??

아무튼 집중적으로 에러 잡는 방법을 배워야겠다.

로직 설계 부분에서는 아무런 문제가 없는데 나중에 한줄 한줄 확인하다보면 특정한 곳에서 발생하는 에러 때문에 문제가 생기는 거 같다.

블로그 이미지

Link2Me

,
728x90

Web 에서 버그가 생기면 찾아내기가 쉽다고 해서 피들러를 배워보려고 한다.


피들러

- 보내는 요청이나 들어오는 응답을 조작 가능

- 요청이나 응답에 중단점(breakpoint) 를 설정하여 트래픽을 수동으로 조작 가능

- 서버의 응답을 모두 수집한 뒤에 클라이언트로 데이터를 내보낸다.

- HTTPS 트래픽을 복호화하여 살펴보거나 수정하는 것도 가능하다.

- PC, 스마트폰에서 발생하는 웹 트래픽을 디버깅할 수 있다.

- 2G 미만의 요청/응답만 다룰 수 있다.





블로그 이미지

Link2Me

,
728x90

workcode workcode Query


select a.uid, a.id, b.name, b.nic, b.level, a.workcode from rb_s_mbrid a, rb_s_mbrdata b where a.uid=b.memberuid and a.workcode > 0 order by a.workcode desc;












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

킴스큐 폴더를 벗어난 폴더에서 PHP 함수 출력  (1) 2016.03.08
버그 찾기 힘들다  (0) 2016.02.15
킴스큐 RB2 게시판 생성  (0) 2015.09.30
RB2 Layout 설정  (0) 2015.08.20
킴스큐 RB2 모듈 삭제 방법  (0) 2015.08.01
블로그 이미지

Link2Me

,
728x90

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


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




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





rb_bbs_data 에 게시글이 추가된다.

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



게시판과 메뉴 연결



'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
를 활성화 시킨다.
 

 

블로그 이미지

Link2Me

,
728x90

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

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

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


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



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




블로그 이미지

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/

에서 보면 도움이 된다.




블로그 이미지

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 게시글 하단에 있으니 받으면 된다.


블로그 이미지

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);

블로그 이미지

Link2Me

,
728x90

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



블로그 이미지

Link2Me

,
728x90

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

rb_s_mbrid, rb_s_mbrdata


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


블로그 이미지

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


블로그 이미지

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>

'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 파일을 찾으면 된다.




블로그 이미지

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라면 폼 전송을 해라

블로그 이미지

Link2Me

,
728x90

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




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



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



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



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


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

블로그 이미지

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 도 확인하면서 이걸 다르게 변경하니까 오류가 난다는 사실 ㅠㅠㅠ





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


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





블로그 이미지

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 참조하면 된다.


블로그 이미지

Link2Me

,