[카테고리:] WebProgram

This is Web Program

  • PHP 알리고 SMS 라이브러리 사용 가이드

    이 포스팅에서는 PHP로 구현된 알리고(Ailgo) SMS 라이브러리의 사용법을 설명하겠습니다.

    알리고 SMS API를 손쉽게 사용하여 다양한 SMS 발송, 예약, 취소 기능을 구현할 수 있습니다.

    이 라이브러리는 다중 수신자 발송(Mass SMS), 메시지 상태 조회 등 주요 SMS 관련 기능을 제공하며, 이를 통해 PHP 개발자가 쉽게 통합할 수 있습니다.

    1. 클래스 개요

    AligoSMS 클래스는 알리고 API를 활용하여 SMS 발송, 대량 SMS 발송, 예약된 메시지 취소, 전송 내역 조회 등의 작업을 수행합니다.

    이 클래스는 다음과 같은 주요 기능을 제공합니다:

    • 단일/대량 SMS 발송
    • 예약된 SMS 취소
    • 최근 메시지 내역 조회
    • 남은 메시지 건수 조회
    • 메시지 상세 내역 조회

    클래스 인스턴스화

    이 클래스는 다음과 같은 형태로 인스턴스화됩니다.

    <?php
    require_once 'AligoSMS.php';
    
    $user_id = '사용자의 알리고 계정 아이디';
    $key = '발급받은 API 키';
    
    $aligo = new AligoSMS($user_id, $key);
    ?>

    2. 주요 함수와 사용 예제

    2.1 sendSMS(): 단일 메시지 발송

    단일 수신자에게 SMS 또는 MMS 메시지를 보낼 때 사용합니다.

    사용법

    $aligo->sendSMS($message, $receiver, $sender, $subject, $msg_type, $testmode_yn);

    매개변수

    • $message (문자열): 전송할 메시지 내용
    • $receiver (문자열): 수신자 전화번호
    • $sender (문자열): 발신자 전화번호
    • $subject (문자열, 선택): 메시지 제목 (MMS인 경우 필수)
    • $msg_type (문자열, 선택): 메시지 유형 (SMS 또는 MMS)
    • $testmode_yn (문자열, 선택): 테스트 모드 여부 ('Y' 또는 'N')

    예제

    $message = '안녕하세요, 알리고 SMS 테스트입니다.';
    $receiver = '01012345678';
    $sender = '0298765432';
    
    $response = $aligo->sendSMS($message, $receiver, $sender);
    print_r($response);

    반환 값

    • API 응답 데이터를 배열 형태로 반환합니다. 성공/실패 여부 및 상세 정보가 포함됩니다.

    2.2 sendMassSMS(): 대량 메시지 발송

    여러 수신자에게 동일하거나 다른 메시지를 보낼 때 사용합니다.

    사용법

    $aligo->sendMassSMS($sender, $messages, $rdate, $rtime, $msg_type, $testmode_yn);

    매개변수

    • $sender (문자열): 발신자 전화번호
    • $messages (배열): 여러 메시지를 포함하는 배열 (각 요소는 ['receiver' => 수신자, 'message' => 메시지 내용, 'subject' => 제목] 형식)
    • $rdate$rtime (문자열, 선택): 예약 발송 날짜 및 시간
    • $msg_type (문자열, 선택): 메시지 유형 (SMS 또는 MMS)
    • $testmode_yn (문자열, 선택): 테스트 모드 여부 ('Y' 또는 'N')

    예제

    $sender = '0298765432';
    $messages = [
        ['receiver' => '01011112222', 'message' => '첫 번째 메시지', 'subject' => '제목 1'],
        ['receiver' => '01033334444', 'message' => '두 번째 메시지', 'subject' => '제목 2'],
    ];
    
    $response = $aligo->sendMassSMS($sender, $messages);
    print_r($response);

    반환 값

    • 전송 결과가 포함된 배열을 반환합니다. 최대 500명까지 한 번에 전송 가능합니다.

    2.3 cancelSMS(): 예약 메시지 취소

    예약된 SMS 발송을 취소할 수 있습니다.

    사용법

    $aligo->cancelSMS($mid);

    매개변수

    • $mid (문자열): 메시지 고유 ID (예약 발송시 부여받은 ID)

    예제

    $mid = '메시지 고유 ID';
    $response = $aligo->cancelSMS($mid);
    print_r($response);

    반환 값

    • 취소 요청 결과를 배열로 반환합니다.

    2.4 getRecentMessages(): 최근 메시지 내역 조회

    최근 발송된 메시지의 내역을 조회합니다.

    사용법

    $aligo->getRecentMessages($page, $page_size, $start_date, $limit_day);

    매개변수

    • $page (정수, 선택): 조회할 페이지 번호 (기본값: 1)
    • $page_size (정수, 선택): 한 페이지에 표시할 메시지 수 (기본값: 10)
    • $start_date (문자열, 선택): 조회 시작 날짜 (YYYY-MM-DD 형식)
    • $limit_day (정수, 선택): 조회 기간 제한 (최대 조회 가능 일수)

    예제

    $response = $aligo->getRecentMessages(1, 10);
    print_r($response);

    반환 값

    • 최근 발송된 메시지 내역을 배열 형태로 반환합니다.

    2.5 getRemainingCount(): 남은 메시지 건수 조회

    현재 계정에 남아있는 메시지 발송 가능 건수를 조회합니다.

    사용법

    $aligo->getRemainingCount();

    예제

    $response = $aligo->getRemainingCount();
    print_r($response);

    반환 값

    • 남아있는 건수 정보를 배열 형태로 반환합니다.

    2.6 getSMSDetail(): SMS 상세 내역 조회

    특정 메시지의 발송 상세 내역을 조회합니다.

    사용법

    $aligo->getSMSDetail($mid, $page, $page_size);

    매개변수

    • $mid (문자열): 메시지 고유 ID
    • $page$page_size (정수, 선택): 조회할 페이지와 페이지 크기

    예제

    $mid = '메시지 고유 ID';
    $response = $aligo->getSMSDetail($mid);
    print_r($response);

    반환 값

    • 메시지의 상세 내역을 배열로 반환합니다.

    3. 주의사항 및 테스트 모드

    테스트 모드 사용

    테스트 모드를 사용하여 실제 메시지를 보내지 않고 API의 기능을 테스트할 수 있습니다. 함수 호출 시 testmode_yn을 'Y'로 설정하여 사용합니다. 테스트 모드에서는 실제 메시지가 발송되지 않으며, API 호출의 성공/실패 응답을 테스트할 수 있습니다.

    최대 발송 가능 수

    • 대량 메시지 발송의 경우 최대 500명까지 한 번에 발송할 수 있습니다. 그 이상의 경우 여러 요청으로 나누어야 합니다.

    결론

    이 PHP 클래스는 알리고 SMS API를 쉽게 사용할 수 있도록 만들어졌습니다.

    위에서 소개한 주요 기능들을 통해 단일/대량 SMS 발송, 예약 취소, 남은 건수 조회 등의 기능을 구현할 수 있습니다.

    배포 및 사용시 주의사항을 잘 확인하고, 필요에 따라 테스트 모드를 활용하여 효율적인 메시지 발송 시스템을 구축해 보세요.

    알리고 SMS 문자발송 라이브러리(https://sir.kr/cmall/1732015631)

  • 국토교통부 지하철 SubwayInfoService API Class 사용설명서

    이 문서는 개발자를 위한 SubwayInfoService 클래스 사용 가이드입니다.

    SubwayInfoService 클래스 구입 : https://sir.kr/cmall/1719750800(옵션 : TAGO 지하철 API Class)

    이 클래스는 국토교통부에서 제공하는 공공데이터 오픈 API를 활용하여 지하철 역 정보, 출구 주변 버스 노선, 출구 주변 시설 목록, 시간표 정보를 조회할 수 있도록 설계되었습니다.

    아래에서 클래스 선언, 함수 원형, 사용법, 예시, 그리고 각 함수의 세부 설명을 확인할 수 있습니다.

    클래스 선언

    $serviceKey = 'YOUR_SERVICE_KEY';
    $subwayInfoService = new SubwayInfoService($serviceKey);
    • $serviceKey: 공공데이터포털에서 발급받은 인증키를 입력합니다.
    • SubwayInfoService: 이 클래스는 지하철 관련 정보를 쉽게 조회하기 위해 설계되었습니다.

    클래스 내 주요함수 소개

    getKeywordBasedSubwayStationList($subwayStationName, $numOfRows = 10, $pageNo = 1, $type = 'xml')

    기능: 지하철역 목록을 키워드로 검색합니다.

    매개변수:

    • $subwayStationName: 조회할 지하철역 이름 (예: ‘서울역’)
    • $numOfRows: 페이지당 결과 개수 (기본값: 10)
    • $pageNo: 페이지 번호 (기본값: 1)
    • $type: 응답 형식 (XML 또는 JSON)

    반환 값: XML 또는 JSON 형식의 역 목록

    getSubwayStationExitBusRouteList($subwayStationId, $numOfRows = 10, $pageNo = 1, $type = 'xml')

    기능: 특정 지하철역 출구별 버스 노선을 조회합니다.

    매개변수:

    • $subwayStationId: 지하철역 ID (예: ‘MTRS11133’)
    • $numOfRows: 페이지당 결과 개수 (기본값: 10)
    • $pageNo: 페이지 번호 (기본값: 1)
    • $type: 응답 형식 (XML 또는 JSON)

    반환 값: 출구별 버스 노선 목록

    getSubwayStationExitFacilityList($subwayStationId, $numOfRows = 10, $pageNo = 1, $type = 'xml')

    기능: 특정 지하철역 출구별 주변 시설 목록을 조회합니다.

    매개변수:

    • $subwayStationId: 지하철역 ID (예: ‘MTRS11133’)
    • $numOfRows: 페이지당 결과 개수 (기본값: 10)
    • $pageNo: 페이지 번호 (기본값: 1)
    • $type: 응답 형식 (XML 또는 JSON)

    반환 값: 출구별 주변 시설 목록

    getSubwayStationScheduleList($subwayStationId, $dailyTypeCode, $upDownTypeCode, $numOfRows = 10, $pageNo = 1, $type = 'xml')

    기능: 특정 지하철역의 시간표를 조회합니다.

    매개변수:

    • $subwayStationId: 지하철역 ID (예: ‘MTRS11133’)
    • $dailyTypeCode: 요일 코드 (01: 평일, 02: 토요일, 03: 일요일)
    • $upDownTypeCode: 상/하행 코드 (U: 상행, D: 하행)
    • $numOfRows: 페이지당 결과 개수 (기본값: 10)
    • $pageNo: 페이지 번호 (기본값: 1)
    • $type: 응답 형식 (XML 또는 JSON)

    반환 값: 시간표 목록

    getAllBusRoutesByStation($subwayStationId)

    기능: 특정 지하철역 출구별로 모든 버스 노선을 조회합니다.

    매개변수:

    • $subwayStationId: 지하철역 ID (예: ‘MTRS11133’)

    반환 값: 출구별로 정렬된 모든 버스 노선 목록

    getAllFacilitiesByStation($subwayStationId)

    기능: 특정 지하철역 출구별로 모든 주변 시설을 조회합니다.

    매개변수:

    • $subwayStationId: 지하철역 ID (예: ‘MTRS11133’)

    반환 값: 출구별로 정렬된 모든 시설 목록

    getSubwayStationInfo($lineName, $stationName)

    기능: 특정 호선과 역명을 기반으로 해당 역의 정보를 조회합니다.

    매개변수:

    • $lineName: 노선 이름 (예: ‘1호선’)
    • $stationName: 지하철역 이름 (예: ‘서울역’)

    반환 값: 호선과 역 이름이 일치하는 지하철역 정보

    사용 예제

    // 1. 특정 역의 상세 정보를 조회
    $stationInfo = $subwayInfoService->getSubwayStationInfo('1호선', '서울역');
    print_r($stationInfo);
    
    // 2. 특정 역 출구의 버스 노선 조회
    $busRoutes = $subwayInfoService->getAllBusRoutesByStation($stationInfo['subwayStationId']);
    print_r($busRoutes);
    
    // 3. 특정 역 출구의 주변 시설 조회
    $facilities = $subwayInfoService->getAllFacilitiesByStation($stationInfo['subwayStationId']);
    print_r($facilities);
    
    // 4. 특정 역의 시간표 조회
    $schedule = $subwayInfoService->getSubwayStationScheduleList(
        $stationInfo['subwayStationId'], '01', 'U'
    );
    print_r($schedule);

    SubwayInfoService 클래스에 대해 궁금하신 사항은 댓글이나 문의사항에 남겨주시면 감사하겠습니다.

  • 고민 해결 웹앱 개발하기: PHP와 JavaScript를 활용한 마법의 책

    여러분은 매일 어떤 고민을 하고 계신가요?

    오늘 소개할 프로그램은 여러분의 고민을 해결해 줄 마법의 책입니다.

    https://wizardofcode.kr/wg/happybook

    이 프로그램은 PHP와 JavaScript를 사용하여 구현되었으며, 반응형 디자인으로 모바일에서도 완벽하게 작동합니다.

    프로그램 소개

    “마법의 고민 해결 책”은 사용자가 고민을 생각하고 책을 열면, 그 고민을 해결해 줄 만한 명언이나 조언을 제공하는 웹 애플리케이션입니다.

    이 프로그램은 간단한 인터페이스와 직관적인 사용법을 제공하여 누구나 쉽게 사용할 수 있습니다.

    구동원리

    1. 사용자가 고민을 생각하고 “열어보기” 버튼을 클릭합니다.
    2. “열어보기” 버튼을 클릭하면 약 1초의 생각할 시간을 카운팅 후에 책이 열리는 애니메이션 효과가 나타납니다.
    3. 책이 열리면 고민을 해결해 줄 만한 명언이 책 페이지에 표시됩니다.

    핵심 코드 설명

    HTML 부분

    HTML 구조는 간단합니다.

    첫 페이지에는 책 표지가 표시되고, 사용자가 고민을 생각하는데 도움을 주는 문구와 “열어보기” 버튼이 있습니다.

    <div class="book-cover" id="bookCover">
        <div class="book-cover-content">
            <h1>Happy Book</h1>
            <p>구체적이고 행동과 목표에 초점을 맞춘 고민을 생각해보세요.</p>
            <button id="openBookBtn">열어보기</button>
        </div>
    </div>

    css 부분

    CSS는 반응형 디자인을 적용하여 모바일에서도 잘 보이도록 했습니다.

    또한, 책이 열리는 애니메이션 효과를 구현했습니다.

    .book-cover {
        background: #001f3f;
        border: 2px solid #fff;
        padding: 20px;
        border-radius: 10px;
        box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.5);
        width: 300px;
        height: 400px;
        text-align: center;
        transition: transform 1s, opacity 1s;
        transform-style: preserve-3d;
        position: absolute;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    JavaScript 부분

    JavaScript는 “열어보기” 버튼 클릭 시 책이 열리는 애니메이션과 명언을 불러오는 기능을 담당합니다.

    document.getElementById('openBookBtn').addEventListener('click', function() {
        var bookCover = document.getElementById('bookCover');
        bookCover.style.transform = 'rotateY(-180deg)';
        bookCover.style.opacity = '0';
    
        setTimeout(function() {
            bookCover.classList.add('hidden');
            document.getElementById('modal').style.display = 'flex';
    
            setTimeout(function() {
                fetch('get_quote.php')
                    .then(response => response.text())
                    .then(data => {
                        document.getElementById('modal').style.display = 'none';
                        document.getElementById('answer').innerText = data;
                        document.getElementById('result').style.display = 'block';
                        document.querySelector('.book-opened').classList.add('show');
                    });
            }, 3000);
        }, 1000);
    });

    PHP 부분

    PHP는 명언 목록에서 무작위로 하나를 선택하여 반환합니다.

    $quotes = [
        "고민은 시간만 늦출뿐 당장 실행해보자.",
        "시간은 새와 같다 날아가기 전에 잡아라.",
        // 추가 명언들...
    ];
    
    echo $quotes[array_rand($quotes)];

    마치며

    이 프로그램은 간단하면서도 유용합니다.

    여러분의 간단한 고민을 해결하는 데 큰 도움이 될 것입니다.

    여러분도 직접 이 프로그램을 만들어보고, 더 나은 기능을 추가해보세요.

  • 자바스크립트 팝업 차단 확인: 팝업 블록 방지 방법

    웹 페이지에서 팝업 창을 활용하는 기능을 구현했는데, 사용자의 브라우저 설정에 따라 팝업이 차단되어 제대로 열리지 않는 경우가 있습니다.

    이러한 문제를 방지하기 위해 자바스크립트로 팝업 차단 여부를 확인하고, 사용자에게 안내 메시지를 표시하는 방법을 알아보겠습니다.

    핵심 코드 분석
    function openNewWindow(url) {
      const popup = window.open(url, '_blank');
    
      if (!popup || popup.closed) {
        alert('팝업이 차단되었습니다. 팝업 차단을 해제하고 다시 시도해주세요.');
      } else {
        // 팝업이 성공적으로 열렸을 때 추가적인 작업 (선택 사항)
        popup.focus(); // 팝업 창에 포커스 주기
      }
    }
    코드 설명
    1. 새창 열기
      • window.open(url, ‘_blank’)를 사용하여 주어진 url로 새 창을 엽니다. _blank는 새 창을 여는 표준적인 방법입니다.
    2. 팝업 차단 감지
      • 팝업 창이 성공적으로 열렸는지 확인합니다. 팝업 차단 설정으로 인해 새 창이 열리지 않거나, 사용자가 팝업 창을 즉시 닫은 경우 등을 감지합니다.
    3. 팝업 차단 알림
      • 팝업 창이 제대로 열리지 않으면 사용자에게 “팝업이 차단되었습니다. 팝업 차단을 해제하고 다시 시도해주세요.”라는 알림 메시지를 표시합니다.

    코드 분석

    popup 변수는 window.open() 함수의 반환값을 저장합니다.

    이 값은 새로 열린 창(window 객체)을 나타내거나, 팝업 차단 등으로 인해 창이 열리지 못한 경우 null 값을 가집니다.
    !popup 조건은 popup이 null인지 확인하여 팝업 차단 여부를 검사합니다.

    popup.closed는 팝업 창이 닫혔는지 확인합니다.

    typeof popup.closed == ‘undefined’는 일부 브라우저에서 팝업이 차단되었을 때 popup.closed 속성이 정의되지 않는 경우를 처리합니다.

    주의 사항
    • 팝업 차단 우회
      • 팝업 차단은 사용자의 의도적인 설정이므로, 이를 우회하려는 시도는 사용자 경험을 해칠 수 있습니다. 팝업 차단 알림을 통해 사용자가 직접 팝업 차단을 해제하도록 유도하는 것이 좋습니다.
    • 브라우저 호환성
      • 팝업 차단 감지 로직은 대부분의 최신 브라우저에서 잘 작동하지만, 일부 오래된 브라우저에서는 완벽하게 작동하지 않을 수 있습니다.

    이상 팝업 차단 여부를 확인하는 방법에 대한 포스팅을 마치도록 하겠습니다.

    감사합니다.

  • 자바스크립트 새창 POST 데이터 전송: 쉽게 배우는 가이드

    웹 개발 중 새로운 창으로 열면서 POST 데이터를 전달해야 할 때가 있습니다.

    단순히 페이지를 여는 것이 아니라, 정보를 안전하게 POST 방식으로 전송하고 싶다면 어떻게 해야 할까요?

    이 글에서는 자바스크립트를 활용하여 새 창으로 POST 데이터를 전송하는 방법을 자세히 알아보겠습니다.

    핵심 코드 분석:
    function openNewWindow(content_id) {
      const form = document.createElement('form');
      form.method = 'POST';
      form.action = '팝업주소'; 
      form.target = '_blank'; 
    
      const hiddenField = document.createElement('input');
      hiddenField.type = 'hidden';
      hiddenField.name = 'content';
      hiddenField.value = content; 
    
      form.appendChild(hiddenField);
      document.body.appendChild(form); 
      
      form.submit();
    }
    
    코드 설명:
    1. 폼 생성
      • document.createElement(‘form’);
      • 데이터를 담아 전송할 폼 요소를 동적으로 생성합니다.
    2. POST 방식 설정
      • form.method = ‘POST’;
      • 데이터 전송 방식을 POST로 지정하여 보안을 강화합니다.
    3. 새로 열 URL 설정
      • form.action = ‘팝업주소’;
      • 데이터를 받아 처리할 페이지의 주소를 설정합니다.
    4. 타겟 설정
      • form.target = ‘_blank’;
      • _blank로 설정하여 새 창에서 페이지를 엽니다.
    5. 숨겨진 필드 추가
      • const hiddenField = document.createElement(‘input’);
        hiddenField.type = ‘hidden’;
        hiddenField.name = ‘content’;
        hiddenField.value = content;
      • 전송할 데이터를 숨겨진 필드에 담아 사용자에게 노출되지 않도록 합니다.
    6. 폼 제출
      • form.submit();
      • 자바스크립트를 통해 폼을 자동으로 제출하여 데이터를 전송합니다.

    왜 POST 방식을 사용해야 할까요?

    GET 방식은 URL에 데이터가 노출되어 보안에 취약할 수 있습니다. 민감한 정보를 다룰 때는 POST 방식을 사용하여 데이터를 안전하게 전송해야 합니다.

    자바스크립트를 사용하여 새 창으로 열면서 POST 데이터를 전송하는 방법에 대한 설명을 마치도록 하겠습니다.

    감사합니다.

  • PHP로 게시판 등록일자 표시: 방금전, 몇 시간 전, 몇 일 전 자동 계산하기

    웹사이트의 게시판이나 블로그에서 등록일자를 사용자에게 직관적으로 표시하는 것은 매우 중요합니다.

    본 포스팅에서는 PHP를 이용해 게시물의 등록일자를 ‘방금전’, ‘몇 시간 전’, ‘며칠 전’ 등의 상대적인 시간 형식으로 표시하는 방법을 설명합니다.

    이를 통해 사용자 경험을 개선하고, 게시물의 최신성을 쉽게 파악할 수 있게 됩니다.

    목차

    1. 함수 소개
    2. 코드 예제
    3. CSS 스타일 적용
    4. 적용 예시
    5. 결론

    1. 함수 소개

    게시물의 등록일자를 상대적인 시간으로 표시하기 위해 다음의 두 가지 함수를 사용합니다.

    • getRelativeDate: 주어진 날짜와 현재 날짜의 차이에 따라 상대적인 날짜를 반환합니다.
    • getRelativeTime: 주어진 시간과 현재 시간의 차이에 따라 상대적인 시간을 반환합니다.

    이 함수들은 주어진 날짜나 시간과 현재 시간의 차이를 계산하여 “방금전”, “X분전”, “X시간전”, “어제”, “X일전” 등의 형식으로 직관적으로 표시합니다.

    2. 코드 예제

    아래는 PHP에서 상대적인 날짜와 시간을 계산하여 표시하는 코드입니다.

    아래의 코드를 print_date.lib.php에 만들어보겠습니다.

    <?php
    // print_date.lib.php
    
    /**
     * 주어진 날짜와 현재 날짜의 차이에 따라 상대적인 날짜를 반환하는 함수
     *
     * @param string $datetime - 비교할 날짜 시간 문자열
     * @return string - 상대적인 날짜를 나타내는 문자열
     */
    function getRelativeDate($datetime) {
        $now = time();
        $dateTimestamp = strtotime($datetime);
    
        if (!$dateTimestamp) {
            return " ";
        }
    
        // 날짜 차이를 초 단위로 계산
        $diffInSeconds = $now - $dateTimestamp;
        $daysAgo = floor($diffInSeconds / 86400);
    
        // 날짜 차이에 따른 문자열 생성
        if ($daysAgo < 1) {
            return getRelativeTime($datetime);
        } elseif ($daysAgo == 1) {
            return '<span class="time-day">어제</span>';
        } elseif ($daysAgo < 7) {
            return '<span class="time-day">' . $daysAgo . '일전</span>';
        } elseif (date('Y', $dateTimestamp) == date('Y')) {
            // 7일 이상, 같은 해 내의 경우 MM-DD 형식으로 반환
            return '<span class="time-date">' . date('m-d', $dateTimestamp) . '</span>';
        } else {
            // 다른 해의 경우 YYYY-MM-DD 형식으로 반환
            return '<span class="time-date">' . date('Y-m-d', $dateTimestamp) . '</span>';
        }
    }
    
    /**
     * 주어진 시간과 현재 시간의 차이에 따라 상대적인 시간을 반환하는 함수
     *
     * @param string $time - 비교할 시간 문자열
     * @return string - 상대적인 시간을 나타내는 문자열
     */
    function getRelativeTime($time){
        $now = time();
        $dateTimestamp = strtotime($time);
    
        $diffInSeconds = $now - $dateTimestamp;
        $hours = floor(abs($diffInSeconds / 3600));
        $minutes = floor(abs($diffInSeconds % 3600) / 60);
        $seconds = floor(abs($diffInSeconds % 60));
    
        if ($hours > 0) {
            return '<span class="time-hour">' . $hours . '시간전</span>';
        }
    
        if ($minutes > 0) {
            return '<span class="time-minute">' . $minutes . '분전</span>';
        }
    
        return '<span class="time-recent">방금전</span>';
    }
    ?>

    위 코드를 통해 getRelativeDate 함수는 입력된 날짜와 현재 날짜의 차이에 따라 “어제” 또는 “X일전”을 반환합니다.

    getRelativeTime 함수는 시간 차이에 따라 “방금전”, “X분전”, “X시간전”을 반환합니다.

    3. CSS 스타일 적용

    상대적인 날짜와 시간 텍스트를 시각적으로 매력적이게 표시하기 위해 CSS 스타일을 추가해보겠습니다.

    다음은 스타일을 정의하는 styles.css 파일의 예제입니다.

    /* styles.css */
    
    /* 시간 표시 스타일 */
    .time-hour {
        color: #4f95b7;
        font-weight: bold;
    }
    
    .time-minute {
        color: #ff8521;
        font-weight: bold;
    }
    
    .time-recent {
        color: #ee3616;
        font-weight: bold;
    }
    
    .time-day {
        color: #333;
    }
    
    .time-date {
        color: #666;
    }

    이 CSS 클래스들은 상대적인 날짜와 시간 텍스트의 색상과 굵기를 설정하여 강조할 부분을 명확하게 표시합니다.

    4. 적용 예시

    PHP와 CSS 파일을 통합하여 등록일자를 표시하는 예제 파일인 index.html을 만들어보겠습니다.

    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>PHP 상대 시간 계산 및 게시판 등록일자 표시</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
        <?php include 'print_date.lib.php'; ?>
    
        <h1>PHP 상대 시간 계산 및 게시판 등록일자 표시</h1>
        <p>현재 날짜로부터 몇 일 전인지: <?php echo getRelativeDate('2024-06-12 14:30:00'); ?></p>
        <p>몇 시간 전인지: <?php echo getRelativeTime('2024-06-18 10:00:00'); ?></p>
    </body>
    </html>

    수행을 하면 서버 시간을 기준으로 몇 일전인지 몇 시간 전인지 출력을 하게 됩니다.

    5. 결론

    이 글에서는 PHP를 사용하여 게시판의 등록일자를 ‘방금전’, ‘몇 시간 전’, ‘며칠 전’ 등으로 표시하는 방법을 다루었습니다.

    이 방법은 사용자에게 등록일자의 최신성을 직관적으로 전달하며, 게시물의 가독성을 높여줍니다.

    제공된 예제 코드를 통해 쉽게 자신의 프로젝트에 통합하고, CSS를 통해 스타일을 조정하여 사용자 경험을 향상시킬 수 있습니다.

    이 예제와 설명이 여러분의 프로젝트에서 상대적인 날짜 및 시간을 표시하는 데 도움이 되길 바랍니다.

  • OpenAI API 통신클래스 – 함수 사용 설명서

    본 포스팅은 그누보드 컨텐츠몰에서 판매하는 OpenAI API 통신 클래스의 함수 설명을 위한 페이지 입니다.

    [OPEN API 통신 클래스](https://sir.kr/cmall/1718185825)

    압축 파일을 해제하면 /source/lib 폴더안에 copenai.lib.php 파일이 존재합니다.

    파일 안에는 아래와 같은 구조의 클래스가 선언되어있답니다.

    class OpenAIApiUtf8 {
      function __construct($key,$apiURL = 'https://api.openai.com/v1/chat/completions');
      public function send($strData,$strBeforeQuestion="",$strAssistant="",$maxLength=3000,$model='35t');
      public function generateImage($prompt, $model = '3', $imgsize = '1024x1024');
      function ChangeAPIKey($key);
    }

    각 함수의 기능을 설명해드리겠습니다.

    class OpenAIApiUtf8

    생성자 : function __construct($key,$apiURL = 'https://api.openai.com/v1/chat/completions')

    OpenAIApiUtf8 클래스는 OpenAI의 GPT나 DALL-E API를 쉽게 이용하기 위한 클래스입니다.

    매게변수
    $keyOpenAI에서 발급받은 API키를 입력해주시면 됩니다.
    $apiURLOpenAI에서 GPT와 연결할 사이트 주소로 생략이 가능합니다.
    기본 값은 ‘https://api.openai.com/v1/chat/completions’입니다.

    아래와 같이 선언하여 사용할 수 있습니다.

    $cOpenAI = new OpenAIApiUtf8("발급받은 APIKEY");

    ChangeAPIKey

    함수 원형 : function ChangeAPIKey($key)

    이 함수는 OpenAIApiUtf8 클래스를 생성할 때 설정한 API를 변경할 때 이용합니다.

    매게변수
    $keyOpenAI에서 발급받은 API키를 입력해주시면 됩니다.
    예제
    $cOpenAI->ChangeAPIKey("발급받은 APIKEY");

    send

    함수 원형 : public function send($strData,$strBeforeQuestion="",$strAssistant="",$maxLength=3000,$model='35t');

    send 함수는 OpenAI API를 이용해 질문을 보내고 답변을 받아오는 기능을 수행합니다.

    매게변수
    변수명기본값기능
    $strDataGPT에게 하고 싶은 질문을 하면 됩니다.
    $strBeforeQuestion“”GPT와 대화를 이어가고 싶을 때 이전 질문을 입력하면 됩니다.(생략가능)
    $strAssistant“”GPT와 대화를 이어가고 싶을 때 이전 질문의 답변을 입력하면 됩니다.(생략가능)
    $maxLength3000가져올 답변의 최대 토큰수를 입력하면 됩니다.(생략가능)
    $model’35t’GPT 모델을 지정해주면 됩니다.(생략가능)
    35t : GPT-3.5 Turbo
    4o : GPT-4o
    45t : GPT-4 Turbo
    45 : GPT-4

    예제
    print_r( $cOpenAI->send("다음은 무슨 과일에 대한 설명일까? 동그랗고 빨개.") );
    
    // GPT-4o로 대화를 원할 경우
    print_r( $cOpenAI->send("다음은 무슨 과일에 대한 설명일까? 동그랗고 빨개.", "", "", 3000, '4o') );

    generateImage

    함수 원형 : public function generateImage($prompt, $model = '3', $imgsize = '1024x1024');

    Dall-E를 이용해 이미지를 그리고 싶을 때 이용하는 함수입니다.

    이 함수를 이용해 이미지를 그려달라고 요청하면 그려진 이미지의 URL이 반환됩니다.

    매게변수
    변수명기본값기능
    $promptDall-e에게 요청할 그림 프롬프트입니다.
    $model‘3’Dall-E 버전을 설정할 수 있습니다.(생략가능)
    3 : Dalle-3
    2 : Dalle-2
    $imgsize‘1024×1024’이미지 크기를 설정할 수 있습니다.(생략가능)

    예제
    print_r( $cOpenAI->generateImage("하늘을 나는 자동차를 그려줘.") );
    
    // Dall-e2로 그림을 그리기 원하는 경우
    print_r( $cOpenAI->generateImage("하늘을 나는 자동차를 그려줘.", "2", "900x900") );

    이상 OpenAI 통신 클래스에 대한 설명을 마치도록 하겠습니다.

    감사합니다.

  • PHP에서 str_replace를 사용하여 여러 문자를 한 번에 대체하는 방법

    PHP에서 문자열을 처리할 때 str_replace 함수를 사용하여 특정 문자를 대체하는 경우가 많습니다. 특히, 여러 문자를 한 번에 대체하거나 제거하는 작업이 필요할 때가 있습니다. 이번 글에서는 str_replace를 사용하여 여러 문자를 한 번에 대체하는 방법을 예제 코드와 함께 알아보겠습니다.

    PHP str_replace 함수 소개

    str_replace 함수는 문자열에서 특정 문자를 다른 문자로 대체할 때 사용되는 PHP의 내장 함수입니다. 기본적인 사용법은 다음과 같습니다.

    <?php
    $originalString = "Hello, World!";
    $search = "World";
    $replace = "PHP";
    $newString = str_replace($search, $replace, $originalString);
    
    echo $newString;  // 출력: Hello, PHP!
    ?>

    여러 문자를 한 번에 대체하는 방법

    여러 문자를 한 번에 대체하거나 제거하기위해 str_replace 함수에 배열을 전달할 수 있습니다. 이를 통해 여러 문자를 한 번에 처리할 수 있습니다.

    아래는 여러 문자를 한 번에 제거하는 예제입니다.

    <?php
    $str = "값어치를 생각하며 「돈의 중요성」에 대해 알아보기!";
    echo "원본 문자열: " . $str . "\r\n";  // 출력: 값어치를 생각하며 「돈의 중요성」에 대해 알아보기!
    
    // 여러 문자를 한 번에 제거
    $charactersToRemove = array("!", "", "");
    $str = str_replace($charactersToRemove, "", $str);
    
    echo "처리된 문자열: " . $str . "\r\n";  // 출력: 값어치를 생각하며 돈의 중요성에 대해 알아보기
    ?>

    위 코드에서는 “값어치를 생각하며 「돈의 중요성」에 대해 알아보기!”라는 문자열에서 !, 「, 」를 제거하고 있습니다. str_replace 함수에 배열을 전달하여 여러 문자를 한 번에 제거할 수 있습니다.

    상세 설명

    1. 원본 문자열 설정:
    $str = "값어치를 생각하며 「돈의 중요성」에 대해 알아보기!";
    echo "원본 문자열: " . $str . "\r\n";
    • 여기서는 대체할 문자를 포함한 원본 문자열을 정의하고 출력합니다.
    1. 제거할 문자 배열 설정:
    $charactersToRemove = array("!", "", "");
    • 여러 문자를 배열로 정의합니다. 이 배열의 각 문자가 문자열에서 제거될 것입니다.
    1. str_replace를 사용한 대체:
    $str = str_replace($charactersToRemove, "", $str);
    echo "처리된 문자열: " . $str . "\r\n";
    • str_replace 함수에 제거할 문자 배열과 빈 문자열을 전달하여 원본 문자열에서 해당 문자를 모두 제거합니다. 처리된 문자열을 출력합니다.

    결론

    PHP에서 str_replace 함수를 사용하여 여러 문자를 한 번에 대체하거나 제거하는 것은 매우 유용한 방법입니다. 배열을 활용하여 간단하고 직관적으로 여러 문자를 처리할 수 있습니다. 이 방법을 사용하면 코드의 가독성을 높이고 불필요한 함수 호출을 줄일 수 있습니다.

    위 예제 코드를 참고하여 여러분의 프로젝트에서도 쉽게 적용해보세요!

  • 단가 계산기

    쇼핑을 할 때 단가를 쉽게 계산할 수 있는 계산기를 만들어봤습니다.

    단가 계산기 사이트로 이동하기

    위의 링크로 들어가면 아래와 같은 화면이 보이는데요.

    단가 계산기 기본 설명화면

    맨 윗줄에 보이는 곳은 계산기로 간단한 수식을 입력해 결과값을 쉽게 클립보드에 복사할 수 있답니다.

    상품 이름과 단위는 여러 상품을 입력할 때 임시 메모용으로 만들어서 생략해도 무방합니다.

    “상품 수량” 영역에 상품의 갯수나 무게 등을 입력하고 “상품 합계 금액”을 입력하면 자동으로 1개 혹은 1단위 기준의 단가가 “상품 단가” 영역에 계산되어 나옵니다.

    비교 상품 수량 사용방법 설명

    특정 갯수 혹은 특정 단위의 계산값이 궁금할 경우 “비교 상품 수량”에 숫자를 입력해주면 “비교 상품 합계 상한금액”에 입력한 수량과 단가를 곱해서 표시해줍니다.

    간단한 계산기 사용 설명법

    맨 위에 있는 계산기는 더하기(+), 빼기(-), 곱하기(*), 나누기(/)와 같이 간단한 사칙연산을 할 수 있게 만들었는데요.

    계산기 영역에 계산할 수식을 입력하고 엔터를 누르면 계산된 값이 클립보드에 저장이 되고, 입력할 위치에 붙여넣기로 계산한 값을 입력할 수 있답니다.

    자세한 사용 예제는 아래의 링크를 통해 확인해주세요.

    단가 계산기 활용 방법 보러가기

  • [그누보드5] 회원정보 여분 필드 추가 하는 방법

    그누보드5에서 기본적으로 회원정보 테이블에 여분의 필드가 10개 제공되고 있습니다.

    그런데 개발을 하다보면 여분 필드가 10개 이상 필요로 할 때가 있는데 이때 여분 필드를 추가하는 방법을 알려드리도록 하겠습니다.

    DB 컬럼 추가

    기존 g5_member 테이블의 여분 필드는 mb_1에서 mb_10까지입니다.

    여분 필드를 11~20까지 추가하기 위해 회원정보 수정 페이지(/adm/member_form.php) 나 별도의 PHP 파일에 아래의 코드를 추가하여 실행해줍니다.

    for ($i = 11; $i <= 20; $i++) {
        $columnName = 'mb_' . $i;
        $previousColumnName = 'mb_' . ($i - 1);
    
        $sql = "SHOW COLUMNS FROM `{$g5['member_table']}` LIKE '{$columnName}'";
        $res = sql_fetch($sql);
    
        if (strpos($res['Type'], 'varchar') === false) {
            $sql = "ALTER TABLE `{$g5['member_table']}` 
                    ADD COLUMN `{$columnName}` VARCHAR(255) NOT NULL DEFAULT '' AFTER `{$previousColumnName}`;";
            sql_query($sql, false);
        }
    }

    “SHOW COLUMNS”를 통해 해당 컬럼이 없을 경우에만 새로 추가하는 코드를 만들었습니다.

    쿼리가 자주 수행되는 것이 마음에 걸릴 경우 컬럼 생성 후 해당 코드를 제거하셔도 무방합니다.

    관리자 회원정보 수정

    회원정보 수정 페이지 수정

    회원정보 입력/수정 페이지는 “/adm/member_form.php”입니다.

    해당 파일 7줄을 보면 아래와 같은 코드가 있습니다.

    $mb = array(
        /* 생략 */
        'mb_8' => null,
        'mb_9' => null,
        'mb_10' => null,
    );

    mb_10 컬럼 밑으로 mb_11에서 mb_20까지 추가하겠습니다.

    $mb = array(
        /* 생략 */
        'mb_8' => null,
        'mb_9' => null,
        'mb_10' => null,
        'mb_11' => null,
        'mb_12' => null,
        'mb_13' => null,
        'mb_14' => null,
        'mb_15' => null,
        'mb_16' => null,
        'mb_17' => null,
        'mb_18' => null,
        'mb_19' => null,
        'mb_20' => null,
    );

    그리고 568번줄(위의 코드를 추가한 후에는 578번줄)을 보면 for문에 $i <= 10으로 되어있는 코드가 있는데 아래와 같이 $i <= 20으로 변경해주면 이 파일에서 수정해야할 사항은 끝입니다.

    <?php for ($i = 1; $i <= 20; $i++) { ?>
        <tr>
            <th scope="row"><label for="mb_<?php echo $i ?>">여분 필드 <?php echo $i ?></label></th>
            <td colspan="3"><input type="text" name="mb_<?php echo $i ?>" value="<?php echo $mb['mb_' . $i] ?>" id="mb_<?php echo $i ?>" class="frm_input" size="30" maxlength="255"></td>
        </tr>
    <?php } ?>

    회원정보 저장 페이지 수정

    회원정보를 입력하고 정보를 저장하는 페이지는 “/adm/member_form_update.php”입니다.

    해당 파일 91줄을 보면 아래와 같은 코드가 있습니다.

    $sql_common = "  mb_name = '{$posts['mb_name']}',
                     /* 생략 */
                     mb_9 = '{$posts['mb_9']}',
                     mb_10 = '{$posts['mb_10']}' ";

    mb_10 부분 밑에 아래와 같이 mb_11부터 mb_20까지 추가해주면 됩니다.

    $sql_common = "  mb_name = '{$posts['mb_name']}',
                     /* 생략 */
                     mb_9 = '{$posts['mb_9']}',
                     mb_10 = '{$posts['mb_10']}',
                     mb_11 = '{$posts['mb_11']}',
                     mb_12 = '{$posts['mb_12']}',
                     mb_13 = '{$posts['mb_13']}',
                     mb_14 = '{$posts['mb_14']}',
                     mb_15 = '{$posts['mb_15']}',
                     mb_16 = '{$posts['mb_16']}',
                     mb_17 = '{$posts['mb_17']}',
                     mb_18 = '{$posts['mb_18']}',
                     mb_19 = '{$posts['mb_19']}',
                     mb_20 = '{$posts['mb_20']}' ";

    테스트

    이제 회원정보 수정 페이지에서 여분 필드가 11~20까지 출력되는지 확인하고 데이터도 정상적으로 저장이 되는지 테스트 해보시면 된 답니다.