728x90

PHP 테이블에서 글자수가 너무 길어서 2줄로 보이거나 테이블 구조가 이상하게 보이는 증상이 있어서 찾아봤더니 mb_strimwidth 함수를 이용하면 편하게 글자수 줄임이 가능하다.


mb_strimwidth ( string $str , int $start , int $width [, string $trimmarker [, string $encoding ]] )

mb_strimwidth('텍스트','시작위치','끝위치',"끝에붙일말","언어코드");


사용 예제


mb_strimwidth("Hello World", 0, 10, "...");


echo "<td class='bl'>".mb_strimwidth($row['positionNM'],'0','18','...','utf-8')."</td>";


표의 셀에서 글자수가 길어서 글줄임 ... 으로 표시하기도 하지만

echo "<td class='bl' style='font-size:0.8vw'>".$row['userNM']."</td>";

와 같이 style='font-size:0.8vw' 를 사용하면 글자 크기를 줄여서 보여줄 수 있다.


https://stackoverflow.com/questions/16056591/font-scaling-based-on-width-of-container
에 나온 내용을 참고했다.
The values are:
    vw (% of the viewport width)
    vh (% of the viewport height)
    vi (1% of the viewport size in the direction of the root element's inline axis)
    vb (1% of the viewport size in the direction of the root element's block axis)
    vmin (the smaller of vw or vh)
    vmax (the larger or vw or vh)

1 v* is equal to 1% of the initial containing block.


나중에 살펴보려고 검색한 링크를 적어둔다.

Responsive fonts - auto-scaling root font-size

https://codepen.io/2kool2/pen/ZpLYYo


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

날짜 선택  (0) 2018.10.26
접속단말 및 IP주소  (0) 2018.06.11
PHP to JSP  (0) 2018.04.28
PHP Form 다중 체크박스 값 전달 및 POST  (0) 2018.04.02
PHP 배열 합집합, 교집합, 차집합, 대칭차집합  (0) 2018.04.01
블로그 이미지

Link2Me

,
728x90

JSP를 사용해본 적은 없지만, 네이버지식인에 PHP 를 JSP로 변환하는 것에 대한 질문이 있어서 나중에 사용하게 될 수도 있겠다 싶어 구글링 검색한 것과 알고 있는 지식을 적어둔다.


PHP

JSP

 <php

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import = "java.sql.*" %>

<%

 ?>

%>

 if($_SERVER['REQUEST_METHOD'] == 'POST')

String requestMethod = request.getMethod();

if (requestMethod.equals("POST"))

$temperature = $_POST['temp'];

String temperature = request.getParameter("temp");



PHP 코드

<?php
// dbconnect.php 파일 내용
$db['host'] = 'localhost';
$db['name'] = 'testdb';
$db['user'] = 'root';
$db['pass'] = '패스워드';
$db['port'] = '3306';

$db = isConnectDb($db);

function isConnectDb($db){
    $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']);
    mysqli_set_charset($conn, "utf8");  // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
        exit;
    } else {
        return $conn;
    }
}
?>

<?php
// 파라미터로 넘어온 변수
$temperature = $_POST['temp'];
$date = $_POST['date'];
$time = $_POST['time'];

if($_SERVER['REQUEST_METHOD'] == 'POST'){ // 본 파일 직접 실행 방지
    require_once 'dbconnect.php'; // DB 연결
    // 테이블에서 자동으로 증가되는 uid 값이 있어야 할 거 같아서 insert 필요한 칼럼만 발췌한다.
    $sql = "insert into data(date,time,temperature) values ('$date','$time','$temperature')";
    //echo "$sql"; // insert sql 내용을 화면으로 출력한다.
    mysqli_query($db,$sql);
}
?>


JSP 코드

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import = "java.sql.*" %> <!-- JSP에서 JDBC의 객체를 사용하기 위해 java.sql 패키지를 import 한다 -->

<%
request.setCharacterEncoding("UTF-8");// 파라미터로 넘어온 문자를 한글이 깨지지 않도록 UTF-8로 받음
String temperature = request.getParameter("temp");//temp라는 파라미터를 읽어온다.
String date  = request.getParameter("date");
String time  = request.getParameter("time");
String requestMethod = request.getMethod(); // POST전송인지 GET 전송인지 판별한다.

// URL 인증우회로  GET 방식일 경우 취약 하므로  jsp 에서 POST 방식으로 submit() 해 주는 것이 좋다
if (requestMethod.equals("POST")) { // POST 전송시 코드 내용
    Connection conn = null; // null 로 초기화
    PreparedStatement pstmt = null;//JDBC를 사용하여 테이블에 쿼리를 실행하기 위해서 PreparedStatement 객체를 사용
    try{
        String url = "jdbc:mysql://localhost:3306/testdb"; // 사용 DB명을 포함한 URL 기술
        String id = "root"; // 사용자 계정
        String pw = "패스워드"; // 사용자 계정의 패스워드
        String driver = "com.mysql.jdbc.Driver";
        Class.forName(driver); // MySQL DB와 연동하기 위해 DriverManager에 등록
        conn=DriverManager.getConnection(url,id,pw);// DB와 연동하기 위해 DriverManager에 등록

        String sql = "insert into data values(?,?,?)";//sql 쿼리
        pstmt = conn.prepareStatement(sql); // prepareStatement에서 해당 sql을 미리 컴파일
        pstmt.setString(1,temperature);
        pstmt.setString(2,date);
        pstmt.setString(3,time);
        // pstmt.setString(3,new Timestamp(System.currentTimeMillis())); // 현재 날짜와 시간
        pstmt.executeUpdate(); // sql문 실행
        out.println("data 테이블에 새로운 레코드를 추가했습니다."); // 성공시 메시지 출력
    }catch(Exception e){
        e.printStackTrace();
        out.println("data 테이블에 새로운 레코드 추가에 실패했습니다.");
    }finally{
        if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
        if(conn != null) try{conn.close();}catch(SQLException sqle){}   // Connection 해제
    }
} else {
    out.println("올바른 요청이 아닙니다.");
}
%>


블로그 이미지

Link2Me

,
728x90

<form> 태그

- <form>태그는 사용자의 데이터를 서버로 전송해 줄 수 있는 기능의 태그이다.

- 입력양식의 모든 태그들은 반드시 <form>~ </form>사이에 기록되어져야 한다.

- <form>태그의 구조

   Action:  폼의 데이터를 처리해주는 화일명이 온다.
   enctype: 폼의 데이터를 전송 시 암호화 방법 지정
   method: 폼의 데이터를 전송하는 방법 지정(get,post)
   name: 폼의 이름, 자바스크립트에서 사용


<input type="submit" name="" value="전송">

- submit : 입력된 내용을 서버측으로 보냄


<input type="reset" name="" value="취소">

- reset : 입력된 내용을 공백으로 만듬



여러개의 체크 박스에서 $_POST 가져오기
체크박스 name뒤에 배열형태로 []를 붙여주면 된다.
여러개의 name 이 존재한다면 check_list[] 처럼 배열형태로 보내주면 받을 때도 배열형태로 받을 수 있다.


checkbox 부분에서 value 부분은 예시라서 for 문 또는 foreach 문으로 값을 넣어야 하는 것은 생략했다.


<script>
function checkForm(frm){
    var chkbox = frm['check_list[]'];
    var cnt = 0;

    for (var i = 0 ; i < chkbox.length; i++) {
        if (chkbox[i].checked) {
           cnt++;
        }
    }

    if(cnt == 0){
        alert('선택된 체크박스가 없습니다');
        return false;
    }

    document.frm.action = "delete.php";
    document.frm.submit();
}
</script>
<form name="frm" method="POST" action="javascript:checkForm(document.frm);">
    <input type="checkbox" name="check_list[]" value="<?=$R[$i]?>" />
    <input type="checkbox" name="check_list[]" value="<?=$R[$i]?>" />
    <input type="checkbox" name="check_list[]" value="<?=$R[$i]?>" />
</form>



=== delete.php ===

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['check_list'])){
    $flag = false;
    foreach($_POST['check_list'] as $item){
        $sql ="delete from test where item='".$item."'";
        if(!mysqli_query($dbconn,$sql)){
            die('Error:'.mysql_error());
        } else {
            $flag = true;
        }
    }

    if($flag == true){
        echo "<script>location.href='index.php';</script>";
    }
}
?>


블로그 이미지

Link2Me

,
728x90

차집합, 대칭 차집합은 구현하고자 하는 목적에 따라 각각 사용을 하면 된다.

array_diff 함수를 잘못 이해하고 사용하면 엉뚱한 결과가 나올 수 있다.


<?php
$arr1 = array('1', '2', '3', '4');
$arr2 = array('3', '4', '5', '6', '7', '8');



echo "<h3>Union(합집합)</h3>";
$union = array_unique(array_merge($arr1, $arr2));
print_r($union);



echo "<h3>Intersection(교집합)</h3>";
$intersection = array_values(array_intersect($arr1, $arr2));
print_r($intersection);




echo "<h3>Complement(차집합)</h3>";
$complement = array_values(array_diff($arr1, $arr2));
print_r($complement);
$complement = array_values(array_diff($arr2, $arr1));
echo '<br />';
print_r($complement);



echo "<h3>Symmetric difference(대칭차집합)</h3>";
$sym_diff = array_values(array_diff(array_merge($arr1, $arr2), array_intersect($arr1, $arr2)));

또는

$sym_diff = array_merge(array_diff($arr1, $arr2), array_diff($arr2, $arr1));

print_r($sym_diff);



// 처음 1개 삭제
array_shift($arr);

// 마지막 1개 삭제
array_pop($arr);


// in_array() : 배열들의 요소중에 원하는 값이 있는지를 검사

$arr = array("1", "2", "3", "4", "5"); 
$v = "5"; 
if(in_array($v, $arr)) {
    echo "$v가 있음";
} else {
    echo "$v가 없슴";
}


$arr = array(array(1, 2,), 3, 4, 5, array(6, 7));
if(in_array(array(1,2), $arr)) {
    echo "array(1, 2) 가 포함되어 있음.";
}


is_array : 자료형이 배열인지 알아볼기위해 사용하는 함수, 배열일 경우 1, 아닐 경우 0 반환

$arr = array(1, 2, 3, 4, 5,);
echo is_array($arr); //array가 맞으므로 1 반환

?>

블로그 이미지

Link2Me

,
728x90

sort, resort 는 배열안에 있는 값을 정렬하는 함수다.
sort : 오름차순 정렬,
rsort : 내림차순 정렬

 

ksort, krsort key로 배열을 정렬한다.
ksort : 오름차순 정렬
krsort : 내림차순 정렬

 

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
krsort($age); // key로 배열을 정렬 ,내림차순 정렬

foreach($age as $key=>$value){
   echo "Key=" . $key . ", Value=" . $value;
   echo "<br>";
}

 

arsort : 배열을 값으로 내림차순 정렬하고 인덱스의 상관관계를 유지
asort : 배열을 값으로 오름차순 정렬하고 인덱스의 상관관계를 유지

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
print_r($fruits);
echo '<br />';
arsort($fruits); // 배열을 값으로 내림차순 정렬하고 인덱스의 상관관계 유지
print_r($fruits);
?>

 

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

$a=array("a"=>1, "ce"=>2, "ec"=>3, "br"=>4, "df"=>5, "f"=>-5);
1. 연관배열의 value값들을 합하라.

    array_sum 은 배열 안의 모든 값을 더하여 그 결과를 리턴하는 함수다.

    echo array_sum($a);

 

    array_sum 이 foreach 문으로 결과보다 훨씬 빠르다고 되어 있다. 이유는 fast C로 구현되어 있다고 한다.

 

2. 연관배열의 인덱스값에 의한 내림차순 정렬을 하고 그 값을 list와 each를 사용하여 출력하라. (krsort 이용할 것)

    krsort($a); // key로 배열을 내림차순 정렬
    for($i=0, $c=count($a); $i<$c; $i++) {
        list($key, $value) = each($a);
        echo $key, ' = ', $value, '<br />';
    }

3. 다음 배열을 오름차순으로 정렬하고 50 보다 큰 값을 지닌 요소들의 개수를 출력하라.
$a=array(34, 7, 5, -54, 64, 59, 100, 59, 27);

 

array_filter()함수는 배열의 각 요소 중에서 지정한 함수의 조건에 일치하는 요소만 새로운 배열에 다시 되돌려주는 함수다.

$arr = array_filter($R, '콜백함수명'); // $R : array

 

아래 코드를 실행해보면 필터링한 결과를 알 수 있다.

test_filter는 콜백함수명이다.

<?php
function test_filter($var){ // 배열 요소의 값을 인수로 받는다.

    if(! is_int($val)) { // 전달된 값이 정수가 아니면 false를 반환한다.

       return false;

    }

    return($var > 50); // 조건에 맞으면 true, 조건에 맞지 않으면 false를 반환한다.
}

print_r(array_filter($a,'test_filter')); // pinrt_r 함수는 배열을 출력한다.

echo '<br />';
echo count(array_filter($a,'test_filter'));

?>

 

문제의 답

sort($a); // 오름차순 정렬, rsort() 내림차순 정렬
echo count(array_filter($a, function($val){
    return $val > 50;
}));

 

 

4. 다음 배열에서 2의 배수들을 삭제하고 배열 전체를 출력하라.
$a=array(2,4,7,9,13,34,56);
(2,4,34,56을 삭제하고 배열a를 출력)

<?php
$a=array(2,4,7,9,13,34,56);
print_r(array_filter($a,function($n){
    return $n%2 !=0;
}));
?>

 

5. 다음 배열에서 소수점 10자리수가 5인(xx.5xx) 값들을 출력하라.
$a=array(34.12, 7.0, 5.9, -54.512, 64.52, 59.5, 100.1, 59.23, 27.54);

 

문자열에 특정 문자열이 포함되어 있는지 확인하려고 할때 strpos()함수를 사용한다.
strpos(string,find,start)

 

<?php
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
if(strpos($string, $find_letters) !== false)
{
    echo 'All the letters are found in the string!';
}
?>

 

문제의 답

<?php
$a=array(34.12, 7.0, 5.9, -54.512, 64.52, 59.5, 100.1, 59.23, 27.54);
print_r(array_filter($a,function($n){
    return strpos($n, '.5') !== false;
}));
?>

또는

<?php
$a=array(34.12, 7.0, 5.9, -54.512, 64.52, 59.5, 100.1, 59.23, 27.54);
print_r(array_filter($a,function($n){
    return preg_match('/\.5/',$n);
}));
?>

 

블로그 이미지

Link2Me

,
728x90

1 ~ 45 사이의 숫자를 랜덤하게 6개를 추출하는 코드다.

검색해서 찾아보니 PHP School 에 올라온 코드를 수정해서 bootstrap 기반으로 작성했다.

mt_rand(1, 45); // 지정된 범위에서 랜덤한 숫자 반환하는데 번호 중복 발생한다.

이걸 이용해서 하는 방법도 좀 더 고민해보면 좋을거 같다.


<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container col-md-6">
    <table class="table table-bordered table-hover table-responsive">
        <thead>
            <tr>
                <th align="center" colspan="7">로또번호 자동 생성기</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <?php
                $lotto = lotto(5);
                //$lotto = getLotto(5);
                for ($i = 0; $i < sizeof($lotto); $i++) {
                    $cnt = $i + 1;
                    echo '<td align="center" bgcolor=eeeeee>' . $cnt . 'th' . '</td>';
                    for ($j = 0; $j < 6; $j++) {
                        echo '<td align="center">' . $lotto[$i][$j] . '</td>';
                    }
                    echo "</tr>";
                }
            ?>
        </tbody>
    </table>
</div>
</body>
</html>

<?php
function lotto($num) {
    for ($i = 0; $i < $num; $i++) {
        $lott_num = range(1, 45); // range함수를 통해 1~45까지의 수를 배열로 생성
        shuffle($lott_num);  //배열 변수를 랜덤하게 뒤섞는다
        for ($j = 0; $j < 6; $j++) {
            $lotto[$i][$j] = $lott_num[$j];
        }
        /* 오름차순 정렬 sort 함수*/
        sort($lotto[$i]);
    }
    return $lotto;
}

?>



블로그 이미지

Link2Me

,
728x90

온라인 투표 소스에 대한 네이버지식인 질의가 있어서 구글링으로 검색해보니 https://github.com/rezwanulhaquerezwan/Online-Voting-System-using-php-and-mysql 에 소스가 검색된다.


스마트폰에서 모바일 투표도 가능하겠다 싶어서 한글화 작업을 좀 하면서 코드를 상당부분 수정했다.

- 회원관리 부분은 아예 없어서 신규 추가

- 관리자 전용 접속 로그인 코드 삭제 및 회원관리 코드에 admin 칼럼을 추가하고 관리자 식별토록 수정

- 후보자 생성만 있고 수정하는 기능이 없어서 수정 기능 추가

- positon 생성만 있고 수정하는 기능이 없어서 수정 기능 추가

- DB접속방식을 MySQLi 절차지향방식으로 변경하고 관련 코드 전부 수정

- 중복부분은 header.php 와 tail.php 로 코드 정리


스마트폰에서 잘 되기는 하는데 부트스트랩 코드로 수정해야 메뉴 선택기능이 좀 더 편리할 거 같다.

PC환경에서는 메뉴가 잘 보인다.


1. 첨부파일 코드를 받아서 sql폴더에 있는 SQL 구조를 이용하여 DB를 생성하고 테이블을 추가해준다.

2. id : admin@gmail.com pw : 1234 로 로그인한다.



이 코드에서 정작 중요한 것은 온라인 투표 결과부분을 수정해야 한다는 것이다.

나중에 기회되면 업데이트를 하겠지만, 지금은 배워야 할 기능들이 많아서 여기까지만 해둔다.

PDO 방식으로 코딩해보는 것이 있어서 시간을 더 이상 할애하기는 어려울 거 같다.

직접 수정해도 별로 어렵지 않을 것이다.

코드가 핵심내용을 채우기 전에 필요한 것을 거의 만들었다(?) 라고 보면 될 거 같다.

UI 부분을 부트스트랩으로 변경하면, 온라인 투표가 아니더라도 회원관리 간단하게 할 수 있다.

초보자용으로는 공부하는데 도움이 될 코드가 많다.


MySQLi 방식으로 연동된 코드

online_voting.zip


MySQL 방식 연동으로 된 코드

onlie_voting_mysql.tgz


블로그 이미지

Link2Me

,
728x90

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead

메시지가 나온다.


<?php
// Deprecated:
$result = preg_replace(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/iseU",
    "CallFunction('\\1','\\2','\\3','\\4','\\5')",
    $result
);

// 대체할 함수
$result = preg_replace_callback(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/isU",
    function($m) { return CallFunction($m[1], $m[2], $m[3], $m[4], $m[5]); },
    $result
);

?>




블로그 이미지

Link2Me

,
728x90

DB 결과가 숫자로 0, 1로 되어 있을 경우 화면 출력과 수정할 수 있게 하는 코드


    echo "<div data-role='fieldcontain'>";
    echo "<label>&nbsp;개인정보&nbsp;: </label>";
        $personInfo=array('비공개','공개동의');
        foreach($personInfo as $k=>$v){
            if($row['smart']==$k){
                echo "<label>".$v."</label>";
            }
        }
    echo "</div>";


   echo "<div data-role='fieldcontain'>";
    echo "<table>";
    echo "<tr>";
    echo "<td><label>개인정보&nbsp;: </label></td>";
    echo "<td><select class='modistaff' name='smart'>";
        $personInfo=array('비공개','공개동의');
        foreach($personInfo as $k=>$v){
            if($row['smart']==$k){
                echo "<option value='".$k."' selected>".$v."</option>";
            } else {
                echo "<option value='".$k."'>".$v."</option>";
            }
        }
    echo "</select></td>";
    echo "</tr>";
    echo "</table>";
    echo "</div>";


foreach(배열 as $key => $value){


}


여기서 $key 는 배열의 나열순서 0, 1을 의미하며, 배열의 크기가 5라면 0,1,2,3,4

DB에서 가져온 $row['smart'] 값과 key값을 비교하여 같으면 해당 value 를 출력하라는 의미다.

블로그 이미지

Link2Me

,
728x90

요일과 접속시간 설정에 따라 접속 허용/불허하는 간단한 로직이다.

공휴일 접속체크 이런 것은 적용되지 않았다.


<?php
$day = date('N');// 요일: 1(월) ~ 7(일)
$time = date('H');// 시간
$week = array("일", "월", "화", "수", "목", "금", "토");
$access = FALSE;// 접근 불가능

if ($day <= 5) {// 월~금
    if ($time >= 08 && $time < 18) {
        $access = TRUE;
    } else {
        $access = FALSE;
    }
} else { // 토, 일
    $access = FALSE;
}

if ($access === TRUE) {
    echo '오늘 '.date('Y-m-d').', '.$week[date('w')].'요일, 현재 시간 '.date('H:i:d').'<br />';
    echo "접속 허용 ";
} else {
    echo '오늘 '.date('Y-m-d').', '.$week[date('w')].'요일, 현재 시간 '.date('H:i:d').'<br />';
    echo "접속 차단";
}

?>

블로그 이미지

Link2Me

,
728x90

require문, include문 : 자주 사용하는 PHP 코드를 다른 파일에 모아 두고 필요할 때 파일을 읽어들여서 사용할 수 있도록 하는 명령


require "파일명";

- 만일 지정된 파일이 존재하지 않을 경우에는 php.ini에 설정된 include_path에서 파일을 찾는다.

- include_path에도 파일이 존재하지 않는다면 require문을 작성한 현재 파일이 있는 디렉토리에서 찾는다.

- 현재 디렉토리에도 없다면 오류표시하고 정지된다.



require와 include의 차이점

- require문은 오류가 발생했을 경우에 Fatal Error가 되어 정지가 되어버린다.

- require_once() : 지정한 파일을 한 번 읽어 들이면 같은 처리 중에는 다시 읽어 들일 수 없다.

- include문은 오류가 발생했을 경우에 Warning을 출력하고 처리코드를 수행한다.

- include_once() : 지정된 파일을 이미 읽어 들어 경우에는 다시 파일을 읽어 들이지 않는다.



블로그 이미지

Link2Me

,
728x90

일일 통계 데이터를 생성해야 하는데 생성하지 못한 경우 새벽(접속이 없는 시간대)에 crontab 으로 자동으로 DB에 데이터를 저장하는 코드를 추가해서 작업하는게 좋다.


<?php
require_once "connect.php"; // DB 연결
require_once "statsClass.php"; // 통계함수
$a=new statsClass();

echo '일일통계 기록';
echo '<br />';

date_default_timezone_set('Asia/Seoul');

$now_year = date("Y"); // 금년
$now_month = date("m"); // 현재월
$last_day = date("t", mktime(0, 0, 1, $now_month, 1, $now_year)); // 해당월의 마지막 일자 반환

for($i=1;$i<=$last_day;$i++){
    $date = date("Ymd", mktime(0,0,0,date("m"), $i, date("Y")));
    $YM = substr($date,0,6);
    $day = substr($date,6,2);

    echo $date.'<br />';
    // DB에 정보 기록하도록 하는 코드 추가
}

echo "Work done";
exit;
?>

블로그 이미지

Link2Me

,
728x90

문자열 비교 strcmp

strcmp(string1,string2);


결과값

0 : 두 문자열이 같다.

<0 : string1 is less than string2

>0 : string1 is greater than string2


<?php
$mailing = $row['mailing'] = 1; // DB에서 읽어온 값이라 가정
if(!strcmp($mailing,"1")) {
  $mailing = "가입";
} else if(!strcmp($mailing,"2")) {
  $mailing = "완료";
} else if(!strcmp($mailing,"3")) {
  $mailing = "추가";
} else {
  $mailing = "거부";
}
echo $mailing;
?>


strcmp 를 잘못 사용하면 원하지 않는 결과가 나올 수 있음에 유의하자.

if(0 == NULL){
    echo "True";
} else {
    echo "False";
}

결과는 True 를 반환한다.


if(0 === NULL){
    echo "True";
} else {
    echo "False";
}

결과는 False 를 반환한다.

PHP에서 조건문을 느슨하게 비교하면 원하지 않는 결과가 나올 수 있다.


strcmp는 string(문자열)을 비교하라고 되어 있다.

그런데 문자열 대신 배열을 넣고 비교하면 어떤 결과가 나올까?


$a = Array("a");
$b = 'password';

if (!strcmp($a, $b)){
  echo "Strings are same !";
} else {
  echo "Strings are different";
}

결과

Warning: strcmp() expects parameter 1 to be string, array given in C:\AutoSet9\public_html\11.php on line 5
Strings are same !

보시는 바와 같이 $a 와 $b는 다음에도 불구하고 경고 메시지는 나오지만 결과는 동일하다고 출력한다.


$a = Array("a");
$b = 'password';

if (strcmp($a, $b) === 0){
  echo "Strings are same !";
} else {
  echo "Strings are different";
}

와 같이 해주면 경고메시지는 출력하지만 결과는 다르다고 출력한다.

Warning: strcmp() expects parameter 1 to be string, array given in C:\AutoSet9\public_html\11.php on line 5
Strings are different


하나더 살펴보자.

육안으로 확인하면 두개의 문자열은 서로 다르다. 하지만 결과는 느슨비교를 해서 True를 반환한다.

$something = 0;
echo ('password' == $something) ? 'True' : 'False';


따라서 === 비교를 해주어야 한다.

$something = 0;
echo ('password' === $something) ? 'True' : 'False';


$something = 0;
echo ('1' == $something) ? 'True' : 'False';
이 경우에는 같은 정수를 비교하므로 == 를 사용해도 False 를 반환한다.

문자열과 숫자를 비교시 느슨비교를 하면 엉뚱한 결과가 나옴을 확인할 수 있다.


<?php
$val = 20;
if($val === '20'){
    echo '결과는 동일하다';
} else {
    echo '$val은 정수형, "20"은 문자열형이다.';
    echo '<br />결과는 다르다.';
}
?>


Don't use == in PHP. It will not do what you expect.

Even if you are comparing strings to strings, PHP will implicitly cast them to floats and do a numerical comparison if they appear numerical.

느슨한 비교를 하면 원하지 않은 결과가 나올 수 있음에 유의하자!


블로그 이미지

Link2Me

,
728x90

일일 통계 생성을 위한 테이블 구조 및 테이블에 데이터를 저장하기 위한 코드를 작성했다.

가장 간단하게 userID 별 접속횟수, 날짜별 접속횟수만 기록되게 구현했다.


테이블 구조

CREATE TABLE IF NOT EXISTS Access_Stats (
  uid int(11) NOT NULL AUTO_INCREMENT,
  date char(8) NOT NULL,
  YM char(6) NOT NULL,
  day char(2) NOT NULL,
  IDCnt int(11) NOT NULL DEFAULT '0',
  dailyCnt int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (uid),
  KEY date (date)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


=== 일일단위 통계 생성을 위한 코드 ===

<?php
require_once "dbconnect.php";
require_once "phpclass/statsClass.php";
$a=new statsClass();

// 일일 통계 기록
date_default_timezone_set('Asia/Seoul');
$date = date("Ymd", mktime(0,0,0,date("m"), date("d")-1, date("Y"))); // 어제
$YM = substr($date,0,6);
$day = substr($date,6,2);

if($a->Access_Stats($date) == '0'){ // 해당 날짜에 기록된 정보가 없으면
    $sql = "INSERT INTO Access_Stats (date,YM,day,IDCnt,dailyCnt) (select ".$date.",".$YM.",".$day.",count(distinct LogID),sum(hit) from AccessLog where date='".$date."')";
    @mysql_query($sql);
} else {
    $row = $a->AccessLogCnt($date); // 배열로 가져옴
    $sql = "Update Access_Stats SET IDCnt='".$row[0]."',dailyCnt='".$row[1]."' where date='".$date."'";
    @mysql_query($sql);
}

echo "Work done";
exit;
?>


=== statsClass.php ===

<?php
class statsClass {

    function Access_Stats($date){
        global $db;
        $sql ="select count(date) from Access_Stats where date='".$date."'"; // 기록된 데이터 있는지 조회
        $result=mysql_query($sql);
        if($row=mysql_fetch_row($result)){
            return $row[0];
        }
    }

    function AccessLogCnt($date){
        global $db;
        $sql ="select count(distinct userID),sum(hit) from AccessLog where date='".$date."'";
        $result=mysql_query($sql);
        if($row=mysql_fetch_row($result)){
            return $row; // 배열을 반환
        }
    }

}
?>


매일 일정한 시간에 테이블에 데이터를 자동으로 저장하기 위해서는 crontab 을 이용해야 한다.

crontab 을 이용하기 위한 코드는 아래와 같이 하면 된다.

=== accessLog.php ===

!#/usr/local/php/bin/php -q
<?php
// cron 방식 DB 접속
require_once "/usr/local/apache/htdocs/dbconnect.php";
require_once "/usr/local/apache/htdocs/phpclass/statsClass.php";
$a=new statsClass();

// 일일 통계 기록
date_default_timezone_set('Asia/Seoul');
$date = date("Ymd", mktime(0,0,0,date("m"), date("d")-1, date("Y"))); // 어제
$YM = substr($date,0,6);
$day = substr($date,6,2);
if($a->Access_Stats($date) == '0'){
    $sql = "INSERT INTO Access_Stats (date,YM,day,IDCnt,dailyCnt) (select ".$date.",".$YM.",".$day.",count(distinct LogID),sum(hit) from AccessLog where date='".$date."')";
    @mysql_query($sql);
} else {
    $row = $a->AccessLogCnt($date);
    $sql = "Update Access_Stats SET IDCnt='".$row[0]."',dailyCnt='".$row[1]."' where date='".$date."'";
    @mysql_query($sql);
}

echo "
Work done";
exit;
?>


=== crontab 파일내에 코드 추가 ===

crontab 사용법은 http://link2me.tistory.com/990 참조

PHP 와 crontab 에 대한 사항을 좀 더 알고 싶다면 http://link2me.tistory.com/1013 참조


먼저 php 가 설치된 경로를 찾아야 한다.

// PHP 경로 찾기
whereis php


crontab 에 추가할 내용

// 매일 2시 0분에 실행
0 2 * * * /usr/local/php/bin/php /usr/local/apache/htdocs/stats/accessLog.php

// 매 5분마다 실행 ==> 실제 제대로 저장되는지 여부를 테스트
*/5 * * * * /usr/local/php/bin/php /usr/local/apache/htdocs/
stats/accessLog.php

블로그 이미지

Link2Me

,
728x90

내 Web Site에 로그인한 접속자의 통계를 구해보자.


접속자의 정보를 테이블에 기록하는 로직을 그려본다.

1. 로그인한 ID 정보를 기록한다.

2. 접속자의 IP 주소 정보를 구한다.

   $ip = $_SERVER[REMOTE_ADDR];    //방문자 IP저장

3. 오늘 날짜와 시간을 저장한다.

4. OS 정보를 추출하여 저장한다.

    - Web 브라우저에서 접속한 경우에는 $_SERVER['HTTP_USER_AGENT'] 에서 정보를 추출할 수 있다.

    - Android App, iOS App 에서 접속하는 경우에는 DeviceID를 가지고 식별하게 코드를 추가하면 된다.

5. 동일한 ID에 대해 하루에 한번만 저장할 것인가?

    접속할 때마다 기록할 것인가를 정한다.

    접속할 때마다 기록하면 테이블에 저장되는 Record 수가 많아진다.

    이 경우에는 매일 일정한 시간주기로 Raw Data 를 가지고 일단위 통계, 주간단위 통계, 월단위 통계를 만들고

    2개월이 넘어간 데이터는 삭제하는 방법등을 고려하는 것이 좋다.

    데이터 저장이 너무 많아지는 경우에는 테이블 설계시 partition 까지 고려하는 것이 좋을 수 있다.

6. Index 는 어떤 걸 자주 검색하게 될 것인가를 고려해서 설정한다.

7. 통계 생성을 고려한다면 테이블에 저장되는 값을 숫자로 표시되게 하는 걸 같이 고려한다.

8. 접속자의 접속정보를 테이블에 추가(Insert)한다.



1. 테이블 구조

CREATE TABLE IF NOT EXISTS AccessLog (
  uid int(11) NOT NULL AUTO_INCREMENT,
  ipaddr varchar(20) NOT NULL,
  date char(8) NOT NULL DEFAULT '',
  time varchar(10) NOT NULL,
  OS varchar(60) DEFAULT NULL,
  browser varchar(30) DEFAULT NULL,
  userID varchar(60) DEFAULT NULL,
  hit int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (uid),
  KEY ipaddr (ipaddr)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


2. phpClass 함수

관련 모든 함수는 첨부파일 참조

AccessClass.zip


조건기준 : IP주소와 오늘날짜를 기준으로 카운트

만약 userID 기준으로 접속기록을 남기려면 where 조건문을 수정해주면 된다.


function AccessLog($userID){
    // 테이블 구조 : uid, ipaddr, date, time, OS, browser, userID, hit
    global $db;
    $access_ip=$_SERVER['REMOTE_ADDR'];
    $getOS = $this->getOS(); // 접속 OS 정보
    $getBrowser = $this->getBrowser(); // 브라우저 접속 정보
    $date = date("Ymd"); // 오늘날짜
    $time = date("H:i:s"); // 시간
    $userID = $userID ? $userID : '';
    $sql ="select count(*) from rb_accessLog where ipaddr='".$access_ip."' and date='".$date."'";
    $result=mysql_query($sql);
    if($row=mysql_fetch_row($result)){
        if($row[0] == 0){ // 오늘 접속날짜 기록이 없으면
            $sql = "INSERT INTO rb_accessLog (ipaddr,date,time,OS,browser,userID,hit) ";
            $sql.= "VALUES ('$access_ip','$date','$time','$getOS','$getBrowser','$userID','1');";
            $result=mysql_query($sql);
        } else { // 접속 기록이 있으면 해당 IP주소의 카운트만 증가시켜라.
            $sql = "UPDATE rb_accessLog SET hit=hit+1 Where ipaddr='".$access_ip."'";
            $result=mysql_query($sql);
        }
    }
}


3. 사용법

로그인 정보를 검사하여 로그인이 성공(ID, PW 일치)하면 1, 실패하면 0 을 반환한다.

성공할 경우 SESSION 을 생성하고 접속 로그를 기록한다.


<?php
if(isset($_POST['loginID']) && !empty($_POST['loginID']) && isset($_POST['loginPW']) && !empty($_POST['loginPW'])) {
    $loginID = trim($_POST['loginID']);
    $loginPW = trim($_POST['loginPW']);

    require_once 'dbconnect.php'; // db접속
    require_once 'phpclass/AccessClass.php';
    require_once 'phpclass/loginClass.php';

    $a=new AccessClass();
    $c=new LoginClass();

    $row = $c->UserAuthCheck($loginID,$loginPW); // 성공(1), 실패(0)
    if($row == 1) {
        $_SESSION['userID'] = $row['id'];
        $_SESSION['userPW'] = md5($loginPW);
        $a->AccessLog($_SESSION['userID']); // 접속 로그 기록
    } else {
        $msg ='정보가 올바르지 않습니다';
        echo "<script>alert('".$msg."');history.go(-1);</script>";
    }
}

?>


블로그 이미지

Link2Me

,
728x90

접속 허용을 할 IP대역을 지정할 경우 간단하게 사용할 수 있는 방법이다.

내가 접속한 IP주소 확인은 http://www.findip.kr 에 접속하면 Public IP 주소를 알려준다.

그런데 findip.kr 사이트에서 받은 결과와 운영하는 서버에서 인식하는 IP주소가 다를 수 있다.

이때에는 운영하는 서버에서 인식하는 IP기준으로 필터링을 해야 한다.

 

<?php
$UserIP = $_SERVER['REMOTE_ADDR'];  // 접속한 사용자의 IP주소 불러오기
echo $UserIP."<br />";
echo $_SERVER['HTTP_USER_AGENT']; // 접속자의 사용자 브라우저 환경값 가져오기

$ip_extract = explode(".",$UserIP);  //.로 분리해서 배열로 저장
$UserIP_trim = $ip_extract[0].".".$ip_extract[1].".".$ip_extract[2];

$ipcheck_1 = "100.200.200"; // 접속 허용 IP 블럭

if($UserIP_trim == $ipcheck_1) {
   // 인증시키는 창으로 이동시킨다.
   $url = $PHP_SELF;
   $url = urlencode($url);
   echo ("<meta http-equiv='Refresh' content='0; URL=list.php'>");
   exit;
} else {
    echo ("<script>alert('허용된 사용자가 아닙니다');window.top.location.replace('index.php');</script>");
}

?>

 

다음과 같이 해도 된다.

<?php
if(strpos($UserIP, "100.200.200.") !== false) {  // 포함
    
} else {  // 미포함

}
?>

 

DB에 접속을 허용할 user 를 등록한 경우에만 허용하고자 한다면 아래와 같이 함수를 만들어서 사용하면 된다.

<?php
class LoginClass {
    function allowIPaddressChk(){
        global $db;
        $access_ip=$_SERVER['REMOTE_ADDR'];
        $sql ="select count(*) from allowHosts where ipaddr='".$access_ip."'";
        $result=mysql_query($sql);
        if($row=mysql_fetch_row($result)){
            if($row[0] == '1'){
                return 1;
            } else {
                return 0;
            }
        }
    }

} // End of Class

 

접속 허용 여부를 체크할 PHP 파일에 아래 코드를 추가한다.

require_once "dbconnect.php";
require_once "phpclass/LoginClass.php";

$access=new LoginClass();
if($access->allowIPaddressChk() == '0'){
    echo $_SERVER['REMOTE_ADDR'];
    exit;
}

 

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

PHP 일일 통계 테이블 구조 및 코드  (0) 2016.11.16
접속자 통계 구하기  (0) 2016.10.24
문자열 숫자 표기  (0) 2016.04.23
킴스큐 함수 활용  (0) 2016.04.19
[PHP] 날짜 함수 정리  (0) 2015.08.03
블로그 이미지

Link2Me

,
728x90

csv 파일 형태로 내보내기를 하면 DB에는 01 로 되어 있는데도 불구하고

echo '<td>'.$row[1].'</td>';

로 하면 앞의 숫자 0이 없어져 버린다.

이걸 방지하기 위해서는 아래와 같이 해야 한다.

echo "<td style='text-align:center;mso-number-format:\@'>".$row[1]."</td>";

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

접속자 통계 구하기  (0) 2016.10.24
접속 허용 IP 체크  (0) 2016.05.04
킴스큐 함수 활용  (0) 2016.04.19
[PHP] 날짜 함수 정리  (0) 2015.08.03
[PHP] 설문조사 종료날짜 체크  (0) 2015.05.27
블로그 이미지

Link2Me

,
728x90

킴스큐에서 제공하는 함수를 일반 PHP에서도 활용할 수 있게 수정해서 적용해봤는데 잘 된다.

DB 업데이트할 때에는 로직을 어떻게 적용할 것인지에 따라 유연성있게 적용할 수 있다.

함수화를 잘 해두면 코딩이 편리해진다.

where 조건절은 있을 수도 있고 없을 수도 있다. 이걸 감안해서 만들어져 있다고 보면 된다.

조인의 개념도 알고 보면 아주 쉬운 거다. 역시 이 함수에서 조인한 것을 적용해 볼 수 있다.


function getExt($filename)
{
    $ext = substr(strrchr($filename,"."),1);
    $ext = strtolower($ext);
    return $ext;
}

// DB Query Cutom 함수
function getDbData($table,$where,$data)
{
    global $db;
    $result = mysql_query('select '.$data.' from '.$table.($where?' where '.getSqlFilter($where):''));
    $row = mysql_fetch_array($result);
    return $row;
}

//DB삽입
function getDbInsert($table,$key,$val)
{
    global $db;
    mysql_query("insert into ".$table." (".$key.")values(".$val.")");
}

//DB업데이트
function getDbUpdate($table,$set,$where)
{
    global $db;
    mysql_query('set names utf8');
    mysql_query('set sql_mode=\'\'');
    mysql_query("update ".$table." set ".$set.($where?' where '.getSqlFilter($where):''));
}

//SQL필터링
function getSqlFilter($sql)
{
    return $sql;
}

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

접속 허용 IP 체크  (0) 2016.05.04
문자열 숫자 표기  (0) 2016.04.23
[PHP] 날짜 함수 정리  (0) 2015.08.03
[PHP] 설문조사 종료날짜 체크  (0) 2015.05.27
[PHP] 쿠키와 세션, 그리고 보안  (0) 2015.05.27
블로그 이미지

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

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


<?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>";
}

?>


'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

,