PHP 배열로 넘겨주는 함수에 따라서 처리를 다르게 해야 동작된다는 걸 확인하고 코드를 다시 적어둔다.


http://link2me.tistory.com/1134 게시글에서 가져오는 함수에서 넘겨주는 값이

문자열로 넘겨줄 경우와 배열로 넘겨줄 경우 각각 상황에 맞게 구현해야 한다.


<?php
require_once 'connect.php'; // db접속 성공
require_once 'statsClass.php'; // 통계 클래스
$b = new statsClass();
$R = $b->extract_YM();
date_default_timezone_set('Asia/Seoul');
if(isset($_GET['ym'])){
    $ym = $_GET['ym'];
} else {
    $ym = date("Ym");
}
$ticks = json_encode($b->maxdate_YM($ym));
$line1 = json_encode($b->dailyCnt_value($ym));
$line2 = json_encode($b->userCnt_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" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- http://www.jqplot.com 제공 자바스크립트 include -->
<script type="text/javascript" src="../js/jqplot/jquery.jqplot.js"></script>
<script type="text/javascript" src="../js/jqplot/plugins/jqplot.barRenderer.js"></script>
<script type="text/javascript" src="../js/jqplot/plugins/jqplot.pointLabels.js"></script>
<script type="text/javascript" src="../js/plugins/jqplot.categoryAxisRenderer.js"></script>
<link rel="stylesheet" type="text/css" href="../js/jqplot/jquery.jqplot.css" />
<script type="text/javascript">
$(document).ready(function(){
    var plot1;

    var obj1 = <?php echo $line1; ?>;
    var line1 = $.map(obj1, function(el) { return el });
    var obj2 = <?php echo $line2; ?>;
    var line2 = $.map(obj2, function(el) { return el });
    var ticks = JSON.parse('<?php echo $ticks; ?>');

    renderChart(line1,line2,ticks);

    $('#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);

            var year = optVal.substr(0,4); // 년
            var month = optVal.substr(4,2); // 월
            $.post('stats_db.php',{optVal:optVal},function(msg){
                //alert(msg); // 배열 형태로 넘어오는지 확인 목적
                var jsonObj = $.parseJSON(msg); // JSON 문자열을 JavaScript object 로 반환
                //alert(typeof jsonObj.ticks);
                //alert(jsonObj.data1);
// string 인지 object 인지 확인 목적
                var data1 = $.map(jsonObj.data1, function(el) { return el });
                var data2 = $.map(jsonObj.data2, function(el) { return el });
                //alert(jsonObj.ticks);
                var xAxis = jsonObj.ticks;
                updatePlot(data1,data2,xAxis);
            });
        }
    });

});


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

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

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

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


=== stats_db.php ===

<?php
if(isset($_POST['optVal'])){
    require_once 'connect.php'; // db접속 성공
    require_once 'statsClass.php'; // 통계 클래스
    $b = new statsClass;
    $ym = $_POST['optVal'];
    $data1 = $b->dailyCnt_value($ym); // 배열로 받은 결과
    $data2 = $b->userCnt_value($ym); // 배열로 받은 결과
    $ticks = $b->maxdate_YM($ym);  // 배열로 받은 결과
    $R = array('data1'=>$data1,'data2'=>$data2, 'ticks'=>$ticks);
    echo json_encode($R);
}
?>

728x90
블로그 이미지

Link2Me

,

Array 변수 처리에 대한 이해가 부족하여 기능 구현보다 변환하는데 시간이 휠씬 더 걸리고 있다.

다 기초가 부족한 탓이다. 테스트한 결과를 무조건 기록해둔다.


PHP 함수에서 return json_encode($R); 배열로 반환 결과가

{"1":"36","2":"23","3":"14","4":"7","5":"12","6":"6","7":"5","8":"9","9":"17","10":"7"}

일 경우


자바스크립트에서 배열 변수로 받기 위해서는

var obj1 = JSON.parse('<?php echo $line1; ?>');

var line1 = new Array();

for(var i in obj1){

    line1.push(obj1[i]);

}

로 하면 값만 추출된 배열변수가 만들어진다.

또다른 방법으로 테스트를 했다.

var obj1 = <?php echo $line1; ?>;

var line1 = $.map(obj1, function(el) { return el });

로 해도 동일한 결과가 나온다.



배열 변환 결과가

[0,1,2,3,4,5,6,7,8,9,10]

로 화면 출력될 경우에는

var ticks = JSON.parse('<?php echo json_encode($ticks); ?>');

또는

var ticks = <?php echo '["' . implode('","', $ticks) . '"]' ?>;

둘 중에 하나를 사용하면 배열 변수가 된다.


PHP 배열로 반환된 결과를

<?php

$Line2 = array();
foreach($line2 as $key => $value){
    array_push($Line2,$value);
}

?>

로 값만 다시 배열로 만든다음에

var line2 = <?php echo '["' . implode('","', $Line2) . '"]' ?>;

로 자바스크립트 배열 변수를 만들 수 있다.


테스트한 파일을 그대로 적어둔다.

<?php
require_once 'connect.php'; // db접속 성공
require_once 'statsClass.php'; // 통계 클래스
$b = new statsClass();
$R = $b->extract_YM();
date_default_timezone_set('Asia/Seoul');
if(isset($_GET['ym'])){
    $ym = $_GET['ym'];
} else {
    $ym = date("Ym");
}
$ticks = $b->maxdate_YM($ym);
$line1 = $b->dailyCnt_value($ym);
$line2 = $b->userCnt_value($ym);
//echo $line1.'<br />';
//echo json_encode($line2).'<br />';
//echo json_encode($ticks).'<br />';
$Line2 = array();
foreach($line2 as $key => $value){
    array_push($Line2,$value);
}
?>
<!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" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<!-- http://www.jqplot.com 제공 자바스크립트 include -->
<script type="text/javascript" src="../js/jqplot/jquery.jqplot.js"></script>
<script type="text/javascript" src="../js/jqplot/plugins/jqplot.barRenderer.js"></script>
<script type="text/javascript" src="../js/jqplot/plugins/jqplot.pointLabels.js"></script>
<script type="text/javascript" src="../js/plugins/jqplot.categoryAxisRenderer.js"></script>
<link rel="stylesheet" type="text/css" href="../js/jqplot/jquery.jqplot.css" />
<script type="text/javascript">
$(document).ready(function(){
    var plot1;
    /*
    var obj1 = JSON.parse('<?php echo $line1; ?>');
    var line1 = new Array();
    for(var i in obj1){
        line1.push(obj1[i]);
    }
    */
    var obj1 = <?php echo $line1; ?>;
    var line1 = $.map(obj1, function(el) { return el });

    //var obj2 = JSON.parse('<?php echo json_encode($line2); ?>');
    /*
    var line2 = new Array();
    for(var i in obj2){
        line2.push(obj2[i]);
    }
    */
    var line2 = <?php echo '["' . implode('","', $Line2) . '"]' ?>;

    //var ticks = JSON.parse('<?php echo json_encode($ticks); ?>');
    var ticks = <?php echo '["' . implode('","', $ticks) . '"]' ?>;

    renderChart(line1,line2,ticks);

    $('#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);
        }
    });

});


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

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

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

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


728x90
블로그 이미지

Link2Me

,

어제 고객사 사이트에 autocomplete 기능을 적용 테스트를 했다.

내가 사용하는 환경인 윈도우10 Explorer 11 에서는 autocomplete 동작이 잘 된다.

하지만 고객사 키맨으로부터 전혀 검색을 할 수가 없어 기존 사용하던 것도 안된다는 민원이 발생해서 환경을 확인해보니 윈도우 7 에 Explorer 버전이라고 나온다. Explorer 세부 버전정보까지는 확인 불가

그래서 결국에

$('#searchValue').autocomplete({
    source: "path/autosearch.php",
    minLength: 1
});

는 주석처리 할 수 밖에 없었다.


// === autosearch.php ====
<?php
require_once "connect.php";

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

    $keyword = $_GET['term'];
    $sql = "SELECT distinct(name) FROM member WHERE name LIKE '%".$keyword."%'";
    $result = mysql_query($sql);
    while($row = mysql_fetch_assoc($result)){
        array_push($return_arr,$row['name']);
    }

    echo json_encode($return_arr);
}
?>


중복없이 이름 검색이 되도록 하기 위해서 distinct 처리를 했다.

원하는 결과가 잘 나옴에도 불구하고 적용은 할 수가 없었다.


http://jqueryui.com/autocomplete/ 에서 샘플로 나온 것이 아래 스크립트를 포함하고 있어서 이걸로 테스트를 했는데 윈도우 10 Firefox 브라우저에서는 잘 되는걸 확인했다.

<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" type="text/css" />
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>


일단 접속하는 브라우저의 정확한 정보부터 수집하는 코드를 구현해야 할 거 같다.

지금은 Chrome,Firefox, Explorer 여부만 수집되는데 버전 정보까지 수집되도록 코드를 세분화해야 할 거 같다.

그래야 새로운 코드 적용시 발생하는 민원을 정확하게 감지할 수 있을 거 같다.


http://www.computerhope.com/issues/ch000604.htm 사이트 자료에 Explorer 세팅 정보를 수정하면 동작되는 것 처럼 되어 있기는 하다.


멀티부팅되는 환경을 만들어서 다양한 접속을 해야만 하나보다.

728x90
블로그 이미지

Link2Me

,

PHP 자료를 검색하다가 알게된 사이트를 적어둔다.

주로 구글 검색을 하기 때문에 알게된 사이트가 대부분 외국 사이트가 많다.


http://www.tutorialrepublic.com/


http://www.w3schools.com/


http://phppot.com


http://www.codexworld.com/


http://webclub.tistory.com : CSS 와 Javascript 내용이 좋다.


생활코딩 PHP 동영상 강좌

https://opentutorials.org/index.php/course/62

https://www.inflearn.com/


코딩의 첫걸음

http://tcpschool.com/


생활코딩 node.js 동영상 강좌

https://opentutorials.org/course/2136


위지윅에디터

- 게시판에서 글쓰기시 HTML, 그림 등을 본문에 쉽게 첨가할 수 있게 해주는 스마트에디터다.

- 이미지 첨부하는 방법을 테스트해봐야 한다.

https://www.tinymce.com/



그래프 그리는 챠트

http://canvasjs.com/javascript-charts/


http://www.jqchart.com/



자바스크립트/jQuery 사이트

Dynamic Web Coding  http://www.dyn-web.com/


jQuery UI : https://jqueryui.com/


모던 웹사이트 디자인의 정석

- 이 사이에 가면 책 예제에 나온 샘플 소스 파일을 받을 수 있다.

- UI 디자인 하는 방법을 체계적으로 설명하고 있다.

http://wikibook.co.kr/modern-web-design-book/


https://w3layouts.com/



PHP to ASP

http://www.me-u.com/php-asp/


PHP framework 사이트

1. KIMSQRB : 클릭 몇번만으로 홈페이지 레이아웃, 게시판을 만들어 주는 빌더

   사용자가 많지 않고, 잘 만들어져서 해킹사례가 없는 거 같다.

   RB 1.2.2 버전과 RB 2.0 버전이 있는데 RB 2.0 버전은 개발이 되다가 중단된 상태(?)이며,

   RB2.0은 HTML5 부트스트랩 기반으로 만들어졌다.

   http://www.kimsq.co.kr/

   http://panocafe.tistory.com/

   http://www.kimsq.co.kr/note/wildnote


2. 그누보드

    https://sir.kr/

   코드 보안패치가 끊임없이 올라오는 홈페이지 빌더

   현재 국내에서 가장 사용자층이 많은 PHP 빌더

   개인적으로 제로보드로 홈페이지를 만들었다가 해킹을 두번이나 당하면서 홈페이지 운영을 중단해야 했던 아픈 경험때문에 해킹에 취약한 빌더는 사용하지 않는다.


3. 코드이그나이터

   http://www.codeigniter.com/

   외국에서 만든 프레임웍인데 아직 사용을 못해봤다.

   회사에서 코드 만들때 이걸 많이 사용한다고 해서 이걸 배워보려고 PHP PDO 관련 지식을 습득하기 위해 온라인 유료강의를 신청해서 수강중이다.

  프레임웍을 만들어보려고 시도해봤는데 정말 많은 지식과 경험이 축적되어야만 만들 수 있겠더라.

  난 초보 수준이니까 그냥 잘 만들어진 빌더 기반으로 필요한 것만 추가해서 사용해야....



유용 블로그

https://javafactory.tistory.com/


ㅇ 파비콘(favicon) 만들어주는 사이트

https://www.favicon-generator.org/

  


728x90

'자료 구하기 > 정보' 카테고리의 다른 글

오픈소스SW 라이선스 LGPL 바로알기  (0) 2018.04.24
Android 추천 사이트  (0) 2017.04.11
C# 추천 사이트  (0) 2016.01.17
부트스트랩 사이트  (2) 2015.08.24
ICT 산업동향 자료  (0) 2014.08.06
블로그 이미지

Link2Me

,

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


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

,