728x90

array, sub array 등 다차원 배열을 단순화 시키는 경우가 필요하다.

아래 코드와 같이 편법(?) 처리하였다.

SQL 문으로 처리하는 걸 검색해보니 해결하기가 너무 어렵다.

오라클은 쉽게 제공하는 기능이 있는데 MySQL은 너무 복잡하다.


$c = new LoginClass;
$rows = $c -> getDbData('menu_items', '', '*');
foreach ($rows as $row) {
    $TreeMenu[] = $row;
}

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($c->TreeSQL($TreeMenu)));
$c->TableTruncate('menu_treesort'); // 테이블 비우기
$i=0;
foreach($it as $k=>$v) {
    $key = '_id';
    $val = "$v";
    $c->getDbInsert('menu_treesort', $key, $val);
    $i++;
}
$c->getDbUpdate('menu_items m join menu_treesort s on m.id=s._id', "sort=s.idx", NULL,'');

echo $i.'개 Data inserted';


TreeSQL 함수

이 함수가 TreeView Sort 의 핵심이다.

function TreeSQL($array, $parent_id = 0, $parents = array()) {
    if ($parent_id == 0) {
        foreach ($array as $element) {
            if (($element['parent_id'] != 0) && !in_array($element['parent_id'], $parents)) {
                $parents[] = $element['parent_id'];
            }
        }
    }

    $R = array();
    foreach ($array as $element) {
        if ($element['parent_id'] == $parent_id) {
            if (in_array($element['id'], $parents)) {
                array_push($R,$element['id']);
                array_push($R, TreeSQL($array, $element['id'], $parents));
            } else {
                array_push($R,$element['id']);
            }
        }
    }
    return $R;
}

블로그 이미지

Link2Me

,
728x90

Just refers to exactness. Only refers to uniqueness.
In many cases, they are interchangeable. But not always.

Just can indicate a short period of time when something happened.
I just washed the floor, and it’s still wet.
= I washed the floor a few minutes ago.

Only has a meaning of one.
I have just one brother.
= I have only one brother.

I thought you were hungry, but you ate just half of your sandwich.

just = exactly
This is just what I wanted to do.
He's just two dollars.

only = limited to
There are only 100 tigers alive.

'영어 > 뉘앙스 어휘' 카테고리의 다른 글

How about vs What about  (0) 2017.08.18
trust 와 believe 의 차이  (0) 2016.02.23
chance 와 opportunity 의 차이  (0) 2016.02.18
think 와 guess 의 차이  (0) 2016.02.07
in a rut  (0) 2016.01.29
블로그 이미지

Link2Me

,
728x90

네이버에서 제공하는 날씨 정보를 파싱하는 방법이다.


<?php
$url = 'http://weather.naver.com/rgn/cityWetrCity.nhn?cityRgnCd=CT001024#nhn_weather_tab';

function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

$html = file_get_contents_curl($url);

// 가져온 데이터가 깨져보이는 경우는 인코딩 모드가 UTF-8 이 아닐 수 있다.
$enc = mb_detect_encoding($html, array('EUC-KR', 'UTF-8', 'shift_jis', 'CN-GB'));
if ($enc != 'UTF-8') {
    $html = iconv($enc, 'UTF-8', $html);
}
print_r($html);
?>


위와 같이 cURL 을 이용하면 해당 페이지 정보가 보이는데 XML이 아니라 HTML Web 이다.

소스보기를 하면 html 코드들이 보인다.


PHP Simple HTML DOM Parser 를 이용하면 원하는 곳만 쉽게 뽑아낼 수 있다.

http://simplehtmldom.sourceforge.net/ 에 가면 다운로드 받을 수 있다.

jQuery 처럼 selector 로 HTML 페이지에 있는 tags를 찾을 수 있다.


PHP Simple HTML DOM Parser 로 가져온 걸 echo 로 찍어보면 한줄로 보여서 가독성이 떨어진다.

그래서 cURL 로 가져와서 소스보기를 한 다음 원하는 태그를 find로 찾아서 원하는 결과를 출력하면 된다.

http://simplehtmldom.sourceforge.net/manual.htm 매뉴얼에 좀 더 상세한 사용법 예제들이 나온다.


<?php
$url = 'http://weather.naver.com/rgn/cityWetrCity.nhn?cityRgnCd=CT001024#nhn_weather_tab';

include_once 'simple_html_dom.php';
$html = file_get_html($url);

//echo $html->find('li[id="tab_CT001000"]',0);
echo $html->find('div[id="content_sub"]',0)->children(0);
//echo $html->find('div[id="content_sub"]',0)->children(1);
echo $html->find('div[class="w_now2"]',0)->children(0)->children(0)->children(0);

echo $html->find('div[class="fl"]',0);
echo $html->find('div[class="fl"]',0)->plaintext;

//echo $html->find('div[class="fl"]',0)->children(0);
//echo $html->find('div[class="fl"]',0)->children(1);
//echo $html->find('div[class="fl"]',0)->children(2);
?>
 


위 박스에 나온 예제를 소스보기로 비교하면서 실행해보면 금방 이해된다.

'Web 프로그램 > JSON, 파싱 다루기' 카테고리의 다른 글

PHP json_encode  (0) 2018.06.19
PHP Local JSON 파일 읽어오기  (0) 2018.05.18
기상청 지역 날씨정보 파싱  (0) 2017.12.23
Parse JSON with PHP (JSON 파싱)  (2) 2017.11.27
PHP Array 활용 JSON  (0) 2017.05.11
블로그 이미지

Link2Me

,
728x90

특정 지역의 날씨정보를 기상청으로부터 가져오는 코드에 대해 알아보고 적어둔다.


기상청 rss 를 통해 동네예보 rss 구하기

http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp?sido=4100000000&gugun=4146500000&dong=4146554000&x=27&y=14


1번을 누르면 해당지역 rss 에 대한 날씨예보 정보(현재 온도, 시간별 날씨, 강수량, 기온, 습도 등)가 검색된다.

http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4146554000


크롬브라우저와 Firefox가 다르게 검색된 결과를 보여준다.

Firefox 에서는


라고 검색된다.


http://www.kma.go.kr/wid/queryDFS.jsp?gridx=62&gridy=122


X좌표값과 Y좌표값을 넣고 위 URL를 웹브라우저에 입력하면 해당지역 XML 코드가 출력된다.


temp : 온도, hour : 시간, wfKor : 날씨, pop : 강수량, reh : 습도



PHP에서 Web상의 XML 문서를 파싱하기 위해서는 cURL 라이브러리를 이용하면 된다.

String 으로 추출된 결과물을 simplexml_load_string 으로 구조체로 변환한다.

XML 데이터를 JSON 으로 변환한 다음 배열(array)를 읽어서 원하는 자료를 추출하는 것은 foreach 문을 사용하면 되는거 같다.

배열을 출력하는 print_r 함수를 이용하여 내용을 봐가면서 원하는 자료만 추출하면 된다.


<?php

function file_get_contents_curl($url) {
    $ch = curl_init();// curl 리소스를 초기화
    curl_setopt($ch, CURLOPT_URL, $url); // url을 설정
    // 헤더는 제외하고 content 만 받음
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 응답 값을 브라우저에 표시하지 말고 값을 리턴
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);// 리소스 해제를 위해 세션 연결 닫음
    return $data;
}


$url = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=62&gridy=122";

$xml_string = file_get_contents_curl($url);

$xml = simplexml_load_string($xml_string);

$json = json_encode($xml); // XML to JSON

$R = json_decode($json,TRUE);//배열로 변환


print_r($R);

echo '<br />';

echo '<br />';

echo $R['header']['tm'].'<br />';//날씨 예보시간

$wData = $R['body']['data'][0];

print_r($wData);

echo '<br />';

echo '<br />';

//echo $wData['hour'].'시 온도:'.$wData['temp'].' 날씨:'.$wData['wfKor'];


foreach($R['body']['data'] as $wData){

    echo $wData['hour'].'시 온도:'.$wData['temp'].' 날씨:'.$wData['wfKor'];

    echo '<br />';

}

?>


위 코드에서 JSON 으로 변경하지 않고 처리한다면

$data = file_get_contents_curl($url);
$xml = simplexml_load_string($data);

echo '<pre>';
print_r($xml);
echo '</pre>';

foreach ($xml->body->data as $row) {
    $hour = $row -> hour;
    $temp = $row -> temp;
    $wfkor = $row -> wfKor;
    $pop = $row -> pop;
    $reh = $row -> reh;
    $wdkor = $row -> wdKor;
}

와 같이 처리하면 원하는 걸 뽑아낼 수 있다.


배열에 나오는 날씨는 내일과 모레 날씨 정보를 보여주는 거 같다.

다음날 오전에 다시 확인해보니 내일, 모레 뿐만 아니라 현재 기준으로 앞으로의 오늘 날씨 정보도 보여주더라.

그런데 날짜 정보가 XML 파일에 기록되지 않아서 해당 정보를 정확하게 파악하기가 쉽지 않다.


cURL 함수 사용이 가능한지 여부를 확인하는 방법

 <?php
if (ini_get('allow_url_fopen') == '1') {
   // file_get_contents() 사용
   echo 'php.ini 환경에서 허용';
} else {
   // curl 함수 이용 가능 여부
   if (function_exists('curl_init')) {
       echo 'curl 함수 사용 가능';
   } else {
       echo 'curl 함수 이용 불가';
   }
}
?>


php.ini에는 'allow_url_fopen'라는 설정항목이 있다.
이 항목이 off일 경우에는 fopen 등의 파일관련 함수에서 URL로 파일을 읽어오는 것이 불가능하다.
'allow_url_fopen'을 off로 하는 대부분의 이유는 '보안 취약성'의 우려가 있기 때문이다.
For example, somebody might pass /etc/passwd as a url, and be able to view its contents.

블로그 이미지

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

HTML Form 은 client의 정보를 입력받는 문서라고 보면 된다.

<form> 태그를 이용하여 각종 입력양식을 통해 입력받아 서버로 전달하는 기능을 담당한다.

form객체는 document.forms 배열로 표현한다.


파일을 직접 실행해볼 수 있게 만든 예제 파일

formChk.php

form_javascript.php

form_jquery.php


jQuery 를 사용한 함수는 없지만 jQuery 스크립트를 한줄 추가했다.

첨부한 예제 파일을 다운로드 받아서 실행해보면 금방 이해된다.

forms[0] 는 한 파일안에 form 태그가 2개 존재할 경우 첫번째 form 을 의미한다.

두번째 form 은 forms[1]


var name = document.myform.name.value;
var telNO = document.myform.telNO.value;
var address = document.myform.address.value;

에서 공통적인 변수를 별도로 지정하여 처리하는 편이 더 좋다.

var f = document.myform;


<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
function info_form(){
   str  = " name   : " + document.myform.name + "<br>" ;
   str += " action : " + document.myform.action+ "<br>" ;
   str += " target : " + document.myform.target + "<br>" ;
   str += " method : " + document.myform.method + "<br>" ;
   str += " encoding  : " + document.myform.encoding + "<br>" ;
   str += " length  : " + document.myform.length + "<br>" ;
   str += " 첫번째 요소 value  : " + document.myform.elements[0].value + "<br>" ;
   str += " 첫번째 요소 name  : " + document.myform.elements[0].name + "<br>" ;
   str += " 첫번째 form의 첫번째 요소 name  : " + document.forms[0].elements[0].name + "<br>" ;
   str += " 첫번째 form의 첫번째 요소 value  : " + document.forms[0].elements[0].value + "<br>" ;
   str += " 첫번째 form의 두번째 요소 name  : " + document.forms[0].elements[1].name + "<br>" ;
   str += " 첫번째 form의 두번째 요소 value  : " + document.forms[0].elements[1].value + "<br>" ;
   str += " 첫번째 form의 세번째 요소 name  : " + document.forms[0].elements[2].name + "<br>" ;
   str += " 첫번째 form의 세번째 요소 value  : " + document.forms[0].elements[2].value + "<br>" ;
   document.write(str);

}

function validateForm(){
    var name = document.myform.name.value;
    var telNO = document.myform.telNO.value;
    var address = document.myform.address.value;
    if(name ==""){
        alert('이름을 입력하세요');
        document.myform.name.focus();
        return false;
    }
    if(telNO ==""){
        alert('전화번호를 입력하세요');
        document.myform.telNO.focus();
        return false;
    }
    if(address ==""){
        alert('주소를 입력하세요');
        document.myform.address.focus();
        return false;
    }
}
</SCRIPT>
</head>
<body>
<form name="myform" action="formChk.php" method="post" onsubmit="return validateForm()">
    이름:<input type="text" name="name" id="myname" value="홍길동" size="20" />
    전화:<input type="text" name="telNO" value="010-1234-9999" size="20" />
    주소:<input type="text" name="address" value="" size="50" required />
    <input type="button" value="폼정보보기" onclick="info_form()" />
    <input type="submit" value="확인" />
    <input type="reset" value="취소" />
</form>
<p id="demo"></p>
</body>
</html>

 === formChk.php ===

<?php
extract($_POST);
print_r($_POST);
echo '<br />';
var_dump($_POST);
exit; // 이 명령어 다음에 적힌 코드는 실행하지 말고 빠져나가라.
?>


위 코드를 jQuery 로 변경한 것을 살펴보자.

$("[attribute]")  : [attribute(속성)] selector는 각 selector의 특정 속성을 선택한다.

- [attribute=value] : 특정 속성과 값을 가진 각 element를 선택한다.

- $(selector).attr(attribute) : attribute의 값을 Return

- $(selector).attr(attribute,value) : attribute의 값을 설정

- $(selector).attr(attribute,function(index,currentvalue)) : function을 사용하여 값을 설정


<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>

function info_form(){
   str  = " name   : " + $("form").attr('name') + "<br>" ;
   str += " action : " + $("form").attr('action') + "<br>" ;
   str += " target : " + $("form").attr('target') + "<br>" ;
   str += " method : " + $("form").attr('method') + "<br>" ;
   str += " encoding  : " + $("form").attr('encoding') + "<br>" ;
   str += " length  : " + $("form").val().length + "<br>" ;
   str += " 첫번째 요소 value  : " + $("form input[name=name]").val() + "<br>" ;
   str += " 첫번째 요소 name  : " + $("form input[name=name]") + "<br>" ;
   str += " 첫번째 form의 첫번째 요소 name  : " + document.forms[0].elements[0].name + "<br>" ;
   str += " 첫번째 form의 첫번째 요소 value  : " + document.forms[0].elements[0].value + "<br>" ;
   str += " 첫번째 form의 두번째 요소 name  : " + $("form input[name=telNO]") + "<br>" ;
   str += " 첫번째 form의 두번째 요소 value  : " + $("form input[name=telNO]").val() + "<br>" ;
   str += " 첫번째 form의 세번째 요소 name  : " + $("form input[name=address]") + "<br>" ;
   str += " 첫번째 form의 세번째 요소 value  : " + $("form input[name=address]").val() + "<br>" ;
   document.write(str);

}


$(document).ready(function(){
    $("#info_form").click(function(){
        info_form();

        // $("form :input").each(function(){
           // alert($(this).val());
        // });

    });
    
    $("form").submit(function(){
        var name = $("input[name=name]").val();
        var telNO = $("input[name=telNO]").val();
        var address = $("input[name=address]").val();
        if(name ==""){
            alert('이름을 입력하세요');
            $("input[name=name]").focus();
            return false;
        }
        if(telNO ==""){
            alert('전화번호를 입력하세요');
            $("input[name=telNO]").focus();
            return false;
        }
        if(address==""){
            alert('주소를 입력하세요');
            $("input[name=address]").focus();
            return false;
        }
    });
});
</script>
</head>
<body>
<form name="myform" action="formChk.php" method="post">
    이름:<input type="text" name="name" id="myname" value="홍길동" size="20" />
    전화:<input type="text" name="telNO" value="010-1234-9999" size="20" />
    주소:<input type="text" name="address" value="" size="50" />
    <input type="button" id="info_form" value="폼정보보기" />
    <input type="submit" value="확인" />
    <input type="reset" value="취소" />
</form>
<p id="demo"></p>
</body>
</html>


<button id="button1">button1</button>
<button id="button2">button2</button>
<button id="button3">button3</button>
<button id="button4">button4</button>

<div></div>

<script>
$(function(){
    $("button").each(function(){
        $(this).click(function(){
            var name_var=$(this).attr("id");
            $("div").text("jQuery Object : "+name_var);
        });
    });
})
</script>


참조 : 제대로 배우는 자바스크립트 Form 전송 기초 https://link2me.tistory.com/954

블로그 이미지

Link2Me

,
728x90

화면에 출력되는 Table 데이터를 Filtering 하여 보여주는 jQuery 코드 예제다.

화면에 이미 출력된 데이터 중에서 Filtering 한다고 보면 된다.


테스트에 사용한 코드는

jQuery_TableFiltering-01.php


테이블 필터링 예제는 https://www.jqueryscript.net/demo/jQuery-Plugin-To-Filter-Rows-Of-An-Html-Table-Table-Filtering/ 등 검색하면 많이 나온다.



위와 같은 테이블에서 검색어를 입력하면 해당 검색어를 포함하는 리스트만 출력하는 jQuery 에 대해 정리해둔다.


 $(document).ready(function() {
    $("#mykeyword").on("keyup", function() {
        var value = $(this).val().toLowerCase();
        $("#myTable_tbody tr").filter(function() {
            $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
        });
    });
});


위 jQuery 코드는 테이블내에 일치하는 모든 결과를 출력한다. (번호열 검색 제외)

단, 한글을 검색하는 경우에는 즉각적으로 표시되지 않으므로 입력한 엔터키를 한번 눌러야 한다.

- keyup 이벤트는 키보드의 키를 눌렀다 뗄 때 요소에 이벤트를 발생시킨다.

- $("#mykeyword").on("keyup", function() {} 또는 $("#mykeyword").keyup(function() {} 으로 해도 된다.

- toLowerCase() : 문자열에서 영문 대문자를 모두 소문자로 바꾼다.

- indexOf("찾을 문자") : 문자열에서 왼쪽부터 찾을 문자와 일치하는 문자를 찾아 최초로 일치하는 문자의 인덱스 번호를 반환한다. 만일 찾는 문자가 없다면 -1 을 반환한다.


 $(document).ready(function() {
    $("#mykeyword").on("keyup", function() {
        var value = $(this).val().toLowerCase();
        $("#myTable > tbody > tr").hide();
        var temp = $("#myTable > tbody > tr > td:nth-child(5n+4):contains('" + value + "')");
        $(temp).parent().show();
    });
});


Using a formula (an + b) : a 는 테이블의 칼럼 갯수라고 보면 된다. b 는 1부터 시작한다.

td:nth-child(5n+4) : 칼럼 갯수가 5개인 테이블에서 4번째 즉 학과에 대한 검색결과를 출력한다.

5n + 1 로 변경하고 검색(Filtering)하면 번호열 검색결과를 반환한다.


CSS 에

#myTable > tbody > tr td:nth-child(5n-1) {
    align: right;
    text-align: right;
}

를 추가해보면 테이블 정렬이 어떻게 되는지 확인할 수 있다.

-1 은 오른쪽부터 0, -1, -2 라고 보면 된다.

5n 대신에 2n, 3n, 4n 등으로 숫자를 변경해보면 어떻게 변하는지 확인할 수 있다.


첨부파일 코드 내용

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#mykeyword").keyup(function() {
        var value = $(this).val().toLowerCase();
        $("#myTable_tbody tr").filter(function() {
            $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
        });
        // $("#myTable > tbody > tr").hide();
        // var temp = $("#myTable > tbody > tr > td:nth-child(5n+4):contains('" + value + "')");
        // $(temp).parent().show();
    });
});
</script>
<style>
#container {width: 900px; margin: 0 auto;}
#myTable {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
    border: 1px solid #ddd;
}

#myTable td, th {
    border: 1px solid #dddddd;
    text-align: center;
    padding: 8px;
}

#myTable tr {border-bottom: 1px solid #ddd;}

#myTable tr:nth-child(even) {
    background-color: #f1f1f1;
}

#myTable > tbody > tr td:nth-child(5n) {
    align: right;
    text-align: right;
}

#myTable > thead > tr { background-color: #ddee33; color:#000fff; }
#myTable > tbody > tr:hover { background-color: #d1f1f1; }
</style>
</head>
<body>
<div id="container">
    <h2>Filterable Table</h2>
    <input type="text" id="mykeyword" placeholder="검색어를 입력하세요">
    <br>
    <br>
    <table id='myTable'>
        <thead>
            <tr>
                <th>번호</th>
                <th>이름</th>
                <th>생년월일</th>
                <th>학과</th>
                <th>학번</th>
            </tr>
        </thead>
    
        <tbody id="myTable_tbody">
            <tr>
                <td>1</td>
                <td>박진희</td>
                <td>1991.09.07</td>
                <td>경영정보학과</td>
                <td>2014290031</td>
            </tr>
            <tr>
                <td>2</td>
                <td>김보연</td>
                <td>1991.07.07</td>
                <td>경영학과</td>
                <td>2016290032</td>
            </tr>
            <tr>
                <td>3</td>
                <td>하석진</td>
                <td>1991.05.15</td>
                <td>사회학과</td>
                <td>2017290033</td>
            </tr>
            <tr>
                <td>4</td>
                <td>유희열</td>
                <td>1991.08.07</td>
                <td>건축학과</td>
                <td>2011290038</td>
            </tr>
            <tr>
                <td>5</td>
                <td>송승헌</td>
                <td>1989.04.07</td>
                <td>물리학과</td>
                <td>2011290039</td>
            </tr>
            <tr>
                <td>6</td>
                <td>김태희</td>
                <td>1988.02.07</td>
                <td>의류학과</td>
                <td>2010290040</td>
            </tr>
            <tr>
                <td>7</td>
                <td>정지훈</td>
                <td>1988.07.25</td>
                <td>식품학과</td>
                <td>2012290042</td>
            </tr>
            <tr>
                <td>8</td>
                <td>박진영</td>
                <td>1981.02.07</td>
                <td>영어영문학과</td>
                <td>2015290031</td>
            </tr>
            <tr>
                <td>9</td>
                <td>양현석</td>
                <td>1993.09.07</td>
                <td>역사학과</td>
                <td>2017290055</td>
            </tr>
            <tr>
                <td>10</td>
                <td>유재석</td>
                <td>1995.09.07</td>
                <td>경영정보학과</td>
                <td>2013290056</td>
            </tr>
            <tr>
                <td>11</td>
                <td>고아라</td>
                <td>1993.09.07</td>
                <td>역사학과</td>
                <td>2017290060</td>
            </tr>
        </tbody>
    </table>
    <p>테이블 헤더 검색을 방지하기 위해 tbody 내에서 검색 시작</p>
</div>
</body>
</html>


블로그 이미지

Link2Me

,
728x90

선택된 메뉴가 몇번째인지 찾아내는 jQuery


$('.nav-tabs a').click(function(){
    var idx = $('.nav-tabs a').index(this);
    alert(idx);
    $(this).tab('show');
});


또는

$('.nav-tabs li>a').click(function(){
    var idx = $('.nav-tabs li>a').index(this);
    if(idx == 2){
        alert(idx + '번째 index를 선택했습니다');
    } else {
        alert(idx);
    }
    $(this).tab('show');
});



<ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="#menu0">메뉴0</a></li>
    <li><a data-toggle="tab" href="#menu1">메뉴1</a></li>
    <li><a data-toggle="tab" href="#menu2">메뉴2</a></li>
    <li><a data-toggle="tab" href="#menu3">메뉴3</a></li>
</ul>

<div class="tab-content">
    <div id="menu0" class="tab-pane fade in active">
      <h4>Menu 0</h4>
      <p>Eaque ipsa quae ab illo inventore veritatis. </p>
    </div>
    <div id="menu1" class="tab-pane fade">
      <h4>Menu 1</h4>
      <p>Eaque ipsa quae ab illo inventore veritatis. </p>
    </div>
    <div id="menu2" class="tab-pane fade">
      <h4>Menu 2</h4>
      <p>Eaque ipsa quae ab illo inventore veritatis. </p>
    </div>
    <div id="menu3" class="tab-pane fade">
      <h4>Menu 3</h4>
      <p>Eaque ipsa quae ab illo inventore veritatis. </p>
    </div>
</div> 


블로그 이미지

Link2Me

,
728x90

부트스트랩 기반으로 회원관리 테이블을 작성중이다.

PDO 기반으로 Class 함수를 만드느라고 시행착오를 겪어가면서 수정 보완하면서 만들고 있다.



=== admin.php ===

<?php include_once '_common.php';?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <?php
        require_once $g['path_layout'] . 'default/includes/_import.head.php';
        ?>
    </head>
    <body>
        <?php
        require_once $g['path_layout'] . 'default/includes/header.php';
        ?>

        <!-- 메인 화면 -->
        <main class="container-fluid">
            <div class="container main-container">
                <!-- body 화면 -->
                <div class="row">
                    <div class="col-md-12">
                        <div class="panel panel-default">
                            <div class="panel-body" id="panel_content">
                                <?php require_once $g['path_module'] . 'admin/adminMenu.php';?>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </main>
        <div id="ajaxPath" data-path="<?php echo $g['path_page'] . 'process/'; ?>" ></div>
        <div id="dialog"></div>
        <div id="actionPath" data-path="<?php echo $g['path_module'] . 'admin/'; ?>" ></div>
    </body>

</html>

=== _import.head.php ===

<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta name="apple-mobile-web-app-capable" content="no" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title><?=$_site['site_name'];?></title>
<link rel="stylesheet" href="<?php echo $g['path_bootstrap']?>css/bootstrap.min.css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="<?php echo $g['path_core']?>css/topmenu.css" />
<link rel="stylesheet" href="<?php echo $g['path_core']?>css/vertical-menu.css" />
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="<?php echo $g['path_bootstrap']?>js/bootstrap.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="<?php echo $g['path_core']?>js/jquery.tablednd.js"></script>
<script src="<?php echo $g['path_core']?>js/user.js"></script>
<script src="<?php echo $g['path_core']?>js/table_display.js"></script>
<!--[if lt IE 9]> <!-- 5. 인터넷익스플로러 9버전 이하일 경우 html5가 인식될 수 있게 해주는 스크립트 -->
<script src="<?php echo $g['path_bootstrap']?>js/respond.min.js"></script>

=== header.php ===

<nav class="navbar navbar-default">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">메뉴</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="<?php echo $g['path_page'];?>index.php">
          <?=isset($_bbs_info['bbs_name'])?$_bbs_info['bbs_name']:$_site['site_name']?>
      </a>
    </div>
    <div class="navbar-collapse collapse" id="navbar" >
        <ul class="nav navbar-nav">
            <?php require_once $g['path_layout'].'menu/item_topmenu.php';?>
        </ul>

        <ul class="nav navbar-nav navbar-right">
            <?php if(isset($_SESSION['userID']) && !empty($_SESSION['userID'])):?>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><? echo $_SESSION['userNM'] ?>
                    <b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li><a href="#" onclick="document.getElementById('logout-form').submit();">로그아웃</a></li>
                        <li><a href="<?php echo $g['path_page'];?>member.php?m=info">정보수정</a></li>
                        <?php if(isset($_SESSION['admin']) && $_SESSION['admin']==1):?>
                        <li class="divider"></li>
                        <li><a href="<?php echo $g['path_page']; ?>admin.php">관리자</a></li>
                        <?php endif;?>
                    </ul>
                </li>
            <?php else:?>
                <li><a href="#modal-login" data-toggle="modal" >로그인</a></li>
                <li><a href="<?php echo $g['path_page'];?>member.php?m=join">회원가입</a></li>
            <?php endif;?>            
        </ul>

    </div><!--/.nav-collapse -->
    <div>
        <?php
            include_once $g['path_layout'].'default/includes/login_modal.php';           
        ?>
    </div>

  </div>
</nav>


=== memberList.php ===

<?php
if (!isset($_SESSION)) {
    session_start();
}
if(!isset($_SESSION['userID']) || empty($_SESSION['userID'])){
    echo 0;
    exit;
}

require_once $_SERVER['DOCUMENT_ROOT'].'/pdoclass/dbconfig.php';
$c = new LoginClass;
$b = new boardClass;
$link_url = $_SERVER['PHP_SELF']; // 현재 실행중인 파일명 가져오기
$page = isset($_GET['page'])? trim($_GET['page']):1;//페이지 변수 설정
$rowsPage = 10; // 한 화면에 표시되는 게시글 수
$curPage = isset($_GET['p']) ? $_GET['p'] : 1;
$table = "members m join member_data d on m.idx=d.relatedidx";
$cat1 = isset($cat1) ? $cat1: '';
$cat2 = isset($cat2) ? $cat2: '';
$where = isset($_GET['where']) ? $_GET['where']: '';
$keyword = isset($_GET['keyword']) ? $_GET['keyword']: '';
$xorderby= isset($xorderby) ? $xorderby : 'idx DESC';
if($where && $keyword) {
    if($where == 'userNM') $sql = "userNM LIKE '%".$keyword."%' ";
    if($where == 'userID') $sql = "userID LIKE '%".$keyword."%' ";
    if($where == 'mobileNO') $sql = "mobileNO LIKE '%".$keyword."%' ";
    if($where == 'unify') {
        $sql = "(userID LIKE '%".$keyword."%' OR userNM LIKE '%".$keyword."%' OR mobileNO LIKE '%".$keyword."%') ";
    }
} else {
    $sql ='';
}
$g['url_link']=($where?'where='.$where.'&amp;':'').($keyword?'keyword='.urlencode(stripslashes($keyword)).'&amp;':'').($cat1?'cat1='.$cat1.'&amp;':'').($cat2?'cat2='.$cat2.'&amp;':'');
$g['bbs_reset'] = $link_url;

$rows= $c->getDbArray($table,$sql,'*',$xorderby,$rowsPage,$curPage);
$NUM = $c->getDbRows($table,$sql); // 전체 게시글 수 또는 검색된 게시글 수
$TPG = $b->getTotalPage($NUM,$rowsPage); // 전체페이지수 및 현재 페이지수
?>

<div class="pull-left info">
    <?php if( $keyword ):?><strong>"<?php echo $keyword?>"</strong> 검색결과 : <?php endif?>
    <?php echo number_format($NUM)?>개 (<?php echo $curPage;?>/<?php echo $TPG;?>페이지)
</div>
<table id="membertable" class="table table-bordred table-striped table-hover">
   <thead>
        <th align="center" width="50"><strong>idx</strong></th>
        <th align="center"><strong>아이디</strong></th>
        <th align="center"><strong>성명</strong></th>
        <th align="center"><strong>휴대폰</strong></th>
        <th align="center"><strong>일반전화</strong></th>
        <th align="center"><strong>가입일</strong></th>
        <th align="center"><strong>접속일</strong></th>
        <th align="center"><strong>권한</strong></th>
        <th align="center"><strong>개인정보</strong></th>
   </thead>
   <tbody>

<?php
foreach($rows as $R):
    $A = $c->getDbDataFromIdx('member_data','relatedidx',$R['idx'] );
?>
<tr id="<?php echo $R['idx']; ?>">
    <td><?php echo $R['idx']; ?></td>
    <td><?php echo $R['userID']; ?></td>
    <td><?php echo $R['userNM']; ?></td>
    <td><?php echo $c->hyphen_telNo($R['mobileNO']); ?></td>
    <td><?php echo $c->hyphen_telNo($A['officeNO']); ?></td>
    <td><?php echo substr($R['regdate'], 0, 8); ?></td>
    <td><?php echo $R['curdate']; ?></td>
    <td><?php echo $R['admin'] == 1 ? '관리자' : ''; ?></td>
    <td><?php echo $A['smart'] == 1 ? '공개동의' : '비공개'; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div class='searchbox'>
    <form name="membersearchf" class="form-inline" action="<?php echo $link_url;?>">
        <input type="hidden" name="orderby" value="<?php echo $xorderby;?>" />
        <select name="where" class="form-control input-sm">
            <option value="unify">통합</option>
            <option value="userNM">이름</option>
            <option value="userID">아이디</option>
            <option value="mobileNO">휴대폰</option>
        </select>
        <div class="input-group input-group-sm">
            <input type="text" name="keyword" value="" class="form-control input-search" placeholder="검색어">
            <span class="input-group-btn">
                <button type="button" class="btn btn-default" onclick="this.form.where.value='userNM';this.form.keyword.value='',this.form.submit();" title="리셋"><i class="glyphicon glyphicon-repeat"></i></button>
                <button type="submit" class="btn btn-info" title="검색"><i class="glyphicon glyphicon-search"></i></button>
            </span>
        </div>
    </form>
</div>
<div class="pull-right info">
    <a href="<?php echo $g['bbs_reset']?>" class="btn btn-default btn-sm pull-right">처음목록</a>
</div>
<?php $b->PageLinkView($link_url, $NUM, $rowsPage, $curPage, $g['url_link']); ?>


관련 작성 함수

※ PDO 조건에 맞게 구현되지 못한 함수도 있고 구현한 함수도 있다. (SQL 인젝션 관점)

   계속 시도를 하면서 방법을 찾을 생각이다.

// table 결과 조회 용도
public function getDbArray($table, $where, $flddata, $orderby, $rowsPage, $curPage) {
    $sql = 'select ' . $flddata . ' from ' . $table . ($where ? ' where ' . $this -> getSqlFilter($where) : '') . ($orderby ? ' order by ' . $orderby : '') . ($rowsPage ? ' limit ' . (($curPage - 1) * $rowsPage) . ', ' . $rowsPage : '');
    $stmt = $this -> db -> prepare($sql);
    $stmt -> execute();
    return $stmt;
}


// WhereArgs 조건에 일치하는 선택 DbData 가져오기
public function getDbDataFromIdx($table, $whereArgs, $idx) {
    $sql = 'select * from ' . $table . ' where ' . $whereArgs . '=?';
    $stmt = $this -> db -> prepare($sql);
    $stmt -> execute(array($idx));
    return $stmt -> fetch();
}


vertical-menu.css

/* Bootstrap 테이블 수정 */
.table > thead {
  background-color: #b3c6ff;
}
.table > thead > tr > th {
  text-align: center;
}
.table-hover > tbody > tr:hover {
  background-color: #e6ecff;
}
.table > tbody > tr > td {
  text-align: center;
}
.table > tbody > tr > #title {
  text-align: left;
}
div > #paging {
  text-align: center;
}

/* make sidebar nav vertical */
@media (min-width: 768px) {
  .sidebar .sidebar-nav .navbar .navbar-collapse {
    padding: 0;
    max-height: none;
  }
  .sidebar .sidebar-nav .navbar ul {
    float: none;
  }
  .sidebar .sidebar-nav .navbar ul:not {
    display: block;
  }
  .sidebar .sidebar-nav .navbar li {
    float: none;
    display: block;
  }
  .sidebar .sidebar-nav .navbar li a {
    padding-top: 12px;
    padding-bottom: 12px;
  }
}

 topmenu.css

/* 로그인 폼 */
.modal-header {
      color:black !important;
      text-align: center;
      font-size: 30px;
}
.modal-footer {
      background-color: #f9f9f9;
      padding: 5px 5px 5px 5px;
      border-top: 0px;
}
/* 로그인 폼 End */ 

/* 서브메뉴 */
.dropdown-submenu{position:relative;}
.dropdown-submenu>.dropdown-menu{
    top:0;
    left:100%;
    margin-top:-6px;
    margin-left:-1px;
    -webkit-border-radius:0 6px 6px 6px;
    -moz-border-radius:0 6px 6px 6px;
    border-radius:0 6px 6px 6px;
}

.dropdown-submenu>a:after{
    display:block;
    content:" ";
    float:right;
    width:0;
    height:0;
    border-color:transparent;
    border-style:solid;
    border-width:5px 0 5px 5px;
    border-left-color:#cccccc;
    margin-top:5px;
    margin-right:-10px;
}
.dropdown-submenu:hover>a:after{
    border-left-color:#555;
}
.dropdown-submenu.pull-left{float:none;}
.dropdown-submenu.pull-left>.dropdown-menu{
    left:-100%;
    margin-left:10px;
    -webkit-border-radius:6px 0 6px 6px;
    -moz-border-radius:6px 0 6px 6px;
    border-radius:6px 0 6px 6px;
}

@media only screen and (max-width: 768px) {
   
}

@media only screen and (min-width: 768px) {
    .dropdown-submenu:hover>.dropdown-menu {
        display: block;
    }
}


블로그 이미지

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

,