PHP 해당 월 첫째 날(1일), 마지막 날(30일, 31일) 구하기

오랜만에 PHP 포스팅..

기존에 되어 있는걸 사용만하다가 정리가 필요해서 정리..

현재 날짜를 기준으로..

전달, 전년도, 다음달, 다음년도 등…의 첫째 날 또는 마지막 날짜를 구하고 싶을때 사용..

현재 날짜 : 2020년 6월 26일

해당월의 첫째 날

date(“Y/m/d”, strtotime(“first day of this month”))

결과

2020/06/01

해당월의 마지막 날짜(2월의 경우 28일, 29일 또는 31일)

date(“Y/m/d”, strtotime(“last day of this month”))

결과

2020/06/30

다음달 첫째 날

date(“Y/m/d”, strtotime(“first day of +1 month”))

결과

2020/07/01

date(“Y/m/d”, strtotime(“first day of -1 month”))

결과

2020/05/01

date(“Y/m/d”, strtotime(“first day of +1 year”))

결과

2021/06/01

date(“Y/m/d”, strtotime(“first day of -1 year”))

결과

2019/06/01

JSTL 다중배열(리스트), 동적변수(?) 사용하기

사용자 ID 별 합계 및 리스트를 사용이 필요하게 되어 작성..

기존 PHP에 다중배열(맵)로 처리되어 있는 방식을

Java 로 변환하려하다보니 찾아보게 되었으며, 정리하게 됨.

우선 PHP 소스..

$idList = array();
블라블라~
$data[$id][] = array( 'amt' => $amt );

$data 라는 맵에 id를 키로 한 다중배열을 가지고 있는 형태이다.

$id 는 $idList에서 관리하고 있다.

현재 운영중인 PHP 화면

위 화면에서 처럼 사용자별 요약 값과 각 리스트가 존재하는 형태.

이것을 Java로 변환하려다보니..

HashMap 과 ArrayList 를 병행하여 사용하게 되었다.

ArrayList<ReportVO> reportList = reportService.getReportList(pMap);
HashMap<String, ArrayList<ReportVO>> reportMap = new HashMap<String, ArrayList<ReportVO>>();
ArrayList<String> idList = new ArrayList<String>();

String beforeId = "";
String usrId = "";
for (ReportVO reportVO : reportList) {
	usrId = reportVO.getUsrId();
	
	if(!beforeId.equals(usrId)) {
		beforeId = usrId;
		idList.add(usrId);
		if(reportMap.containsKey(usrId)) {
			reportMap.get(usrId).add(reportVO);
		}else {
			reportMap.put(usrId, new ArrayList<ReportVO>());
			reportMap.get(usrId).add(reportVO);
		}
	}
}
위와 같이 현재 아이디와 이전 아이디가 다른 경우 ID를 ID를 관리하는 ArrayList 에 담아준다.

그리고 해당 ID에 해당하는 HashMap인 reportMap 에 처음 조회한

reportList 객체 reportVO를 담아준다.

이후 출력

<c:forEach items="${idList}" var="id">
	<c:forEach items="${reportMap[id]}" var="reportVO">
		<tr>
			<td rowspan="${fn:length(reportMap[id])}">
				${reportVO.usrId}
			</td>
		</tr>
	</c:forEach>
</c:forEach>

위와 같이 ID 리스트를 기준으로

각 아이디가 가지고 있는 reportVO 리스트를 반복하여 조회하여 준다.

여기서 내가 몰랐던 사실은 맵에 있는 값을 가져오기 위하여

객체.변수명 으로 사용하려고 했던 부분..

사용자 아이디가 예를 들어 TEST 라고 한다면

${reportMap.TEST} 로 사용하기 위하여

${reportMap.${id}} 후

<c:forEach items=”${reportMap.${id}}”> 와 같이 사용…하는 등..

(작동하지 않음-_- 오류 뱉어 냅니다.)

<c:set> 태그를 이용하여

<c:set var=”temp”>reportMap.${id}</c:set>

${temp.usrId}

(작동하지 않음 오류 뱉어내요..ㅠㅠ)

정상작동

${reportMap[id]}

(정상작동합니다.)

맵에서 리스트를 조회 할때에는 위와 같이 PHP에서 문자열을 키로 사용하듯이 사용하니..

정상 작동한다.

PHP MYSQL 데이터베이스 연결 및 조회

PHP를 처음 접했을 당시의 기억이 떠올라서 기록 및 초보 개발자를 위한 기록..

웹 개발뿐만이 아니라 프로그램을 개발하게 되면 데이터베이스는 항상, 반 필수적으로 사용하게 된다.

db_test.php

<?php
$host = "DB 접속 URL";
$user = "DB 접속계정 ID";
$pass = "DB 접속 PW";
$dbName = "DB 이름";

$con = mysqli_connect($host, $user, $pass);

//데이터베이스 설치 및 클라이언트 접속 캐릭터셋 설정
mysqli_query($con, "set session character_set_connection=utf8;");
mysqli_query($con, "set session character_set_results=utf8;");
mysqli_query($con, "set session character_set_client=utf8;");
mysqli_query($con, "set names utf8");

//데이터베이스 접속정보 확인
if(!$con){
	echo "Database Connection Error!!";
}else{
	echo "Database Connection Success!!";
}

echo "<br>";

$selectdb = mysqli_select_db($con, $dbName);

//데이터베이스 선택 확인
if(!$selectdb){
	echo "Database Select DB Error!!";
}else{
	echo "Database Select DB Success!!";
}

접속정보(URL, 사용자ID, 사용자PW, DB명)가 일치하다면

아래와 같은 메시지를 확인 할 수 있을 것이지만…

DB 연걸 성공 -> 선택한 데이터베이스 까지..

만약 위 정보중 하나라도 잘못된 것이 있다면

(접속 URL 이든 사용자 이름 또는 패스워드 등..)

위와 같은 에러메시지를 확인 할 수 있다.

※ 추가사항

이런 시스템 메시지의 경우 일반 사용자가 볼 필요도 없을 뿐더러, 보안상 좋지 않다는 권고를 여기저기서 워낙 자주 봤다…

PHP 의 경우 메소드(함수) 앞에 @ 를 붙임으로써 이러한 시스템 메시지를 생략 할 수 있다.

하지만 위 예제처럼 얼마 되지 않는 메소드의 경우 @ 를 하나하나 붙일 수 있지만,

사용한 메소드가 많다면 일일히 @를 붙일 수는 없다.

이 때에는

error_reporting(0);

위와 같은 방식으로 처리하게 되면… 개발자가 원하는 오류 메시지만 출력이 가능하다.

모든 오류 메시지를 보고 싶다면..

error_reporting(E_ALL);

잡다한 시스템 메시지는 없는 깔끔한 오류!! 상태..

개발할 때에는 오류 메시지를 보고 잘못 된 부분을 수정하며 개발해 나아가야겠지만,

서비스 중인 시스템이라면 시스템 메시지는 숨김처리하는 것이 좋다.

다시 본 글의 요점으로 돌아와서…

데이터베이스 연결이 잘 되지 않는 다면… 접속 정보를 다시 한번 확인해보자.

최종적으로 연결이 성공 된 이 후라면…

간단(?)하다..

쿼리를 작성한다.

$sql = "SELECT NOW() AS NOW";
$result = mysqli_query($con, $sql);
$row = mysqli_fetch_assoc($result);
echo "<br>";
echo $row["NOW"];
echo "<br>";
print_r($row);

$sql 쿼리를 작성

mysqli_query 메소드를 이용하여

연결정보($con)와 쿼리($sql)를 전달

결과값을 $result에 저장한 후

mysqli_fetch_assoc 메소드에 결과값을 전달

하여 각 컬럼명으로 $row[“NOW”] 에서 컬럼명은 NOW (쿼리상 alias 처리)

출력 결과는 위와 같다.

mysqli_fetch_assoc 했을 때 결과 값을 확인하기 위하여

print_r 메소드를 사용하여 확인…

어라? 로우가 하나인 경우에는 위 처럼 사용하면 끝이지만..

일반적인 게시판 처럼 결과 ROW 가 2개 이상이라면…?

while 문과 mysqli_fetch_assoc 를 응용하면 가능하다.

$sql2 = "SELECT NO FROM TEST_TABLE";
$result = mysqli_query($con, $sql2);
while($row = mysqli_fetch_assoc($result)){
	echo "NO : ".$row["NO"]."<br>";
}

위와 같이 while 문 안에 작성하게 되면 한 ROW 씩 읽어 들여오게 된다.

여러 ROW 에도 문제 없다.

그리고 마지막으로 아래 명령어를 추가한다.

mysqli_close($con);

처음 데이터베이스와 연결될 때 사용한 mysqli_connect 의 반환값을 가지고 있던 $con을 해제(?) 처리 하여준다.

지금은 PHP 내에서 JAVA의 garbage collect 마냥… 일정 시간 사용되지 않으면 반환처리 된다는 글을 보았고,

정말 많은 인원(짐작 불가..)이 동시 다발적으로 사용하여 connection 이 메모리에 넘쳐 흐르는 경우를 제외한다면..

큰 문제는 없을 것 같으나…

혹시나~ 라는게 있으므로…

필자는 데이터베이스 사용이 끝난 경우 connection 을 해제한다.

MSSQL 날짜형식 출력(CONVERT)

지금까지 사용해 본 데이터베이스는 아래와 같다..

Oracle, MySQL, Postgresql… 정도..?

막 튜닝을 잘하고 그런 것은 아니고…

웹개발시 인덱스는 잘 타는지… 조건이 맞는지.. 정도…

가볍게 CRUD 하는 정도이다..

(CREATE, READ, UPDATE, DELETE)

지금 다니는 회사에 와서 처음으로 MSSQL 을 사용하게 되었다.

데이터베이스에 입력된 값을 웹에 보여줄 때 문제되는 것은 보여주는 방식과,

데이터를 넘겨 전달 받은 데이터를 가공하는데에 있다.

이번 포스팅은 날짜 표시 방법이다.

데이터를 보여주거나 전달할 때 최대한 개발언어를 사용하지 않고

데이터베이스에서 조회할 때부터 원하는 형식으로 날짜를 출력하려고 할 때에는

MSSQL에 내장되어 있는 CONVERT 함수이다.

사용방법은 아래와 같다.

개인적으로 자주 사용하는 데이터 형식은 노란색으로 표기해 두었다.

Zilla Likes List(워드프레스 플러그인 제작)

버전 0.3
개인적으로 사용할 용도로는 일단 완료..

워드프레스 사용법에 대해 잘 모르는 상태로 개발하다보니..

짜집기 코드가 많지만… 일단 원하는 대로 잘 보여지네..

zilla-likes-list-v0.3.zip

※ 소스가 너무 난잡해서.. 비공개로 하려했는데..
혹시나 해서 공개~!


버전0.2
기존 zilla-likes 플러그인 활용하여 관리자 페이지에 메뉴만 추가
플러그인 이름 admin 에서 list 로 변경

zilla-likes-list-v0.2.zip


버전0.1 : 플러그인에 대한 기본정보 입력

zilla-likes-admin-v0.1.zip

 


플러그인 개발용 페이지

zilla likes 에 대한 관리자 페이지가 없어서 만들어 보기 시작..

잘 진행 될 지는.. 의문…