728x90

현재 실행중인 파일에서 일부 값이 변경되어 그 값을 가지고 변경되어야 할 경우가 있다.


PHP 에서 echo $_SERVER['PHP_SELF']; 로 확인해보면 http://domain/path/filename.php 까지를 추출한다.


jQuery 에서 alert($(location).attr('href')); 로 확인해보면 $(location).attr('href'); 는 뒤에 GET 변수까지를 추출한다.


그래서

var pageURL = $(location).attr('href')+"?ym=" + optVal;

$(location).attr('href', pageURL);

로 하면 잘못된 결과가 나온다.

즉 GET 변수까지를 $(location).attr('href') 로 인식하므로 뒤에 또 덧붙여져 ?ym=201611?ym=201612 이런 식이 되어 버린다.


그래서 PHP 를 같이 활용하여

var pageURL = "<?php echo $_SERVER['PHP_SELF'];?>?ym=" + optVal;

$(location).attr('href', pageURL);

로 코드 구현해서 원하는 결과를 얻었다.


$('#selectmonth').on('change',function(){
    if(this.value !== ""){
        var optVal=$(this).find(":selected").val();
        var pageURL = "<?php echo $_SERVER['PHP_SELF'];?>?ym=" + optVal;
        $(location).attr('href', pageURL);
    }
});


참고사항

$(location).attr('host');        // returns host
$(location).attr('hostname');    // returns hostname
$(location).attr('path');        // returns path
$(location).attr('href');        // returns href
$(location).attr('port');        // returns port
$(location).attr('protocol');    // returns protocol


728x90
블로그 이미지

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

728x90
블로그 이미지

Link2Me

,
728x90

Tree 형태의 JSON 을 만드는 방법으로 easyUI jQuery 를 사용하는 방법을 테스트 했다.

 

id: "1",
name: "loreim ipsum",
data: {},
children: [{
    id: "2",
    name: "lorem ipsum1",
    data: {},
    children: [{
        id: "3",
        name: "lorem ipsum2",
        data: {},
        children: [{


tree 형태의 JSON을 만드는 방법은

http://stackoverflow.com/questions/4328515/convert-php-array-to-json-tree

에 나온 걸 참조하면 된다.



Convert PHP array to JSON tree

=== treeSQLtoJSON.php ===

<?php
include_once "connect.php";
$sql = "SELECT * FROM treeview_items";
$res = mysqli_query($db, $sql);
while($row = mysqli_fetch_assoc($res)){
    $data[] = $row;
}

$node = array();
// Build array of item references:
foreach($data as $key => &$item) {
   $node[$item['id']] = &$item;
   // Children array:
   $node[$item['id']]['children'] = array();
   // Empty data class (so that json_encode adds "data: {}" )
   $node[$item['id']]['data'] = new StdClass();
}

// Set items as children of the relevant parent item.
foreach($data as $key => &$item)
   if($item['parent_id'] && isset($node[$item['parent_id']]))
      $node [$item['parent_id']]['children'][] = &$item;

// Remove items that were added to parents elsewhere:
foreach($data as $key => &$item) {
   if($item['parent_id'] && isset($node[$item['parent_id']]))
      unset($data[$key]);
}

$json = json_encode($data);
echo $json;
?>

=== treeview.php ===

<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>Basic Tree - jQuery EasyUI Demo</title>
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible"/>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
<link rel="stylesheet" href="js/easyui/themes/default/easyui.css">
<link rel="stylesheet" href="js/easyui/themes/icon.css">
<link rel="stylesheet" href="js/easyui/demo.css">

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript">
$(function(){
    $('#tt').tree({
        url: 'treeSQLtoJSON.php',
        onClick: function(node){
            //alert(node.link);
            $('.content').html(node.link);
        }
    });
});
</script>

</head>
<body>
<div style="margin:20px 0;"></div>
<div class="container-fluid"><!--container-fluid 클래스 선택자는 전체 화면을 사용할 때 사용 -->
  <div class="container"><!--container 클래스 선택자는 최대 넓이가 1170px -->
    <div class="col-md-2 sidenav">
      <!--사이드바 내용-->
        <div class="easyui-panel" style="padding:5px">
            <ul id="tt"></ul>
        </div>
    </div>
    <div class="col-md-10">
        <div class="content">
          <!--본문 내용-->
          본문내용
        </div>
    </div>
  </div>
</div>
</body>
</html>


코드가 훨씬 심플해졌다.


이제 http://www.jeasyui.com/demo/main/index.php 사이트 데모를 가지고 만들어보기가 훨씬 수월해졌다.


728x90
블로그 이미지

Link2Me

,
728x90

Treeview 를 만들기 위해서 이것 저것 테스트 해보느라고 고생 좀 하고 있다.

easytree.js 는 node.id 얻는 방법을 몰라서 포기를 했다.

그래서 검색해서 easyUI tree 를 찾아냈다.

http://www.jeasyui.com/documentation/index.php# 에 설명이 잘 나와 있다.

easyUI jQuery 는 잘 활용하면 홈페이지가 확 달라질 거 같다.


중요 포인트는 MySQL DB 자료를 JSON Data 로 만드는 방법을 알아야 하더라.

좀 복잡한 것을 만들 줄 알아야 하는데 아직 그 부분까지는 이해를 못했다.


=== treeSQLtoJSON.php ===

<?php
include_once "connect.php";
$sql = "SELECT * FROM treeview_items";
$res = mysqli_query($db, $sql);
while($row = mysqli_fetch_assoc($res)){
    $menu[] = $row;
}

// while 하나로 처리해야 하는데 Class 처리 목적 분리 코딩
$result = array();
foreach ($menu as $row){
    array_push($result,
    array('id'=>$row['id'],
          'parentId'=>$row['parent_id'],
          'name'=>$row['text'],
          'link'=>$row['link']
    ));
}

echo json_encode($result);
?>


JSON Data 만드는 법을 알고 나면 http://www.jeasyui.com/tutorial/tree/tree6.php 에서 내용을 읽어보고 데모 파일을 받아서 수정해서 사용하면 된다.

728x90
블로그 이미지

Link2Me

,
728x90

Treeview 를 검색해서 테스트 하다보니 JSON 만드는 방법을 알아야 원하는 결과로 만들어 낼 수 있는 거 같다.


<?php
include_once "connect.php";
require_once 'treeClass.php'; // Tree 클래스
$t = new treeClass();
$sql = "SELECT * FROM treeview_items";
$result = mysqli_query($db, $sql);
while($row = mysqli_fetch_assoc($result)){
    $menu[] = $row;
}

?>


여기까지는 일반적인 형태로 배열화를 하는 방법이다.

만들어진 배열을 가지고 foreach 문을 이용하여 다시 재가공을 해야 한다.


$rows   = array();
$i=0;
foreach ($menu as $r) {
    $rows[$i]['first_name'] = $r->first_name;
    $rows[$i]['last_name'] = $r->last_name;
    $rows[$i]['phone'] = $r->phone;
    $rows[$i]['email'] = $r->email;

    $i++;
}

//keys total & rows is required on jEasyUI
$result = array('total'=>$menu['count'],'rows'=>$rows);
echo json_encode($result);



Android JSON 포멧으로 만드는 가장 일반적인 형태


<?php

include_once "connect.php";

$sql = "SELECT * FROM address";
$res = mysqli_query($db,$sql); 
$result = array(); 
while($row = mysqli_fetch_array($res)){ 
    array_push($result,
    array('id'=>$row[0],'name'=>$row[1],'address'=>$row[2]
    )); 


$json = json_encode(array("result"=>$result)); 

?>


여기서

    array_push($result,
    array('id'=>$row[0],'name'=>$row[1],'address'=>$row[2]
    )); 

부분을

$result['result'][] = $row;

로 하는게 더 편할 수 있다.

728x90

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

Parse JSON with PHP (JSON 파싱)  (2) 2017.11.27
PHP Array 활용 JSON  (0) 2017.05.11
[PHP Parsing] Snoopy로 로또번호 추출하기  (0) 2016.08.01
XML 데이터 생성 처리  (0) 2016.06.06
PHP 와 XML 연동처리  (0) 2016.06.04
블로그 이미지

Link2Me

,
728x90


JQuery 기반 Autocompete 구현을 해보기로 하고 검색해서 개념을 잡고 테스트했다.

jQuery 를 모를 때는 엄두도 낼 수 없었는데 jQuery 에 대한 기본 개념을 조금 이해하고 다양한 플러그인(plugin)들을 테스트 해보고 있다.


http://www.bewebdeveloper.com/tutorial-about-autocomplete-using-php-mysql-and-jquery 에서 제공한 소스코드를 받아서 윈도우 AutoSet9 에서 설치하였다.

ajax_refresh.php 코드는 내가 사용하는 방식의 코드가 아니라서 수정했다.

나머지 파일은 약간 수정했다.



=== ajax_refresh.php ===

<?php
include_once 'connect.php';

$keyword = $_POST['keyword'];
$sql = "SELECT * FROM country WHERE country_name LIKE '%".$keyword."%' ORDER BY uid ASC LIMIT 0, 10";
$result = mysqli_query($db, $sql);
while($row = mysqli_fetch_assoc($result)){
    $list[] = $row;
}

foreach ($list as $rs) {
    // put in bold the written text
    $country_name = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['country_name']);
    // add new option
    echo '<li onclick="set_item(\''.str_replace("'", "\'", $rs['country_name']).'\')">'.$country_name.'</li>';
}
?>


=== autocomplete.js ===

function autocomplet() {
    var min_length = 0; // min caracters to display the autocomplete
    var keyword = $('#uid').val();
    if (keyword.length >= min_length) {
        $.ajax({
            url: 'ajax_refresh.php',
            type: 'POST',
            data: {keyword:keyword},
            success:function(data){
                $('#country_list_id').show();
                $('#country_list_id').html(data);
            }
        });
    } else {
        $('#country_list_id').hide();
    }
}

// set_item : this function will be executed when we select an item
function set_item(item) {
    // change input value
    $('#uid').val(item);  // 실제 DB와 연동하여 값을 넘겨줘서 검색해야 하는 부분
    // hide proposition list
    $('#country_list_id').hide();
}


파일은 원 사이트에서 받아도 되고 첨부한 파일을 받아서 DB 관련 부분을 수정해서 테스트 해봐도 된다.

본 첨부파일에는 dbconnect.php 파일도 같이 포함되어 있고, DB 스키마를 내가 사용하는 uid로 수정한 것도 포함되어 있다. 즉 받아서 DB에 테이블 생성하고 경로만 지정해주면 바로 동작이 가능하다.

mysqli 기반으로 테스트 한 것이므로 mysql 를 사용하는 환경이라면 약간 수정해야 한다.


autocomplete_for_php.zip


이 정도로도 개념 이해는 도움은 많이 되는데 다른 것도 검색해서 테스트해보고 기록해 두려고 한다.

문제점 : 한글 자동완성 검색 안됨


한글검색되는 코드 (추천)

구글링을 해보니 코드가 유사하게 몇개의 사이트에서 검색된다. 이용하기는 이 코드가 훨씬 편할 거 같기는 하다.

원  소스 사이트는 https://jqueryui.com/autocomplete/ 다. 여기서 데모 실행부터 해보면 된다.

이 사이트에 가면 유용한 기능이 많다. 기능 적용이 매우 단순하다.

아래 코드 연결된 버전 정보로 해도 되지만 jqueryui.com 사이트에 적용된 최신버전으로 적용해도 된다.


사용법

1. jquery-ui.min.css, jquery-ui.min.js 링크 추가 또는 파일 다운로드 받아서 폴더 경로 추가

2. <input type='text' name='country' value='' id='auto'> input 에 ID 추가하거나 Class 추가

3. jQuery 코드

$('#auto').autocomplete({ 

source: "autosearch.php", // 타이핑시 보여질 내용

minLength: 1

});

4. PHP 코드 구현(autosearch.php)

<?php
require_once 'sessionChk.php'; // 세션 체크
require_once 'dbconnect.php';

if (isset($_GET['term'])){
    $return_arr = array();

    $keyword = $_GET['term'];
    $sql = "SELECT distinct(userNM) FROM members WHERE userNM LIKE '%".$keyword."%'";
    $result = mysqli_query($db,$sql);
    while($row = mysqli_fetch_assoc($result)){
        array_push($return_arr,$row['userNM']);
    }
    echo json_encode($return_arr);
}
?>



autocomplete-master.zip


<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Demo</title>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/minified/jquery-ui.min.css" type="text/css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script><!-- 최신버전으로 구해서-->
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js"></script>   
<script type="text/javascript">
$(function() {
    //autocomplete
    $(".auto").autocomplete({
        source: "autosearch.php",
        minLength: 1
    });               
});
</script></head>
<body>
    <form action='' method='post'>
        <p><label>Country:</label><input type='text' name='country' value='' class='auto'></p>
    </form>
</body>
</html>


=== autosearch.php ===

이 부분 코드는 내가 사용하는 방식으로 수정했다.

<?php
include_once 'connect.php';

if (isset($_GET['term'])){
    $return_arr = array();

    $keyword = $_GET['term'];
    $sql = "SELECT country_name FROM country WHERE country_name LIKE '%".$keyword."%'";
    $result = mysqli_query($db, $sql);
    while($row = mysqli_fetch_assoc($result)){
        $return_arr[] =  $row['country_name'];
    }
   
    echo json_encode($return_arr);
}
?>


여기서 검색어 결과가 너무 많이 나오는 것이 싫다면 LIMIT 를 사용해서 제한하면 된다.

$sql = "SELECT distinct(country_name) FROM country WHERE country_name LIKE '%".$keyword."%' LIMIT 10";

검색할 내용이 너무 많다면 별도로 검색한 결과를 별도 테이블로 작성해서 그 검색결과를 자동완성 검색어로 불러들려도 된다. 이 경우에는 별도로 코딩이 좀 필요하다.

728x90
블로그 이미지

Link2Me

,
728x90

jsTree 는 MIT 에서 공개한 jquery plugin 으로 HTML 또는 JSON 데이터를 Tree 형식으로 화면에 출력해주는 라이브러리이다.

https://www.jstree.com/ 에서 jquery plugin 설명을 참조한다.

여기서 다루는 jstree.js 는 include 해보니 jstree.min.js 와 약간 다른지 tree 아이콘 모양이 달라서 jstree.min.js 를 사용했다.


본 자료는 구글링을 통해서 얻은 지식으로 기존 자료에 부족한 사항을 추가했다.

기본적인 설명은 http://phpflow.com/php/dynamic-tree-with-jstree-php-and-mysql/ 사이트에 잘 나와있다.

관리자가 메뉴를 추가/수정/삭제하는 기능도 이 사이트에 잘 나와 있다.

다만 아쉬웠던 것은 Treeview 에서 아이템을 클릭하면 해당 ITEM에 연결된 link 를 다른 <div>에 뿌려주는 것이 되어야 Treeview 의 의미가 있으므로 이 부분 처리를 하려고 열심히 검색하고 찾았는데 ....

포기하고 생각을 변경하여 시도를 한 끝에 원하는 결과를 얻었다.

이 과정에서 고수의 도움을 받았는데 알고 보면 생각의 전환만 했어도 쉽게 해결할 수 있었던 사항이다.


=== 테이블 구조 ===

CREATE TABLE IF NOT EXISTS `treeview_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` varchar(11) DEFAULT NULL,
  `name` varchar(200) NOT NULL,
  `text` varchar(200) NOT NULL,
  `link` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;


INSERT INTO `treeview_items` (`id`, `parent_id`, `name`, `text`, `link`) VALUES
(1, '0', 'MySQL', 'MySQL', '#'),
(2, '0', 'Java', 'Java', '#'),
(3, '0', 'PHP', 'PHP', '#'),
(4, '3', '투토리얼', '투토리얼', 'http://link2me.tistory.com'),
(5, '3', 'PHP Script', 'Script', '#'),
(6, '5', '메일', '메일', '#'),
(7, '2', 'Java Tutorial', 'Tutorial', '#'),
(8, '2', 'Java Resources', 'Resources', '#'),
(9, '1', 'MySQL Tutorial', 'Tutorial', '#'),
(10, '5', '로그인', '로그인', 'http://www.naver.com'),
(11, '3', 'PHP Resources', 'Resources', '#'),
(12, '10', 'Login1', 'Login1', ''),
(13, '10', 'Login2', 'Login2', ''),
(14, '3', '추가노드', '추가노드', '');


=== tree.php ===

<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
<link rel="stylesheet" href="js/jstree/style.min.css">
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="js/jstree/jstree.min.js"></script>

<script type="text/javascript">
$(document).ready(function(){
    $('#tree-container').jstree({
        'plugins': ["wholerow"],
        'core' : {
            'data' : {
                "url" : "tree_getdb.php",
                "dataType" : "json"
            }
        }
    }).on("changed.jstree", function (e, data) {
        if(data.selected.length) {
            var id = data.instance.get_node(data.selected[0]).id;
            $.post('tree_link_result.php', {id: id}, function(data){
                //alert(data);
                $('.content').html(data);
            });
        }
    });

});
</script>
</head>
<body>
<div class="container-fluid"><!--container-fluid 클래스 선택자는 전체 화면을 사용할 때 사용 -->
  <div class="container"><!--container 클래스 선택자는 최대 넓이가 1170px -->
    <div class="col-md-2">
      <!--사이드바 내용-->
        <div id="tree-container"></div>
    </div>
    <div class="col-md-10">
        <div class="content">
          <!--본문 내용-->
          본문내용
        </div>
    </div>
  </div>
</div>

</body>
</html>


=== tree_link_result.php ===

<?php
$id=$_POST['id'];
if(isset($id) && !empty($id)){
    include_once "connect.php";
    $sql = "SELECT * FROM treeview_items where id='{$id}'";
    $result = mysqli_query($db, $sql);
    if($row=mysqli_fetch_array($result)){
        echo $row['link'];
    }
}
?>


=== on("changed.jstree", function (e, data) { 부분을 아래와 같이 수정해도 된다.

    }).bind("select_node.jstree", function (e, data) {
        var id = data.node.id;
        $.post('tree_link_result.php', {id: id}, function(data){
            //alert(data);
            if(data == '#') return '';
            $('.content').html(data);
        });


나머지 자료는 phpflow.com 과 인터넷에서 구해서 위에 나온 부분만 수정해서 사용하면 문제없이 처리될 것이다.


구글링해서 구해 테스트한 jstree 소스만 첨부한다.

jstree.zip


728x90
블로그 이미지

Link2Me

,
728x90

PHP 폴더내 파일 개수를 구하는 함수를 만들어보자.


검색해보니

function dirs_chk($dir){
 $dirs=count(scandir($dir)); 
 echo $dirs;
}
$dir = 'uploads/';
echo dirs_chk($dir);

로 하면 파일 개수를 구할 수 있다고 해서 테스트를 해보니 이건 sub 폴더까지 검색하는데 문제는 . 과 .. 까지 카운트를 한다. 그래서 원하는 개수를 정확하게 구할 수가 없다.


http://www.webmadang.net/develop/develop.do?action=read&boardid=1003&page=1&seq=65

에 있는 걸로 테스트를 했더니 제대로 나오는데 경고 메시지가 출력된다.


원하는 사항은 특정 폴더내에서 특정 확장자를 가진 파일의 개수를 반환하고자 한다.

그래서 경고메시지 나오는 부분을 수정했고 특정 확장자만 검사하도록 코드를 추가했다.


<?php
$doc_root = $_SERVER["DOCUMENT_ROOT"]; // Web서버 root directory
$dir=$doc_root.'/fileupload/uploads/';
$dir_count = 0;
$file_count = 0;
$valid_formats = array("jpg", "png", "gif");

// 디렉토리에 있는 파일과 디렉토리의 갯수 구하기
$result = opendir($dir); //opendir 함수를 이용해서 디렉토리의 핸들을 얻어옴
// readdir함수로 지정 디렉토리에 있는 디렉토리와 파일들의 이름을 배열로 읽어들임
while($file = readdir($result)) {
    if($file === "."|| $file === "..") continue; // file명이 ".", ".." 이면 무시함
    $getExt = pathinfo($file, PATHINFO_EXTENSION); // 파일의 확장자를 구함

    if(empty($getExt)){
        $dir_count++; // 파일에 확장자가 없으면 디렉토리로 판단하여 dir_count를 증가시킴
    } else {
        if(in_array($getExt, $valid_formats)){
            $file_count++; // 검사조건에 맞는 파일이 있으면 카운트
        }
    }
}

echo"디렉토리 갯수 : ".$dir_count."<br>";
echo"파일의 갯수 : ".$file_count;
?>


이제 다른 곳에서 사용하기 위해서 함수화를 해보자.


// 지정 디렉토리내의 지정 파일 개수 구하기

function getFilesCount_CurDir($dir){
    $dir_count = 0;
    $file_count = 0;
    $valid_formats = array("jpg", "png", "gif"); // 그림 확장자 지정
   
    // 디렉토리에 있는 파일과 디렉토리의 갯수 구하기
    $result = opendir($dir); //opendir 함수를 이용해서 디렉토리의 핸들을 얻어옴
    // readdir함수를 이용해서 디렉토리에 있는 디렉토리와 파일들의 이름을 배열로 읽어들임
    while($file = readdir($result)) {
        if($file === "."|| $file === "..") continue; // file명이 ".", ".." 이면 무시함
        $getExt = pathinfo($file, PATHINFO_EXTENSION); // 파일의 확장자를 구함

        if(!empty($getExt)){
            if(in_array($getExt, $valid_formats)){
                $file_count++; // 검사조건에 맞는 파일이 있으면 카운트
            }
        }
    }
    return $file_count;
}


728x90
블로그 이미지

Link2Me

,
728x90

jQuery ajax 를 사용하지 않는 jQuery 를 http://link2me.tistory.com/1142 에서 다루었다.


=== fileupload.js ===

$(document).ready(function() {
    $('#form').submit(function(){
        var
upfiles_cnt = $("input:file", this)[0].files.length;
        if(
upfiles_cnt == 0){
            alert('선택한 파일이 없습니다');
            return false; // form을 전송시키지 않고 반환
        }
    });
});

ajax 방식을 사용한 jQuery 를 구현해보자.

파일 업로드 현황을 progress bar 로 구현하려고 구글링을 하면서 개념 이해 및 테스트 중이다.

ajax 로 파일 전송시 현재 업로드한 파일 숫자가 0 인지 체크 로직을 추가하여 처리하도록 구현했다.

구글링을 해서 이 방법 저 방법 테스트를 해보니 formData 부분에서 에러가 발생하더라.


=== fileupload.js ===

$(document).ready(function() {

    $('#form').submit(function(e){
        //disable the default form submission
        e.preventDefault();

        //grab all form data <== 필요에 따라 코드 수정해서 사용해야 함.
        var form = $('form')[0];
        var formData = new FormData(form);


        var upfiles_cnt = $("input:file", this)[0].files.length;
        if(upfiles_cnt == 0){
            alert('선택한 파일이 없습니다');
            return false; // form을 전송시키지 않고 반환
        }


        $.ajax({
            url: "fileupload.php",
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            dataType: "json",
            success: function (data) {
                $('.status').html(data + ' Files uploaded!').fadeIn();
            },
            error: function(){
                alert("error in ajax form submission");
            }
        });

        return false;
    });

});



Upload Progress bar 검색해보면 대부분 아래 코드와 유사한 것이 검색된다.

그런데 이코드를 수정해서 Upload 파일 갯수가 0이면 진행이 안되게 하려고 테스트 하니 잘 안된다.


=== fileupload.js ===
$(document).ready(function() {

    $('form').ajaxForm({
        /* set data type json */
        dataType:  'json',

        /* reset before submitting */
        beforeSend: function() {
            status.fadeOut();
            bar.width('0%');
            percent.html('0%');
        },

        /* progress bar call back*/
        uploadProgress: function(event, position, total, percentComplete) {
            var pVel = percentComplete + '%';
            bar.width(pVel);
            percent.html(pVel);
        },

        /* complete call back */
        complete: function(data) {
            status.html(data.responseJSON.count + ' Files uploaded!').fadeIn();
        }
    });
});



http://phppot.com/jquery/jquery-progress-bar-for-php-ajax-file-upload/ 사이트를 발견하고 이걸 참조하여 구현했더니 원하는 결과가 나온다.


아래 코드는 에러 없이 정상 동작한다.

//grab all form data
var form = $('form')[0];
var formData = new FormData(form);


그런데 파일 전송시

<input type="hidden" name="uid" value="">

<input type="file" id="file" name="file" multiple />

와 같이 이미지 파일 외에 uid 값까지 같이 전송되도록 하려니까 잘 전송이 안된다.


var formData = new FormData();
var files = $('#file')[0].files[0];
formData.append('file',files);
formData.append('uid',idx);

와 같이 해주고 나서 정상적으로 전송이 된다.


=== fileupload.js ===
$(document).ready(function() {

    $('#form').submit(function(e){
        //disable the actual submit of the form.
        e.preventDefault();
       
        //grab all form data
        var form = $('form')[0];
        var formData = new FormData(form);

        var upfiles_cnt = $("input:file", this)[0].files.length;
        if(upfiles_cnt == 0){
            alert('선택한 파일이 없습니다');
            return false; // form을 전송시키지 않고 반환
        }

        $(this).ajaxSubmit({
            // set data type json
            dataType:  'json',

            // reset before submitting
            beforeSend: function() {
                status.fadeOut();
                bar.width('0%');
                percent.html('0%');
            },

            // progress bar call back
            uploadProgress: function(event, position, total, percentComplete) {
                var pVel = percentComplete + '%';
                bar.width(pVel);
                percent.html(pVel);
            },

            complete: function(data) {
                status.html(data.responseJSON.count + ' Files uploaded!').fadeIn();
            },
            resetForm: true
        });
        return false;
    });
});



progress bar 가 나오는 ajax 방법으로 구현해보려고 시도하면서 검색/테스트 많이 했다.

나와 같은 jQuery 초보자를 위해서 고생하지 말라고 테스트한 파일을 첨부합니다.


fileupload_ajax.zip



도움되셨다면 공감 눌러주시거나 00 00 한번 해주시길

728x90
블로그 이미지

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.

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


728x90
블로그 이미지

Link2Me

,
728x90

파일 업로드 관련으로 Javascript 와 jQuery 를 검색하고 필요한 것을 추가/수정해서 작성했다.

파일 중복 체크를 안하려고 파일명을 rename 처리했다.

$rename = md5(uniqid($tmpname)) .round(microtime(true)).'.'.$fileExt;


파일 테스트 환경 : Windows10 AutoSet9, Linux CentOS 6.5


테스트에 사용한 첨부파일

fileupload-01.zip



=== fileform.php ===

<!DOCTYPE html>
<html>
<head>
<title>Multiple File Upload with PHP</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/pure-min.css">
<link rel="stylesheet" type="text/css" href="css/fileupload.css">
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- javascript dependencies -->
<script type="text/javascript" src="js/jquery.form.min.js"></script>
<!-- main script -->
<script type="text/javascript" src="js/fileupload.js"></script>
<script type="text/javascript">
    function viewFileList() {
        var input = document.getElementById("files");
        var ul = document.getElementById("fileList");
        while (ul.hasChildNodes()) {
            ul.removeChild(ul.firstChild);
        }
        for (var i = 0; i < input.files.length; i++) {
            var li = document.createElement("li");
            li.innerHTML = input.files[i].name;
            ul.appendChild(li);
        }
        if(!ul.hasChildNodes()) {
            var li = document.createElement("li");
            li.innerHTML = 'No Files Selected';
            ul.appendChild(li);
        }
    }
</script>
</head>
<body>
<div class="container">
    <div class="status"></div>
    <form id="form" action="fileupload.php" method="post" enctype="multipart/form-data" >
        <input type="file" id="files" name="files[]" multiple="multiple" onChange="viewFileList();" />
        <input type="submit" value="Upload" class="pure-button" />
    </form>
    <ul id="fileList"><li>No Files Selected</li></ul>
    <div class="progress">
        <div class="bar"></div>
        <div class="percent">0%</div>
    </div>

</div><!-- end .container -->

</body>
</html>


=== fileupload.js ===

$(document).ready(function() {
    $('#form').submit(function(){
        var numFiles = $("input:file", this)[0].files.length;
        if(numFiles == 0){
            alert('선택된 파일이 없습니다');
            return false; // form을 전송시키지 않고 반환
        }
    });
});


=== fileupload.php ===

<?php
// Edit upload location here
$valid_formats = array("jpg", "png", "gif", "bmp");
$max_file_size = 1024*100; //100 kb
$upload_path='uploads/';
$count = 0;
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
    foreach ($_FILES['files']['name'] as $i => $name) {
        if ($_FILES['files']['error'][$i] == 4) { // 파일이 전송되지 않았습니다
            continue;
        }
        if ($_FILES['files']['error'][$i] == 0) { // 오류 없이 파일 업로드 성공
            if ($_FILES['files']['size'][$i] > $max_file_size) {
                $message[] = "$name is too large!.";
                continue;
            }elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
                $message[] = "$name 은 허용된 파일 포멧이 아닙니다";
                continue;
            }else{ // 에러가 없으면
                $tmpname = $_FILES['files']['tmp_name'][$i];
                $realname = $_FILES['files']['name'][$i];
                $filesize = $_FILES['files']['size'][$i];
                $fileExt = getExt($realname);
                $rename = md5(uniqid($tmpname)) .round(microtime(true)).'.'.$fileExt;
                $uploadFile = $upload_path . $rename;
                if(move_uploaded_file($tmpname, $uploadFile)){
                    @chmod($readFile,0606);

                    // DB 테이블에 저장하는 루틴은 여기에 추가하면 된다.

                    $count++; // 업로드 성공한 파일 숫자
                }
            }
        }
    }
}

echo $count;
?>

<script type="text/javascript">
var count ='<?php echo $count;?>';
alert('업로드 성공 파일수 : ' + count );
setTimeout(function() {
    window.location.replace("fileform.php");
}, 1000);
</script>

<?php
// 확장자 추출 함수
function getExt($filename){
    $ext = substr(strrchr($filename,"."),1);
    $ext = strtolower($ext);
    return $ext;
}
?>



파일 업로드 / 다운로드 취약점
- 업로드 기능에서 파일 사이즈의 제한을 주지 않을 경우
- 파일 타입의 체크가 없는 경우
- 파일이 업로드 되는 경로가 외부에서 직접적으로 접근 가능하거나 실행 권한을 가지게 되는 경우


파일 업로드할 때 @chmod($readFile,0606); 를 하는 이유를 좀 더 알고자 한다면

http://www.macinstruct.com/node/415 에 나오는 그림을 보면 도움된다.

업로드라 함은 파일을 서버에 쓰는(write)하는 것이다.

그러므로 파일을 read(4) + write(2) 권한만 부여하면 된다. 파일을 실행할 수 있게 하면 보안상에 문제가 될 수도 있다. 그래서 업로드한 파일을 읽기와 쓰기 권한만 부여했다.


보안을 위해서 몇가지 더 권고하는 걸 적어둔다.

- 업로드한 파일을 외부에서 접근할 수 없는 경로에 저장한다.

  즉 Web 서버 URL 밖에다가 저장하도록 하는 것이 좋다.

- 업로드한 파일에 대한 웹서버의 실행권한을 제거하고 저장한다.

- 업로드한 파일의 저장 경로와 파일명을 외부에서 알 수 없도록 한다.

  실제 저장되는 파일명은 난수를 이용해 유추 불가능하도록 생성하여 외부로부터 직접적인 접근이 불가능하게 구현한다.

  업로드한 파일을 위한 전용 디렉토리를 생성하여 실행권한을 제거한다.


참고

파일 업로드에 대한 개념 설명이 잘된 URL

http://blog.habonyphp.com/entry/php-POST-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C#.WHWm81z3TFA


728x90
블로그 이미지

Link2Me

,
728x90

jQuery 팝업창에서 부모창으로 값을 전달해야 할 때 사용하는 방법이다.


=== 부모창 ===

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script language='javascript'>
$(document).ready(function() {
    $('#pay').submit(function() {
        window.open('', 'payviewer', 'width=400,height=400,resizeable,scrollbars');
        this.action = 'popup.php';
        this.method = 'POST';
        this.target = 'payviewer';
    });
});
</script>

<form id="pay" >
    <input type="hidden" name="var" value="POST DATA SENT">
    <input type="text" name="name" id="name" value="홍길동">
    <input type="submit" value="결제하기">
</form>


=== 자식창 : popup.php ===

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script language='javascript'>
$(document).ready(function() {
    $('#payreturn').submit(function() {
        var name = $("input[name='name']").val(); // 현재 폼의 입력값
        $("input[name='name']",opener.document).val(name); // 값 전달 방식 1
        //$(opener.document).find("#name").val(name); // 값 전달 방식 2

        //$("#name",opener.document).val(name); // 값 전달방식 3
        window.self.close(); // 현재 팝업 닫기
    });
});
</script>

<p><?php echo($_POST['var']); ?></p>
<form id="payreturn" >
    <input type="text" name="name" value="<?php echo($_POST['name']); ?>">
    <input type="submit" value="확인">
</form>


위 샘플코드의 파일

popup.zip



$("input[name='name']",opener.document).val(name);는 부모창의 id를 지정하지 않았어도 값을 변경할 수 있다.

$(opener.document).find("#name").val(name); 는 부모창의 id를 직접 찾아서 값을 변경한다.


jQuery 자식 팝업 창에서 부모창 컨트롤
$(opener.document).find("#Form").attr("action","index.do").submit();

// 팝업창에서 부모창 함수 호출

opener.location.href="javascript:fun();"; //일반적인 방법

$(opener.location).attr("href","javascript:부모스크립트함수명();"); //jQuery 이용
$(opener.location).attr("href","javascript:fun();"); //jQuery 이용


// 부모창의 필드값 가져오기

1. 일반적인 방법
var parentValue = opener.document.getElementById("parentId").value;
2. jQuery를 이용한 방법
$("#parentId", opener.document).val();
3. find를 이용한 방법
$(opener.document).find("#parentId").val();


//팝업창에서 부모창 새로고침(새로고침 의사 표현을 묻는 창이 뜸)
window.opener.parent.location.reload();
window.opener.document.location.reload();


// 작은 윈도우 창을 열어서(window.open) 특정 작업을 처리한 후 부모창(opener)을 refresh하는 방법

// window.opener.location.reload(); 에서 window는 생략 가능

<script>
opener.location.reload();
window.close();
</script>


//팝업창 자신 페이지 새로고침
document.location.reload();

//팝업창 닫기
window.self.close();


// 부모창의 URL을 대체시킨다.

opener.location.replace("URL정보");


// 전체 창에서 새 페이지 열기

top.location.href="abc.php";


// 연 창의 URL 이동

opener.location.href="abc.php";


<script type="text/javascript">
  alert("회원가입을 하시겠습니까?")
  location.href= "member.php"
</script>


728x90
블로그 이미지

Link2Me

,
728x90

form 데이터를 window 팝업창으로 값을 전달하여 open 해야 할 필요가 있을 때 사용하는 방법이다.


<form action="popup.php" method="post" target="payviewer" onsubmit="window.open('popup.php', 'payviewer', 'width=200, height=200,resizeable,scrollbars');">
    <input type="hidden" name="var" value="POST DATA SENT">
    <input type="submit" value="결제하기" >
</form>


=== popup.php ===

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Receiver popup</title>
</head>
<body>
<p><?php echo($_POST['var']); ?></p>
</body>
</html>


위와 같은 방법을 jQuery 로 전달하는 방법이다.

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<script language='javascript'>
$(document).ready(function() {
    $('#pay').submit(function() {
        window.open('', 'payviewer', 'width=200,height=200,resizeable,scrollbars');
        this.target = 'payviewer';
    });
});
</script>

<form id="pay" action="popup.php" method="post" >
    <input type="hidden" name="var" value="POST DATA SENT">
    <input type="submit" value="결제하기">
</form>


이걸 더 수정해보자.

바로 위 코드와 아래 코드가 어떻게 다른지 확인이 될 것이다.

정보를 어떻게 전달하는지를 알 수 있다.


<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<script language='javascript'>
$(document).ready(function() {
    $('#pay').submit(function() {
        window.open('', 'payviewer', 'width=200,height=200,resizeable,scrollbars');
        this.action = 'popup.php';
        this.method = 'POST';
        this.target = 'payviewer';
    });
});
</script>

<form id="pay" >
    <input type="hidden" name="var" value="POST DATA SENT">
    <input type="submit" value="결제하기">
</form>




728x90
블로그 이미지

Link2Me

,
728x90

화면(page)을 주기적으로 자동 갱신해야 하는 경우가 있다.

아래 코드는 real time update 보다는 일정한 주기로 업데이트 처리하도록 했다.

갱신 주기를 짧게 하면 실시간 업데이트가 된다.

서버에서 데이터를 가져와야 하는 경우에 너무 빠른 갱신 주기는 부하를 야기할 수 있으므로 주의가 필요할 수도 있다.

구글링을 해서 실제 데이타가 맞는지 확인하면 맞지 않은 경우도 있다.

그래서 반드시 샘플 데이터를 만들고 직접 테스트를 해보고 동작 여부를 확인하고 코드를 적어둔다.


<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<link rel="stylesheet" type="text/css" href="css/table.css" />
<script type="text/javascript" src="//code.jquery.com/jquery.min.js"></script>
<!-- 자동 갱신 스크립트 include -->
<script>
var timerID;

$(document).ready(function () {
    $('#execute').on('click',function(e){
        e.preventDefault();
        updateData();
    });
    $('#stop').on('click',function(e){
        e.preventDefault();
        clearTimeout(timerID); // 타이머 중지
        $('#showtime').html('');
    });   

});

function updateData(){
    $.ajax({
      url: "getserver.php",
      type:"post",
      cache : false,
      success: function(data){ // getserver.php 파일에서 echo 결과값이 data 임
       $('#showtime').html(data);
      }
    });
    timerID = setTimeout("updateData()", 2000); // 2초 단위로 갱신 처리
}
</script>

</head>

<body>
<p>time : <span id="
showtime"></span></p>
<input type="button" id="execute" value="실행" />
<input type="button" id="stop" value="중지" />
</body>
</html>


==== getserver.php ===
<?php
$time = date("H:m:s");
echo $time;
?>


ajax 는 비동기 Javascript 와 XML를 말한다.

ajax 를 사용하면 페이지 이동 없이 전체 HTML 이 아닌, XML 이나 JSON형식으로 구성된 새로운 데이터를 XMLHttpRequest 객체를 통해 받아온다.

728x90
블로그 이미지

Link2Me

,
728x90

MySQL DB와의 연동하여 통계 그래프를 작성하는 샘플이다.

100% PHP 코드함수까지 오픈하지 않는다. 하지만 핵심적으로 알아야 할 내용은 모두 작성했다.

var line1 = [<?php echo $data;?>];  PHP 문자열을 이렇게 대입해주면 자바스크립트에서 배열 변수로 인식하기 때문에 ajax response 메시지 값도 [jsonObj.data] 로 해주면 되는줄 알고 alert 창으로 확인하면서 시간낭비를 많이 했다. alert 창 메시지를 육안으로 확인하면 PHP 변수를 배열화한 것과 다를바가 없었다. typeof 를 찍어보고 나서 문제가 뭔지 찾아내고 바로 해결했다. 기초가 약해서 발생한 문제였다.


<?php
require_once 'connect.php'; // db접속 성공
require_once 'phpclass/statsClass.php'; // 통계 클래스
$b = new statsClass;
$R = $b->extract_YM(); // DB에서 년월 추출

$ym = date("Ym"); // 현재 년월

$ticks = $b->maxday_YM($ym);  // X축 좌표 값
$data = $b->dailyCnt_value($ym);  // 막대그래프 값
?>
<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- http://www.jqplot.com 제공 자바스크립트 include -->
<script type="text/javascript" src="./plugin/jqplot/jquery.jqplot.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.barRenderer.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.pointLabels.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.canvasAxisTickRenderer.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.categoryAxisRenderer.js"></script>
<link rel="stylesheet" type="text/css" href="./plugin/jqplot/jquery.jqplot.css" />
<script type="text/javascript">
$(document).ready(function(){
    var plot1;
    var line1 = [<?php echo $data;?>];
    //var line2 = [10, 8, 22, 15, 10];  // 막대그래프를 2개 그리고자 할 경우
    var xAxis = [<?php echo $ticks;?>];

    renderChart(line1,xAxis);

    $('#selectmonth').on('change',function(){
        if(this.value !== ""){
            var optVal=$(this).find(":selected").val();
            //var year = optVal.substr(0,4); // 년
            //var month = optVal.substr(4,2); // 월
            $.post('ajaxdb.php',{optVal:optVal},function(msg){
                //alert(msg); // 배열 형태로 넘어오는지 확인 목적
                var jsonObj = $.parseJSON(msg); // JSON 문자열을 JavaScript object 로 반환
                //alert(typeof jsonObj.data); // string
                data = jsonObj.data.split(','); // 문자열을 배열로 변환
                xAxis = jsonObj.ticks.split(',');
                //alert(typeof data);
                updatePlot(data,xAxis);
            });
        }
    });

});

function renderChart(data,xAxis){
    plot1 = $.jqplot('chartDiv', [data], CreateBarChartOptions(xAxis));
}

function updatePlot(data,xAxis){
    plot1.destroy();
    plot1 = $.jqplot('chartDiv', [data], CreateBarChartOptions(xAxis));
}

function CreateBarChartOptions(xAxis) {
    var optionsObj = {
        title: '일자별 접속 통계',
        seriesDefaults:{
            renderer:$.jqplot.BarRenderer, // 막대 그래프
            rendererOptions: { barWidth: 15 }, // bar의 너비 수동으로 설정
            pointLabels: { show: true } // 레이블 값
        },
        axes: {
            xaxis: {
                renderer: $.jqplot.CategoryAxisRenderer,
                ticks: xAxis,
                tickOptions: {
                    formatString: '%d' // 정수형으로 표시
                }
                //label:'일자'
            }
        },
        highlighter: { show: false }
    };
    return optionsObj;
}

</script>

</head>
<body>
<div id="chartDiv" style="height:300px;width:900px;"></div>
<div style="height:300px;width:890px;margin-top:10px;text-align:right;">
<select name="month" id="selectmonth">
<option value="">년월 선택</option>
<?php
    while ($row = mysqli_fetch_array($R)){
        echo "<option value='".$row[0]."' ";
        echo ">".$row[0]."</option>\n";
    }
?>
</select>
</div>
</body>
</html>


==== ajaxdb.php ====

<?php
if(isset($_POST['optVal'])){
    require_once 'connect.php'; // db접속 성공
    require_once 'phpclass/statsClass.php'; // 통계 클래스
    $b = new statsClass;
    $ym = $_POST['optVal'];
    $data = $b->dailyCnt_value($ym); // 문자열로 받음
    $ticks = $b->maxday_YM($ym); // 문자열로 받음
    $R = array('data'=>$data, 'ticks'=>$ticks); // X축 좌표값과 일별 통계 값을 DB에서 추출하여 배열화 처리
    echo json_encode($R);
}
?>


alert(typeof jsonObj.data); 으로 type 을 확인해서 object 인지 string 인지 확인하여 상황에 맞게 변환해서 사용하는케 키포인트다.


json_encode 를 사용하면 배열로 결과를 반환하는 걸 자유자재로 할 수 있다.

어떻게 하는지는 바로 위의 코드를 보면 알 수 있으므로 이걸 본 방문객은 쉽게 해결이 가능하리라 본다.

구글 검색과 jqplot 검색을 하면 그래프 그려주는 js 파일 구조에 대해 파악이 될 것이다.

728x90
블로그 이미지

Link2Me

,
728x90

MySQL DB와의 연동하여 통계 그래프를 작성하는 방법이다.

바로 앞 게시물(http://link2me.tistory.com/1132)과 비교해서 달라진 부분이 어떤 것인지만 비교해보면 된다.

색깔을 표시한 부분을 주의깊게 살펴보면 답은 의외로 간단하다.


<?php
//require_once 'connect.php'; // db접속 성공
//require_once 'phpclass/boardClass.php'; // 게시판 클래스
$line1 ="4,6,2,5";  // DB와 연동한 결과로 문자열을 생성했다고 가정한다.
?>
<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- http://www.jqplot.com 제공 자바스크립트 include -->
<script type="text/javascript" src="./plugin/jqplot/jquery.jqplot.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.barRenderer.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.pointLabels.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.categoryAxisRenderer.js"></script>
<link rel="stylesheet" type="text/css" href="./plugin/jqplot/jquery.jqplot.css" />
<script type="text/javascript">
$(document).ready(function(){
    var line1 = [<?php echo $line1;?>];
    var line2 = [10, 8, 22, 15, 10];
    var ticks = ['닛산', '포르쉐', 'KIA', '현대', '벤츠'];
 
    $('#chart1').jqplot([line1,line2], {
        title:'막대그래프 예제',
        seriesDefaults:{
            renderer:$.jqplot.BarRenderer, // 막대 그래프
            rendererOptions: { barWidth: 25 }, // bar의 너비 수동으로 설정
            pointLabels: { show: true, formatString: '%d' } // 레이블 값
        },
        axes:{
            xaxis:{
                renderer: $.jqplot.CategoryAxisRenderer,
                ticks: ticks // X축 값
            }
        }
    });
});
</script>

</head>
<body>
<div id="chart1" style="height:300px;width:600px; "></div>
</body>
</html>


다음 기회에 월을 선택하면 일별 막대그래프를 자동으로 그려주는 통계에 대한 PHP코드를 작성해볼 생각이다.

로직은 년월에 대한 값을 DB에서 자동으로 선택해서 selectbox에 표시하고 선택한 년월 정보로 통계그래프가 표시되도록 하면 된다.

- DB에서 년월에 대한 값을 중복없이 뽑아낸다.

- 년월을 선택하면 마지막 일자의 값을 자동으로 추출해서 문자열을 생성한다.

- jQuery change 로 해당 값이 변동되면 그래프를 그리도록 한다.

728x90
블로그 이미지

Link2Me

,
728x90

시각적으로 통계 결과를 화면에 보여주는 걸 구현할 때 jqplot 플러그인을 이용하면 쉽게 챠트를 그릴 수 있다.


위와 같은 막대 그래프로 통계 결과를 보여주고자 한다면 어떻게 해야 할까?


1. http://www.jqplot.com 사이트에서 플러그인 파일을 다운로드하여 서버에 설치한다.

   현재 기준 최신버전은 jquery.jqplot.1.0.9.d96a669.zip 이다.

   이 사이트를 알게 된 것은 2년전에 전문 개발자를 통해 알았는데 jQuery를 배우니 쉽게 활용이 가능하다.


2. 다운로드한 파일에 usage.txt 파일에 사용법이 나온다.

    그리고 웹사이트 Examples 에도 다양한 형태의 예제 파일이 있다.

    하지만 설명이 잘 이해되지 않을 수도 있다.


3. 간략하게 예제를 살펴보자.

    예제는 DB와의 연동까지는 고려하지 않은 1단계라고 보면 된다.

    필요한 플러그인 js 파일이 있는 경로명을 제대로 표시해주어야 그래프가 그려진다.

    - 변수 line1 과 line2 두개를 표시하고자 할 경우이며, 1개만 표시하고 싶으면 line1 만 적어준다.

    - 변수 ticks 는 X 좌표에 해당되는 값을 표시

    - title : 상단 제목


<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- http://www.jqplot.com 제공 자바스크립트 include -->
<script type="text/javascript" src="./plugin/jqplot/jquery.jqplot.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.barRenderer.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.pointLabels.js"></script>
<script type="text/javascript" src="./plugin/jqplot/plugins/jqplot.categoryAxisRenderer.js"></script>
<link rel="stylesheet" type="text/css" href="./plugin/jqplot/jquery.jqplot.css" />
<script type="text/javascript">
$(document).ready(function(){
    var line1 = [4, 6, 2, 5];
    var line2 = [10, 8, 22, 15, 10];
    var ticks = ['닛산', '포르쉐', 'KIA', '현대', '벤츠'];
 
    $('#chart1').jqplot([line1,line2], {
        title:'막대그래프 예제',
        seriesDefaults:{
            renderer:$.jqplot.BarRenderer,
            rendererOptions: { barWidth: 25 },
            pointLabels: { show: true, formatString: '%d' }
        },
        axes:{
            xaxis:{
                renderer: $.jqplot.CategoryAxisRenderer,
                ticks: ticks
            }
        }
    });
});
</script>

</head>
<body>
<div id="chart1" style="height:300px;width:600px; "></div>
</body>
</html>


보는 바와 같이 코드는 정말 심플하다.


변수 값을 PHP 와 연동하여 처리하는 것은 다음에 기술할 예정이다.

통계 그래프에 직접 변수를 지정해주는 경우는 거의 없을 것이고, DB와 연동하여 실시간처리가 되도록 해야 의미가 있을 것이다.


설명이 잘된 사이트가 있어서 링크를 걸어둔다.

http://wickedmagic.tistory.com/525


jqplot.com 사이트에서 영문으로 된 자료를 가지고 약간만 테스트를 하면서 본인이 원하는 스타일로 구현하면 된다. 그리고 좀 더 세부적인 내용을 알고자 한다면 구글에서 jqplot bar width example 와 같은 검색어를 입력하면 원하는 자료를 쉽게 찾을 수 있다.

http://www.jqplot.com/docs/files/plugins/jqplot-barRenderer-js.html 에도 옵션에 대한 설명이 나온다.

728x90
블로그 이미지

Link2Me

,
728x90

MP3 Player jQuery 화면 만들기 예제를 적어둔다.

실제 사용은 안하고 있으나, 화면 생성에 대한 사항을 사용할 일이 있을때 참고하려고 적어둔다.

좋은 MP3 플레이어 jQuery 는 http://www.wimpyplayer.com/ 다.


<div id="mp3playerdiv"></div>
<!--플레이어-->
<div class="player">
<div class="player_bg"><!--tmp--></div>
<div class="player_area" id="tubeplayer"></div>
</div>
<!--플레이어-->

<script type="text/javascript">
//<![CDATA[
   //플레이어
   $('.simbol a').click(function(e) {
   e.preventDefault();
   $(".player").fadeIn();
  
     $("#tubeplayer").append('<iframe width="400" height="80" src="<?php echo $g['dir_module_skin']?>movie/demo/movie.php?file='+this.id+'" frameborder="0" scrolling="no" allowfullscreen></iframe>');
  
      var temp = $('.player_area');
   
       if (temp.outerHeight() < $(document).height() ) temp.css('margin-top', '-'+temp.outerHeight()/2+'px');
       else temp.css('top', '0px');
       if (temp.outerWidth() < $(document).width() ) temp.css('margin-left', '-'+temp.outerWidth()/2+'px');
       else temp.css('left', '0px');

      $(".player .player_bg").on("click", function() {
      $(".player").fadeOut();
      $("#tubeplayer iframe").remove();
    });
           
      //키보드 esc
      $(document).bind('keydown', function(e) {
        if (e.which == 27) {
        $(".player").fadeOut();
        $("#tubeplayer iframe").remove();
        }
      });

    });
    //플레이어

//]]>
</script>

728x90
블로그 이미지

Link2Me

,
728x90

PHP를 배울 때 가장 먼저 알아야 할 사항이 디버깅 요령인데 독학으로 배워 게시글 기록을 보면 순서없이 중구난방이다.

최근에서야 디버깅을 이렇게 하면 도움이 되겠다 싶은 걸 적어본다.

 

변수지정 기초지식 : http://link2me.tistory.com/523 참조

 

파일 A에서 파일 B로 데이터를 넘길 때 파일 B에서 확인하는 방법이다. (의미를 모르면 http://link2me.tistory.com/1110 부터 읽어라)

 

파일A에서 form 으로 넘긴 변수(method="post")가 제대로 잘 넘어오는지 확인하는 방법

- 파일 A란?  PHP Form, Android, C# 등 값을 POST (또는 GET) 방식으로 넘기는 코드를 의미함.

 

<?php
var_dump($_POST); // var_dump 또는 print_r 둘 중에 하나를 선택해서 확인하라.

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

출처: https://link2me.tistory.com/1130 [소소한 일상 및 업무TIP 다루기]

echo '<pre>';print_r($_POST);echo '</pre>'; // 가독성이 좋게 하려면 print_r 과 pre 태그를 사용하면 된다.

exit; // 이 명령어 다음에 적힌 코드들은 실행하지 말고 빠져나가라.

       // 변수가 넘어오는지 테스트 목적이므로 아래 코드 실행 방지 목적
?>

로 하면 배열로 넘어온 값을 확인할 수 있다.

print_r() : 변수 정보를 알기 쉬운 형식으로 출력한다.

var_dump() : 기본적으로 print_r()함수와 같지만 데이터 유형 등 출력되는 정보가 많다.

var_export() : 그대로 PHP 스크립트로서 해석할 수 있는 형식으로 출력한다.

 

직접 테스트해 보고자 한다면 로그인 폼 전송예제 http://link2me.tistory.com/1479 에서 파일을 받으면 된다.

 

코드 작성시 체크 포인트

<?php
// 에러 메시지를 찾고자 할 때 추가할 코드 (개발 시에는 반드시 아래 3줄을 추가해서 하라)

ini_set("display_startup_errors", 1);
ini_set("display_errors", 1);
error_reporting(E_ALL);

// 운용 모드에서는

// error_reporting(0); // 모든 오류를 표시하지 않는다.
if(isset($_POST) && $_SERVER['REQUEST_METHOD'] == "POST"){ // 반드시 이 한줄을 넣어라.

    // 보안에 안전하려면
    // POST 방식으로 보낸 데이터가 있는지 체크
    echo '<pre>';print_r($_POST);echo '</pre>';
}

?>



<?php
// 보안을 고려한 코드 작성시 (보통은 php.ini 에 해당항목을 수정한다)

ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_startup_errors', 'Off');
ini_set('display_errors', 'Off');

ini_set('log_errors', 'On');
?>
Notice: Undefined index: 라고 경고메시지가 뜨는 것이 싫을 경우에는

코드 상단에 error_reporting(E_ALL ^ E_NOTICE); 를 추가해주면 된다.
error_reporting(0); // 모든 오류를 표시하지 않는다. (운용환경에서는 이걸 사용하라)

하지만 개발을 할 때에는 경고 메시지도 모두 출력되도록 하여 에러를 완전히 잡는 것이 중요하다.
 //페이지 변수 설정
$page = isset($_GET['page'])? trim($_GET['page']) : 1;
파일 B에서 코드 구현시 파일 A에서 값이 넘어오지 않을 때에도 동작되도록 코드를 구현해야 할 경우가 있다.
이런 상황에서 삼항연산자로 간단하게 했더니 경고 메시지가 출력된다.
Notice: Undefined variable:

$ym=$_GET['ym'] ? $_GET['ym'] : date("Ym"); //현재 년월
 
이걸 정확하게
if(isset($_GET['ym'])){
    $ym = $_GET['ym'];
} else {
    $ym = date("Ym");
}
로 수정해줘야 경고메시지가 없어진다는 걸 확인했다.

 
결국 isset 으로 변수 설정 유무 검사를 추가해야만 경고 메시지가 없어진다.

$ym=isset($_GET['ym']) ? $_GET['ym'] : date("Ym"); //현재 년월
잘 만들어진 빌더를 분석하다보면 isset 처리를 하지 않아 경고메시지가 출력되는 걸 종종 발견하게 된다.

기존 코드를 유지보수 하다가 수정한 것이 있어서 http://link2me.tistory.com/1085 에 적어둔게 있다.

 

경고메시지를 php.ini 파일을 수정해서 나오지 않도록 하는 방법을 알아보자.

error_reporting 키워드를 검색어로 찾아서 아래와 같이 수정한다.

 

error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
- E_DEPRECATED : 향후 PHP 버전에서 동작을 하지 않을 수도 있는 코드에 대해서 로그를 발생 시킨다
- E_NOTICE : 초기화 되지 않은 변수를 사용했을 때 에러 로그를 생성한다.

 

php.ini 파일을 수정했으면 아파치를 재시작하면 변경한 내용으로 적용된다.

php.ini 에 추가하면 에러 버그를 못잡을 수도 있으니 해당 파일 상단에 아래와 같이 처리하는 걸 권장한다.

 

완벽하게 코드를 만드는 습관을 들이는게 중요하다.
사소한 것을 하나씩 무시하다보면 중요한 곳에서 버그가 생길 수 있다.

mysqli_query 에 에러가 발생할 경우 아래와 같이 원인을 찾을 수 있게 코딩하는 것도 좋다.

 

<?php
$sql = "SQL statement here";
$result = mysqli_query($dbconn,$sql) or trigger_error("SQL: $sql - Error: ".mysqli_error(), E_USER_ERROR);
?>

 

SQL 문이 정상적으로 잘 생성되었는지 여부를 확인할 수 있게 echo 문으로 출력해보는 것도 필요하다.

결국 PHP구문을 통해서 생성한 SQL 문이 DB에 저장되도록 하는 것이기 때문이다.

echo $sql; 로 생성된 SQL 구문을 직접 DB에 넣었을 때 에러없이 잘 들어가면 SQL문은 에러가 없다는 뜻이다.

SQL문에서 에러가 생기는 경우도 종종있다. 문법이 잘못되었거나, 오타가 있거나 등등...

//DB데이터 ARRAY -> 테이블에 출력할 데이터 배열
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:'');
    echo $sql; // SQL 문이 정상적으로 실행되는지 여부 파악 목적
    if($result = mysqli_query($this->db,$sql)){
        return $result;
    }
}
 

echo $sql; 출력으로 웹 브라우저 화면상에서 나온 SQL 문을 직접 DB에서 쿼리해보는 것이 가장 좋은 해결 방법이다.

link2me.tistory.com/1917 은 phpMyAdmin 인데 phpMyAdmin 은 잘 다루면 엄청 편리하고, 보안을 신경써야 한다.

 

 

MySQLi 절치지향 방식으로 만든 함수를 PDO 함수로 컨버팅하면서 함수 이상 유무를 확인하는 과정에서 아래와 같이 테스트를 했다.

함수의 결과가 배열일 수도 있고 그냥 String 일 수도 있어서 in_array 함수를 이용하여 배열과 문자열을 구분하여 출력하도록 하면 원하는 결과를 깔끔하게 확인할 수 있다.

 <?php
require_once 'path.php';
require_once $g['path_class'].'dbconnect.php';
require_once $g['path_class'].'adminClass.php';
$a = new adminClass;

$codeID = 4;
$rs = $a->StaffPositionMNCount($codeID);
if(is_array($rst)){
    echo '<pre>';print_r($rs);echo '</pre>';
} else {
    echo $rs;
}
?>

 

 

ajax, jQuery 등을 사용하는 경우 메시지 분석이 어려울 때가 있다.

그래서 echo '<script type="text/javascript">alert("'.$errline.'");</script>'; 로 에러를 확인하지만 문제는 복사가 안된다.

 

echo '<script type="text/javascript">window.prompt("메세지를 복사해주세요", "'.$sql.'");</script>';

로 하면 메시지 복사가 가능해진다.

대부분 에러가 발생하는 원인을 찾으려면 SQL 문을 직접 DB에 입력해보면 에러 메시지가 뭔지 쉽게 확인할 수 있다.

 

 

이제 파일 B 코드 구현 사항이 문제가 없는지 확인하는 방법이다.

즉, Android 와 통신하는데 PHP 코드에는 문제가 없는지 확인하는 방법이라고 봐도 된다.

아래 코드는 로그인 처리하는 파일 B(a.loginChk.php) 코드 예제이다.

초보자의 코드라면 loginClass.php 없이

보통은 여기에서

$sql = "select * from tableName where 조건";

$result=mysqli_query($db,$sql);

$row=mysqli_fetch_array($result);

와 같은 처리를 하는데, 이걸 loginClass Class에 함수로 만들어서 모아둔 것이라고 보면 된다.

 

== 정상적인 코드
<?php
// 파일을 직접 실행하는 비정상적 동작을 방지 하기 위한 목적
if(isset($_POST) && $_SERVER['REQUEST_METHOD'] == "POST"){
    @extract($_POST); // $_POST['loginID'] 라고 쓰지 않고, $loginID 라고 써도 인식되게 함
    if(isset($userID) && !empty($userID) && isset($password) && !empty($password)) {
        include_once 'dbController.php';
        require_once 'loginClass.php';
        $c = new LoginClass();
        $user = $c->getUser($userID, $password);
        if ($user != false) {
            $_SESSION['userID'] = $user['userID'];
            $_SESSION['userNM'] = $user['userNM'];
            $_SESSION['admin'] = $user['admin'];
            echo json_encode(array('result' => '1'));
        } else {
            echo json_encode(array('result' => '0'));
        }
    }else {// 입력받은 데이터에 문제가 있을 경우
        echo json_encode(array('result' => '-2'));
    }
} else { // 비정상적인 접속인 경우
    echo 0; // a.loginChk.php 파일을 직접 실행할 경우에는 화면에 0을 찍어준다.
    exit;
}
?>
== 디버깅 코드
<?php
//if(isset($_POST) && $_SERVER['REQUEST_METHOD'] == "POST"){
    @extract($_POST); // $_POST['loginID'] 라고 쓰지 않고, $loginID 라고 써도 인식되게 함
    // $_POST 변수로 넘어온 값이 라고 가정하고 변수에 값을 직접 넣어서 결과가 정상 반환되는지 확인한다.
    $userID = "jsk005";
    $password = "abc1234";
    if(isset($userID) && !empty($userID) && isset($password) && !empty($password)) {
        include_once 'dbController.php';
        require_once 'loginClass.php';
        $c = new LoginClass();
        $user = $c->getUser($userID, $password);
        if ($user != false) {
            $_SESSION['userID'] = $user['userID'];
            $_SESSION['userNM'] = $user['userNM'];
            $_SESSION['admin'] = $user['admin'];
            echo json_encode(array('result' => '1'));
        } else {
            echo json_encode(array('result' => '0'));
        }
    }else {// 입력받은 데이터에 문제가 있을 경우
        echo json_encode(array('result' => '-2'));
    }
/*
} else { // 비정상적인 접속인 경우
    echo 0; // a.loginChk.php 파일을 직접 실행할 경우에는 화면에 0을 찍어준다.
    exit;
}
*/
?>

 

변수가 많을 때에는 직접 변수를 넘겨서 var_dump 로 출력시키고 console.log 로 출력된 메시지를 복사해서 처리하는 방법이 유용할 수 있다.

참조 : https://link2me.tistory.com/2070

 

도움이 되셨다면 00 클릭해 주세요.

728x90
블로그 이미지

Link2Me

,
728x90

자바스크립트의 변수를 PHP 에서 읽을 수 있는 방법

"<script>document.write(p1);</script>"; 를 사용하면 된다.

자바스크립트는 별다른 표시가 없으면 윗줄에서 아래줄로 순차적으로 해석한다.


<script>
var p1 = "success";
</script>

<?php
echo "<script>document.write(p1);</script>";
?>

배열도 1차원으로 나열하더라.

   육안(화면)으로 보이는 것과 웹브라우저 소스보기로 보는 거랑은 결과가 다를 수 있음을 확인해야 한다.


PHP 변수 값을 자바스크립트/jQuery 로 전달하는 방법

전제조건 : 자바스크립트는 순차적으로 읽어들이므로 PHP 코드가 자바스크립트보다 위에 나와야 한다.

<script>
var str = '<?php echo $str;?>';
</script>


※ 자바스크립트에서 PHP 로 변수 넘기기 알아야 할 사항

    - 위에서부터 순차적으로 실행되는 구조하에서 javascript 변수를 PHP에서 읽어내는 것은 가능하다.
      하지만 자바스크립트 함수내에서 PHP 변수로 넘기는 것은 안된다.

    - 자바스크립트에서 결과값으로 얻은 변수를 PHP 다른 파일로 넘기는 것은 ajax를 사용하면 된다.

      하지만, ajax 결과를 다시 PHP 변수로 넘긴다?? 안된다는 걸 명심하자.

      ajax 결과를 가지고 클라이언트 HTML 파일을 업데이트할 수는 있다.

   

내가 제대로 이해 못할 수도 있으니 https://opentutorials.org/module/532/6508 게시글 참조하면 도움 될 수도....



PHP 배열 변수를 자바스크립트 배열로 전달하는 방법

JSON(JavaScript Object Notation)은 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법이다.

자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 가장 적합하다.
왜냐하면 JSON은 문자열 뿐만 아니라 배열(Array), 오브젝트(Object) 등 컴퓨터의 모든 변수 형태를 문자열로 표현할 수 있기 때문이다.
JSON에서 표현할 수 있는 데이터 형식으로는 다음과 같은 것들이 있다.
- String (문자열): 큰 따옴표로 묶어 표현, ex) "link2me"
- Number (숫자): 숫자 표현, ex) 1234
- Array (배열): 대괄호로 묶어 표현, ex) [ 'a', 'b', 'c' ]
- Object (객체): 중괄호로 묶어 표현, ex) { key:'value',key2:'value2' }
- Boolean (참/거짓): TRUE 또는 FALSE, ex) true, false
- Null

json_encode 함수를 사용하면 1차원 배열이든 2차원 배열이든 간단하게 자바스크립트 배열로 만들어 준다.
json 은 UTF-8 로 인코딩되어야 인식된다는 걸 명심하자.

파일 Encoding 이 ANSI 로 되어 있으면 결과값이 출력되지 않는다.


<?php

$_POST = array('1','2','3');

echo json_encode($_POST, JSON_FORCE_OBJECT);

?>

<SCRIPT type="text/javascript">

var aa = <?php echo json_encode($_POST);?>;
alert(aa.subject);
// 연관배열에서 key로 값을 찾아준다. 한글도 잘 인식되더라.
</SCRIPT>


<script type='text/javascript'>
<?php
$php_array = array('aaa','bbb','ccc');
$js_array = json_encode($php_array);
echo "var javascript_array = ". $js_array . ";\n";
?>
</script>


다른 방법은 PHP 배열(1차원)을 문자열로 변환한 다음에 new Array()에 넣으면 1차원 배열은 해결된다.

단순한 값들의 나열이라면 배열 타입으로도 충분하다.

<?php

$_POST = array('1','2','3');

?>

<SCRIPT type="text/javascript">
var aa = new Array("<?=implode("\",\"" , $_POST);?>"); // 배열의 값만 문자열로 저장
</SCRIPT>



String to Array

string(문자열)을 구분자로 구분하여 배열로 저장하여 값을 출력
<?php

$flddata ="uid,ItemName,Price,Quantity";
$data = array();
$data = explode(",", $flddata); // 문자열을 배열로 저장

for($i=0; $i < count($data); $i++) {
      echo $data[$i].'<br />';
}
?>


Array to String

배열(array)을 구분자로 구분하여 문자열(string)로 저장

<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr); // 배열을 문자열로 저장
?>



Array 출력

checkbox 에서 선택한 값을 배열로 담아서 ajax 로 넘길 경우 코드와 PHP 파일을 값을 받아서 처리하는 과정이다.

배열을 분리하여 값을 추출하고자 할 경우에 foreach 문을 사용하면 된다.

$('.chkbox:checked').each(function()  // chkbox 라는 클래스명을 준 경우

$('input:checkbox[name="uid[]"]:checked').each(function()  // inputbox name 을 직접 준 경우


$('.btnbox1').click(function(){
    var chkdata = new Array();
    $("input:checked").each(function() {
        chkdata.push($(this).val());
    });
    if(chkdata.length != 0){
        alert(chkdata);
        $.post('ajax.php',{data:chkdata}, function(response) {
            //alert(response);
        });
    } else {
        alert('선택한 항목이 없습니다.');
    }
});


<?php
if(isset($_POST['data'])){
    foreach($_POST['data'] as $column => $value) {
        echo $value;

        // $value 를 가지고 MySQL DB Delete 수행하는 로직 처리

    }
}
?>



728x90
블로그 이미지

Link2Me

,