MISTERY

JSON (JavaScript Object Notation) is a convenient, readable and easy to use data exchange format that is both lightweight and human-readable(like XML, but without the bunch of markup).

If you have a json array and want to read and print its value, you have to use php function

json_decode(string $json, [optional{true, false}]).


If you pass a valid JSON string into the json decode function, you will get an object of type stdClass back. Here's a short example:

<?php
$string = '{"first_name": "Anup", "last_name": "Shakya"}';
$result = json_decode($string);

// Result: stdClass Object ( [first_name] => Anup: [last_name] => Shakya  )
print_r($result);

// Prints "Anup"
echo $result->first_name;

// Prints "Shakya"
echo $result->last_name;
?>


If you want to get an associative array back instead, set the second parameter to true: 

<?php
$string = '{"first_name": "Anup", "last_name": "Shakya"}';
$result = json_decode($string, true);

// Result: Array ( [first_name] => Anup: [last_name] => Shakya  )
print_r($result);

// Prints "Anup"
echo $result['first_name'];

// Prints "Shakya"
echo $result['last_name'];
?>


If you want to know more about JSON, here is an official website of JSON.










Reference: http://developer-paradize.blogspot.co.nz/2013/06/how-to-read-value-from-json-using-php.html











저작자 표시
신고

Comment +0

[1부]에 이어서 시작합니다. 

4. CI 경로 설정하기.


CI를 시작하기 위해서는 기본 경로를 설정해 줘야 합니다. 
system/application/config/config.php 파일을 열어서... 'base_url'을 아래와 같이 수정해 줍니다.

$config['base_url'] = "http://localhost/ci/";


정상적으로 설치가 되었으면 아래와 같이 나옵니다. 





5. MySQL 연결 설정하기.



데이터 베이스의 연결이 설정 되어 있는데로 설정르 합니다. 
파일은 system/application/config/database.php 입니다. 
이번 포스팅에서 사용할 db는 helloworld이고 사용자아이디와 암호는 "root"로 했습니다.

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "root";
$db['default']['database'] = "helloworld";
$db['default']['dbdriver'] = "mysql";


이제는 어플리케이션을 시작하면 항상 DB를 연결하도록 설정을 해 보겠습니다. system/application/config/autoload.php 파일을 열어서 보시면, $autoload['libraries']에 array('')가 비어 있습니다. 거기에 아래와 같이 database를 추가해 주세요.

$autoload['libraries'] = array('database');


먼저 MySQL에서 helloworld라는 데이터베이스를 생성합니다. 그리고 데이터 베이스가 비어 있으면 허전하죠? 데이터베이스를 채워 보겠습니다. 아래의 쿼리를 실행해서 데이터 베이스를 입력합니다.

CREATE TABLE `data`
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO `data` (`title`, `text`) VALUES('Hello World!', 'CodeIgniter is a powerful PHP framework with a very small footprint, built for PHP coders who need a simple and elegant toolkit to create full-featured web applications. If you''re a developer who lives in the real world of shared hosting accounts and clients with deadlines, and if you''re tired of ponderously large and thoroughly undocumented frameworks');



6. CI Controller 만들기.



처음에 사용할 Controller를 지정해 줘야 합니다. 
다시 system/application/config/routes.php 파일을 엽니다. 여기 기본값은 welcome이라도 되어 있을 겁니다. 이걸 helloworld로 변경합니다.

$route['default_controller'] = "helloworld";


위와 같이 설정을 해 주시면, 기본 컨트롤러가 기존의 system/application/controllers/welcome.php파일이 아닌 system/application/controllers/helloworld.php 파일을 읽게 됩니다. 그럼 이제, system/application/controllers/helloworld.php 파일을 만들고, 아래와 같이 입력해 주세요.

<?php
    class Helloworld extends Controller{
        function index()
        {
            $this->load->model('helloworld_model');

            $data['result'] = $this->helloworld_model->getData();
            $data['page_title'] = "CI Hello World App!";

            $this->load->view('helloworld_view',$data);
        }
    }
?>


여기서 주의점은 클래스의 이름의 첫 글자는 대문자로 해야 합니다. 

이전 개념도 그림에서 설명들였듯이 index.php에서는 이 controller 페이지를 거쳐서 model과 view를 연결합니다.
$this->load->model('helloworld_model')을 불러서 db의 데이터를 제어하고, 마지막은 $this->load->view('helloworld_view', $data)를 통해서 view에 있는 html과 데이터을 출력해 주는 형식입니다. 


7. CI Model 만들기


여기서는 database를 연결해서 데이터를 읽어 오는 클래스 입니다. 여기서는 액티브 레코드(Active Record Class)를 이용해서 제어를 해 보겠습니다. 먼저 system/application/models 디렉토리에 helloworld_model.php 파일을 만듭니다. 그리고 아래와 같은 코드를 입력해 줍니다.

<?php
class Helloworld_model extends Model {

    function Helloworld_model()
    {
        // 모델 생성자 호출
        parent::Model();
    }
    
    function getData()
    {
        // data테이블의 모든 레코드를 불러 옴.
        $query = $this->db->get('data');
        
        if ($query->num_rows() > 0)
        {
            return $query->result();
        }else{
            show_error('Database is empty!');
        }
    }
}
?>

위 코드는 data 테이블의 모든 데이터를 블러와서 리턴하는 코드 입니다. 이전 챕터의 controller를 getData의 리턴값으로 이 데이터베이스의 결과 값을 받게 됩니다. 


8. View 만들기


이제는 이 결과 값을 보여줄 페이지를 제작합니다. system/application/views 폴더에 helloworld_view.php 파일을 만들어 줍니다. 그리고 아래와 같은 내용을 넣습니다.

<html>
    <head>
        <title><?=$page_title?></title>
    </head>
    <body>
        <?php foreach($result as $row):?>
        <h3><?=$row->title?></h3>
        <p><?=$row->text?></p>
        <br />
        <?php endforeach;?>
    </body>
</html>

여기서는 foreach문으로 돌면서 data 테이블에 있는 내용을 출력해 줍니다. 지금은 1개 밖에 들어 있지 않아서 1개만 출력 되는데.. 추가로 입력이 되어 있으면 더 많은 데이터를 출력 합니다. 
view는 기본적으로 controller에서 보내 준 값을 출력만 하는 형태라고 생각하시면 됩니다. 물론 php코딩도 할 수 있지만, 기본적인 출력만을 제작하는 것을 권장한다고 합니다. 


9. 보기 좋은 주소로 만들어 주기


그러면 주소는 어떻게 될까요? 
http://localhost/ci/index.php/helloworld 
이런 주소 입니다. 
지금은 기본 route를 helloworld.php로 해 뒀으니까. 
http://localhost/ci/ 
이렇게만 하면 helloworld.php의 화면을 볼 수 있습니다. 그러면 초기에 있던 welcome.php를 보고 싶으면 어떻게 해야 할까요? 
http://localhost/ci/index.php/welcome 
이렇게 하시면 됩니다. 그런데.. index.php가 영 걸리죠? 그럼 이걸 과감하게 없애 보겠습니다. 

먼저 appache에 rewrite 엔진이 설정 되어 있어야 합니다. 그럼, CI가 설치된 폴더에 .htaccess 파일을 만들고 아래와 같은 내용을 입력해 줍니다.

RewriteEngine on
RewriteCond $1 !^(index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteRule ^(.*)$ /ci/index.php/$1 [L]

그리고 system/application/config/config.php 파일에 index_page의 설정 값을 지워 줍니다.

$config['index_page'] = '';

이렇게 해 주면. 
http://localhost/ci/helloworld 



index.php를 중간에 넣지 않고도 원하는 페이지를 부를 수 있습니다.


10. 예제 파일 및 마무리

 ci.zip


위 예제 파일 소스 입니다. CI를 다운 받으신 후 덮어서 쓰기 해서 사용하시면 됩니다.
DB에 데이터를 입력하고, DB의 설정 만 바꾸시면 동작을 바로 동작 할 껍니다.

이 외에도 CodeIgniter의 소스가 많이 공개 되어 있습니다.


















Reference: http://gyuha.tistory.com/259













저작자 표시
신고

Comment +0

CI의 Model에 대해서 정리합니다.


MVC 디자인 패턴에서 M인 Model은 데이터를 담당합니다. 

데이터란 보통 데이터베이스를 말하고 있습니다.

데이터를 다루는 로직을 따로 모델로 모아두어 데이터의 입출력과 화면을 관리하는 뷰를 격리 시켜

좀 더 편리하게 작업할 수 있는 환경을 그리고 호환성있게 만들어줄수 있습니다.



1. 데이터베이스 설정


Model을 사용하기 위해 CI의 데이터베이스 설정입니다.

Application/config/database.php 파일을 수정해야합니다.

주요 내요한 몇가지 설정만 해주시면 됩니다.


hostname : 데이터베이스 서버의 주소

username : 데이터베이스 사용자의 이름

password : 데이터베이스 비밀번호

database : 데이터베이스 명

dbdriver : 데이터베이스의 종류로 지원되는 드라이브의 목록은 system/database/drivers 디렉토리명을 참고한다.


※주의사항

데이터베이스 설정 파일에는 데이터베이스 서버에 접속 할 수 있는 정보를 그대로 입력하기 때문에

노출되서는 안됩니다. 따라서 버전관리를 사용하실때에는 제외해야합니다.



2. 데이터베이스 라이브러리 로드


CI에서 데이터베이스를 사용하기 위해서는 먼저 데이터베이스 라이브러리를 로드해야합니다.

CI에서는 2가지 방법을 제공해주고 있습니다.


1. application/config/autoload.php 파일의 $autoload['libraries'] 배열에 'database'를 추가한다. 

2. controller 내에서 $this->load->database()를 호출한다.


※저는 2번째 방법으로 진행했습니다.



3. 모델 파일 생성


Model 파일은 Application/models 디렉토리 아래에 '모델명_model.php'의 형식으로 파일을 생성해주면 됩니다. Model 파일은 CI_Model을 상속받아야 합니다. 또한 클래스 명은 '모델명_model' 이어야 하며 첫글자는 대문자로 하셔야 합니다.


단순한 쿼리를 사용하기위해서는 아래와 같이 합니다.


$this->db->query("SELECT * FROM test");



쿼리의 결과를 가져오려면 아래와 같이 하시면 됩니다.


$this->db->query("SELECT * FROM test")->result();



result()는 쿼리의 결과를 가져오는 방법입니다.

연관배열의 형태로 결과를 가져오는 방법은 result_array()의 형태입니다.

결과가 한 행이라면 row()를 사용하셔도 좋습니다.



또한 CI에서는 Active Record라는 기능을 제공해줍니다.

Active Record는 좀 더 프로그래밍적으로 데이터베이스를 제어하는 방법으로

Active Record를 이용하면 표준 SQL을 생성 할 수 있어서 이식성이 좋아집니다.





4.모델 사용


Model를 이용해 데이터를 조작하는 로직을 메소드로 정의하고

메소드는 Controller를 통해서 사용하면 됩니다.


모델을 사용하기 위해서는 먼저 모델을 로드합니다.


$this->load->model('모델파일이름');



모델의 메소드 호출하는 방법


$test_list = $this->test_model->gets();




-예제-


지난 포스팅에 했던 view에서 모델을 추가하여 작업하였습니다.


모델을 테스트하기 위해 다음과 같은 형식의 데이터베이스의 테이블을 생성했습니다.


1
2
3
4
5
create table test(
seq int not null primary key,
title varchar(255) not null,
contents text not null,
regdate datetime not null);



Application/controllers/test.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Test extends CI_Controller {
 
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
        $this->load->model('test_model');
    }
 
    public function index()
    {
        $this->load->view('header');
        $test_list = $this->test_model->gets();
        $this->load->view('test_list',array('test_list'=>$test_list));
        $this->load->view('test');
        $this->load->view('footer');
 
    }
 
    public function Some($parameter)
    {
        $this->load->view('header');
        $test_list = $this->test_model->gets();
        $this->load->view('test_list',array('test_list'=>$test_list));
 
        $test_item = $this->test_model->get2($parameter);
        $this->load->view('some',array('test_item'=>$test_item));
 
        $this->load->view('footer');
    }
 
}
?>


Application/models/test_model.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class Test_model extends CI_Model{
 
    function __construct()
    {
        parent::__construct();
    }
 
    function gets(){
        $strQuery = "SELECT * FROM test";
 
        return $this->db->query($strQuery)->result();
    }
 
    function get1($seq){
        $strQuery = "SELECT * FROM test where seq = " . $seq;
 
        return $this->db->query($strQuery)->result();
    }
 
    function get2($seq){
 
        return $this->db->get_where('test',array('seq'=>$seq))->row();
    }
 
}
?>

Application/views/.php


1
2
3
4
5
6
<article>
    <h1><?=$test_item->title?></h1>
    <div>
        <h2><?=$test_item->contents?></h2>
    </div>
</article>


Application/views/test_list.php


1
2
3
4
5
6
7
8
9
<ul>
<?php
foreach($test_list as $entry){
?>
    <li><a href="/Study/index.php/test/some/<?=$entry->seq?>"><?=$entry->title?></a></li>
<?php
}
?>
</ul>



위 예제를 접속하면 다음과 같이 나옵니다.



아래는 데스트2의 타이틀을 클릭했을때 나오는 화면입니다.



데이터베이스에 들어가 있는 내용이 잘 나오는 것을 확인 할 수 있습니다.




※참고자료


Opentutorial - 생활코딩 Controller 편 : http://opentutorials.org/module/327/3827

Codeigniter Manual : http://codeigniter-kr.org/user_guide_2.1.0/general/models.html


#제 블로그 보다 Opentutoril의 생활코딩에 올라온 자료가 더 좋습니다.

공부하면서 정리하는 내용입니다.



-







Reference: http://yoshikixdrum.tistory.com/162














저작자 표시
신고

Comment +0

1. DB 정보 셋팅





2. DB 관련 라이브러리 로드




3. 모델 파일 생성


application/models/testdb_model.php


<?php

class Testdb_model extends CI_Model{

function __construct(){

parent::__construct();

}


public function mybook(){

return $this->db->query('SELECT * FROM mybook')->result();

}

}






4. 컨트롤러에서 데이터 호출 API 만들기












Reference: http://dol2156.tistory.com/136











저작자 표시
신고

Comment +0

배열 stdclass <-> array 변환
그게 바로 stdClass 때문인데..
stdClass = 문자열인덱스 배열 구조라고 한다.

예) a -> val = "value";

---------------------------------------------------------------------------
stdClass 는 Json 을 사용할때도 사용 되기도 한다.
스크립트에서 ajax 사용시 넘기는 데이터 타입을 json 으로 지정하면
넘어가는 데이터가 stdClass로 넘어간다.

이럴경우 일반 배열로 다시 변환 하고 싶다면...

json_decode($aa,true); 로 선언하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// stdClass -> Array 로 변경
function objectToArray($d) {
    if (is_object($d)) {
        // Gets the properties of the given object
        // with get_object_vars function
        $d = get_object_vars($d);
    }
 
    if (is_array($d)) {
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return array_map(__FUNCTION__, $d);
    } else {
        // Return array
        return $d;
    }
}
 
// Array -> stdClass 로 변경
function arrayToObject($d) {
    if (is_array($d)) {
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return (object) array_map(__FUNCTION__, $d);
    } else {
        // Return object
        return $d;
    }
}
?>

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
// Create new stdClass Object
$init = new stdClass;
 
// Add some test data
$init->foo = "Test data";
$init->bar = new stdClass;
$init->bar->baaz = "Testing";
$init->bar->fooz = new stdClass;
$init->bar->fooz->baz = "Testing again";
$init->foox = "Just test";
 
 
// Convert array to object and then object back to array
$array = objectToArray($init);// stdClass -> Array 로 변경
$object = arrayToObject($array);// Array -> stdClass 로 변경
 
// Print objects and array
print_r($init);
echo "\n";
print_r($array);
echo "\n";
print_r($object);
?>

더보기

1차는 배열이고 2차가 클래스 오브젝트일경우 선택하는 방법
오류 표시 : Cannot use object of type stdClass as array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
Array (
    [0] => stdClass Object (
        [comment_id] => 158
        [posting_id] => 208
        [writer_id] => chongmoa
        [writer_name] => 총모아
        [comment] => 좋아좋아
        [reg_date] => 20140211171220 )
 
    [1] => stdClass Object (
        [comment_id] => 159
        [posting_id] => 208
        [writer_id] => chong
        [writer_name] => 마이
        [comment] => 굿
        [reg_date] => 20140211171222 )
)
echo $comment_data[1]->comment_id;
?>











Reference : https://chongmoa.com/364













저작자 표시
신고

Comment +0