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

0 글이 마음에 드셨다면 하트 꾸욱~

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에서 문자열을 키로 사용하듯이 사용하니..

정상 작동한다.

0 글이 마음에 드셨다면 하트 꾸욱~

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 을 해제한다.

0 글이 마음에 드셨다면 하트 꾸욱~

MSSQL 날짜형식 출력(CONVERT)

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

Oracle, MySQL, Postgresql… 정도..?

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

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

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

(CREATE, READ, UPDATE, DELETE)

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

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

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

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

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

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

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

사용방법은 아래와 같다.

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

0 글이 마음에 드셨다면 하트 꾸욱~

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 에 대한 관리자 페이지가 없어서 만들어 보기 시작..

잘 진행 될 지는.. 의문…

 

1 글이 마음에 드셨다면 하트 꾸욱~!