'프로그래밍/php'에 해당되는 글 9건

  1. 2011.06.22 Eclipse PHP Software Updates
  2. 2011.05.27 PHP 설치
  3. 2011.05.20 PHP에서 JSON 라이브러리 사용하기 (1)
  4. 2011.05.20 PHP 세션관리
  5. 2011.05.19 PHP 사용자 입력 확인하기
  6. 2011.05.17 PHP 로 MySQL 접근하기 (1)
  7. 2011.05.16 php 코드 재활용과 클래스 (1)
  8. 2011.05.16 php 유용한 함수
  9. 2011.05.16 PHP 데이터 형 및 변수의 범위
Eclipse 에서 PHP SDK 를 설치하기위해서는 아래 플러그인 사이트에서 업데이트를 한다.

1. Software Update Site
    - PDT 를 update 하기 위해서 helios 사이트에서 Programming Languages -> PDT SDK Feature 를 설치한다.
        . http://download.eclipse.org/releases/helios/

    - 그런데 현재는 버그가 있군요.. 그래서 아래 사이트에서 설치해야 함..
        . name : PDT Update Site
        . URL : http://download.eclipse.org/tools/pdt/updates/2.2/milestones/

    - 3.0 은 설치가 안되던데.. 나중에 다시 테스트 
        . URL : http://ftp.daum.net/eclipse/tools/pdt/updates/3.0/milestones/
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

PHP 설치

프로그래밍/php 2011.05.27 00:01
I. 리눅스에서 설치
    1. 필요한 라이브러리
        - Apache(http://httpd.apache.org)
        - OpenSSL(http://www.openssl.org)
        - Mod_SSL(http://www.modssl.org)  : OpenSSL 에 대한 Apache 모듈 인터페이스 제공
        - PHP(http://www.php.net)
        - PHP Library : /usr/src  에 다운받는다
            . PDFlib 와 gd 에 필요한 JPEG 라이브러리(ftp://ftp.uu.net/graphics/jpeg)
            . gd 에 필요한 PNG 라이브러리(http://www.libpng.org/pub/png/libpng.html)
            - 위 PNG 라이브러리에 필요한 zlib 라이브러리(http://www.zlib.net)
            - PDFlib 에 필요한 TIFF 라이브러리(http://www.libtiff.org)
            - IMAP  에 필요한 IMAP 클라이언트

    2. PHP 설치
# cd /usr/src/httpd-2.2.9
# ./configure --prefix=/usr/local/apache2

# cd /usr/src/php-5.2.6
# ./config --prefix=/usr/local/php
                --with-mysqli=/usr/local/mysql_config \
                --with-apx2=/usr/local/apache2/bin/apxs \
                --with-jpeg-dir=/usr/src/jpeglib \
                --with-tiff-dir=/usr/src/tiffdir \
                --with-zlib-dir=/usr/src/zlib \
                --with-imap=/usr/src/imapcclient \
                --with-gd
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini    (개발용)
# cp php.ini-recommended /usr/local/lib/php.ini   (운영용)

# cd /usr/src/openssl-0.9.8h
# ./config --prefix=/usr/local/ssl
# make
# make test
# make install

# cd /usr/src/httpd-2.2.9
# SSL_BASE=../openssl-0.9.8h \
   ./configure \
   --prefix=/usr/local/apache2 \
   --enable-so
   --enable-ssl
# make
# make certificate TYPE=custom
# make install

# vi /usr/local/apache2/conf/httpd.conf
   <!-- 주석해제 -->
   AddType application/x-httpd-php .php
   AddType application/x-httpd-php-source .phps
   ...
   Include conf/extra/httpd-ssl.conf

# vi /usr/local/lib/php.ini
   <!-- 추가 -->
   extension = extenstion_name.so

# cp 설치된모듈* /usr/local/lib/php/extensions/

# cd /usr/local/apache2/bin
# ./apachectl configtest
# ./apachectl start



II. 윈도우에 설치
    1. 필요한 라이브러리
        - Apache(http://httpd.apache.org) : apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi
            . http://tud.at/programm/apache-ssl-win32-howto.php3 문서를 읽고 ssl 설치
        - PHP5(http://www.php.net)
            . php-5.2.6-win32.zip   :  PHP ZIP 파일                 설치경로 : c:\php
            . pecl-5.2.6.win32.zip   : 라이브러리 모음 파일    설치경로: c:\php\ext

[php.ini 수정]
extension_dir = c:/php/ext
doc_root="원하는 경로"
# 아래 원하는 라이브러리 해제
extension=php_pdf.dll 
extension=php_mysqli.dll
extension=php_pdfflib.dll
extension=php_gd2.dll
extension=php_imap.dll

[httpd.conf 수정]
LoadModule php5_module c:/php/php5apache2_2.dll
PHPIniDir "c:/php/"
AddType application/x-httpd-php.php 







 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
1. PHP 5.2.0 이후 버전
    - PHP 모듈에 라이브러리가 포함되어 있다.
    - json_encode()를 호출하여 PHP변수와 데이터를 전달한다.

$item = array(

    'id' => 'coffee',

    'price' => 3500,

    'urls' => array('http://www.ahnseungkyu.com',

                    'http://www.google.com')

);


$output = json_encode($item);

print($output);


2. PHP 5.1 이전 버전
    - http://json.org/ 에서 Services_JSON 을 클릭하면 http://pear.php.net/pepr/pepr-proposal-show.php?id=198 로 이동
    - 라이브러리를 다운받는다.
    - Services_JSON 객체를 생성하여 encode() 함수를 호출한다.

require_once('JSON.php');
$json = new Services_JSON();

$item = array(

    'id' => 'coffee',

    'price' => 3500,

    'urls' => array('http://www.ahnseungkyu.com',

                    'http://www.google.com')

);


$output = $json->encode($item);

print($output);




 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
1. 세션 생성
    - session_start() 를 호출하면 sessionid 가 생긴다.

2. 세션 변수 등록
    - $_SESSION['myvar'] = 5;

3. 세션 생명주기
    - php.ini 파일의 session_gc_maxlifetime 값으로 설정 (초단위 시간). 이후 저장된 세션이 gc 된다.

4.  세션 변수 사용
    - if ( isset($_SESSION['myvar']) ) ...

5. 세션 변수 해제
    - unset($_SESSION['myvar']); 
    ※ 세션 배열 전체를 삭제하면 세션을 사용할 수 없게 되므로 주의해야 한다.

6. 세션 삭제 
    - session_destroy() 를 호출하면 sessionid 가 삭제된다.
    ※ 세션을 삭제하기 전에는 먼저 세션 변수를 해제하고 삭제한다.

7. php.ini 의 세션관련 옵션
    - session.name = PHPSESSID
        . 세션 id 값
    - session.cookie_lifetime = 0
        . 세션 id가 쿠키 값으로 사용자 컴퓨터에 얼마나 남아있는지 결정
          기본값이 0이라는 의미는 브라우저가 닫히면 세션 id 가 저장된 쿠키도 삭제됨
    - session.cache_expire = 180
        . 사용자의 활동이 180 분 동안 없으면 끊어진다. 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG PHP세션
1. addslashes(), stripslashes()
    - 사용자의 데이터가 데이터베이스에 전달되기 전에 / 문자를 넣고 빼준다.

2. php.ini 파일에서 magic_quotes_gpc, magic_quotes_runtime
    - 속성을 켜두면 1번의 함수를 사용하지 않아도 자동으로 \ 등을 붙히거나 제거한다.
    - magic_quotes_gpc
        . GET, POST, COOKIE 변수에 저장되는 데이터의 특수문자를 오류없이 저장될 수 있도록 변형
    - magic_quotes_runtime
        . 데이터베이스에 저장되는 데이터를 변형

3. escapeshellcmd()
    - 명령어로 system()이나 exec()가 실행하지 않게 보장한다.

4. strip_tags()
    - 문자열에 HTML과 PHP 태그를 떼어준다.

5. htmlspecialchars()
    - 특수 문자를 HTML entity 형태로 변환한다. 예를 들어 < 는 &lt; 로 바꾼다.


 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
I. 파라미터 체크 및 변환
    1. trim()
        - 문자 앞뒤 공백제거 
$searchTerm = trim($searchTerm);
if (!$searchTerm) {
    echo "검색기간을 입력하세요.";
    exit;

    2. get_magic_quotes_gpc()
        - 서버에서 자동으로 문자열을 escape 해 주도록 세팅되어 있는지 확인하는 함수

    3. addslashes(), doubleval()
        - 데이터베이스 쿼리 조건절의 파라미터로 사용된다면 addslashed() 함수를 이요하여 escape 해줘야 한다.
        - 데이터베이스 숫자 필드의 경우에는 이상한 문자를 제거하기 위해서 doubleval()을 이요한다.
if (!get_magic_quotes_gpc()) {
    $searchTerm = addslashes($searchTerm);
    $prive = doubleval($prive);

    4. stripslashes()
        - 서버가 자동으로 escape 하도록 세팅되어 있으면 데이터베이스에서 추출한 데이터는 stripslashes()를
          호출하여 / 문자를 제거해야 한다.

    5. htmlspecialchars()
        - HTML에서 특별한 기능을 하는 문자를 인코딩한다. ( & < > " )

II. 데이터 베이스 접속 및 쿼리
    1. mysqli()
        - 서버 접속을 위해서 mysqli(서버명, 사용자id, 패스워드, 데이터베이스명) 을 사용한다.

    2. mysql_connect_errno()
        - 서버에 접속해서 유효한 데이터베이스 접속을 얻었는지 확인 한다.
        - 오류가 나며 오류 번호를, 성공했을 경우에는 0 을 리턴한다.
        - 데이터베이스에 접속하려 했을 때 코드 앞에 오류 억제 연산자 @ 를 사용한다.
          이렇게 하면 오류가 났을 때 자신의 코드로 처리할 수 있다.
        - Apache의 maxClients(1.x 버전), ThreadsPerChild(2.x버전) 는 httpd.conf 에서,
          MySQL의 max_connections 는 my.conf 에서 수정한다.

$con = @new mysqli($GLOBALS['gServerName'], $GLOBALS['gUserId'],
                   $GLOBALS['gPassword'], $GLOBALS['gDatabase']);

if ($con->connect_errno) {

    printf("%d : %s <br/>", $con->connect_errno, $con->connect_error);
    exit(); 

}


    3. $con->select_db()
        - 기본 데이터 베이스 변경
$con->select_db($GLOBALS[gDatabase]);

    4. $con->query()
        - 데이터베이스 쿼리를 수행하여 결과 값을 $result 에 저장한다.
        - 아래와 같은 코드는 보안에 문제가 있으니 문법을 이해하는 정도로만 사용

$userId = "skanddh";
$sql =
"select * from User where userId = " . $userId;

$result = $con->query($sql);


    5. $result->num_rows
        - 데이터베이스에서 조회된 결과 row 수를 알 수 있다.

$rowCount = $result->num_rows;


    6. $result->fetch_assoc()
        - 각 row 마다 호출하여 한 row의 값을 배열로 받는다.
        - 결과 값을 출력한다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_assoc();

    print("userId = " . htmlspecialchars(stripslashes($row['userId'])) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row['userName'])) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row['age'])) . "<br/>");
}


    7. $result->fetch_object()
        - $result->fetch_assoc() 호출 시의 배열과는 다르게 결과가 object 로 넘어온다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_object();

    print("userId = " . htmlspecialchars(stripslashes($row->userId)) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row->userName)) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row->age)) . "<br/>");

}


    8. $result->free(), $db->close();
        - 결과 값 release  및 데이터베이스 접속 끊기

$result->free();

$con->close();


    9. $con->affected_row
        - query 가 insert, delete, update 문일 경우 affected_row 로 영향받은 row의 갯수를 알 수 있다.
        - query() 메소드 보다는 statement 의 execute() 메소드를 사용하는 것이 좋다.

$userId = 'me';

$userName = 'john';

$age = 30;

$sql = " insert into User (userId, userName, age) " .

       "     values ('" . $userId . "', '". $userName . "', ". $age . ") ";

$con->query($sql);

printf("%d user inserted into database.<br/>", $con->affected_rows);

$con->commit(); 


    10. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute()
         - Prepared Statement 를 사용하여 보안성을 높힌다.
         - bind_param() 호출 시 첫번째 전달인자의 의미,    s : string,   i : integer,   d : double

$sql = " insert into User (userId, userName, age) " .

       "           values (?, ?, ?) ";

$stmt = $con->prepare($sql);

$stmt->bind_param("ssi", $userId, $userName, $age);

$stmt->execute();

printf("%d user inserted into database.<br/>", $con->affected_rows);

$stmt->close();


    11. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute(),   $stmt->bind_result(),  $stmt->fetch()
         - bind_result() 를 이용하여 조회되어 넘어오는 값을 변수에 할당할 수 있다. 

$sql = " select userId, userName, age from User ";

if ( $stmt = $con->prepare($sql) ) {

    $stmt->execute();

    if ($stmt->errno) {
        printf(
"execute() >> %d : %s <br/>",$stmt->errno, $stmt->error);
    } 

    $stmt->bind_result($rUserId, $rUserName, $rAge);

    $count = 0;

    while ($stmt->fetch()) {

        $count++;

        print("userId = " . htmlspecialchars(stripslashes($rUserId)) .
              "<br/>");

        print("userName = " . htmlspecialchars(stripslashes($rUserName)) .
              "<br/>");

        print("age = " . htmlspecialchars(stripslashes($rAge)) . "<br/>");

    }
    printf("%d row seleted. <br/>", $count);

    $stmt->close();

}



 



 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG mysql, php
I. require 와 include
    1. 다른 파일을 불러온다. HTML 태그, php 함수, php 클래스 등이다.
    2. require() 는 실패했을 경우 치명적인 오류를 내지만 include() 는 가벼운 경고만 낸다.
    3. require_once()와 include_once() 는 라이브러리 파일을 두 번 이상 포함시키는 일을 막아준다.
        그러나 require()나 include() 보다 속도가 느리다. 
    4. php 문은 파일 확장자가 .html 이거나 .php 등일 때에만 스크립트 언어로 처리되어 실행.
    5. require로 불러들일 파일의 확장자 이름에 .inc와 같은 특별한 규칙을 두어 작성하는 것도 좋은 방법
        단, 이런 문서를 웹 문서 트리 안에 저장할 때에는 사용자들이 직접 접근 하지 못하도록 주위 (패스워드 등) 
        php 환경설정에서 아래와 같이 디렉토리를 웹 문서 디렉토리로 설정하고 추가로 config 설정파일은
        php 웹 문서가 아닌 디렉토리로 지정할 수 있다.(/Library/WebServer/php/includes)
        예) include_path = ".:/Library/WebServer/php/includes:/Library/WebServer/Documents"

II. 참조 전달 방법
    1. & 를 이용하면 참조로 전달 할 수 있다.
function increment(&$value, $amount = 1) {
    $value = $value + $amount;

III. 클래스 만들기
    1. 생성자와 소멸자
        - 생성자는 __construct() 라는 특별한 이름으로 파라미터를 가지며 생성할 수 있다.
        - 소멸자는 __destruct() 라는 이름으로 만들며 파라미터를 가지지 못한다.
 
    2. 클래스 속성
        - 접근자가 생략되면 모두 public 이다.
        - 클래스 속성의 접근자는 private 으로 하고 __set(), __get() 으로 속성에 접근한다.
        - 자기 자신의 인스턴스는 $this 로 접근한다.

class Point {

    private $x;

    private $y;

    public function __construct($x, $y) {

        $this->x = $x;

        $this->y = $y;

    }

    public function __get($name) {

        return $this->$name;

    }

    public function __set($name, $value) {

        $this->$name = $value;

    }

    public function display() {

        print("\$this->x = " . $this->x . "<br/>");

        print("\$this->y = " . $this->y . "<br/>");

    } 

}

$point = new Point(3, 5);

print($point->x);         // 3

print($point->y);         // 5

$point->x = 7;

print($point->x);         // 7

$point->display(); 


    3. 클래스 상속
        - 부모의 클래스는  parent 키워드를 이용한다.

class Rectangle extends Point {

    private $width;

    private $height;


    public function __construct($x, $y, $width, $height) {

        parent::__construct($x, $y);

        $this->x = $x;

        $this->y = $y;

    }

}

$rectangle = new Rectangle(10, 20, 100, 200);

print($rectangle->x);   // 10

 
    4. 인터페이스
        - 인터페이스는 interface 키워드를 사용한다.
        - 구현은 implements 로 한다.

interface Displayable {

    public function display();

}

class WebPage implements Displayable {

    public function display() {

        print("Hello World!! <br/>");

    }

}

$page = new WebPage();

$page->display();


    5. 클래스의 상수 및 정적 메소드 
        - 상수는 const 키워드를 사용하고 :: 연산자로 접근한다.
        - 정적 메소드는 static 키워드를 사용하고 :: 연산자로 접근한다.

class Math {

    const pi = 3.14159;

    public static function squared($input) {

        return $input * $input;

    }

}

print("Math::pi = " . Math::pi . "<br/>");

print("Math::squared(8) = " . Math::squared(8) . "<br/>");


    6. 클래스 타입 hinting
        - 클래스의 특정 타입을 파라미터 전달 시에 전달할 수 있다.
function check_hint(Point $object) {
    // ...

    7.  추상 클래스
        - abstract 키워드를 사용한다.

abstract class A {

    public abstract function operationX($param1, $param2);

}

class ConcreteA extends A {

    public function operationX($param1, $param2) {

        return $param1 + $param2;

    }

}

$a = new ConcreteA();

print($a->operationX(3, 4) . "<br/>");


    8. 메소드 오버로딩
        - __call() 메소드를 이용하여 오버로딩을 구현한다.
        - 첫번째 전달인자는 호출되는 메소드이고, 두번째 전달인자는 파라미터로 넘길 파라미터 배열이다.
public function __call($method, $param) {
    if ($method == "display") {
        if (is_object($p[0])) {
            $this->displayObject($p[0]);
        } else if (is_array($p[0])) {
            $this->displayArray($p[0]);
        } else {
            $this->displayScalar($p[0]);
        }
    }
}

$object = new Overload();
$object->display(array(1, 2, 3));
$object->display('cat'); 

    9. 클래스 자동 import
        - __autoload() 함수를 이용하여 자동으로 include 할 수 있다.
        - 이 함수는 클래스 메소드가 아니라 독립된 함수이다.
        - 아래는 클래스 파일과 같은 파일명을 읽어 들이는 예제이다.
function __autoload($name) {
    include_once $name . ".php";

    10. Reflection API
require_once("config.inc");

$class = new ReflectionClass("Point");
print("<pre>" . $class . "</pre>"); 


Posted by Kubernetes Korea co-leader seungkyua@gmail.com
I. 배열관련 함수
    1. each()       : 포인터를 이동하기 전에 값을 리턴한 후에 포인터를 뒤로 이동한다.
    2. current()   : 현재 포인터의 값을 리턴한다. (pos()와 동일)
    3. reset()       : 포인터를 배열의 첫번째 요소로 이동시키고 값을 리턴한다.
    4. end()        : 포인터를 배열의 마지막 요소로 이동시기고 값을 리턴한다.
    5. next()       : 포인터를 뒤로 이동한 후에 그 값을 리턴한다.
    6. prev()       : 포인터를 앞으로 이동한 후에 그 값을 리턴한다. (end() 와 같이 사용)
    7. count()     : 배열 요소의 수를 리턴한다. (sizeof()와 동일)

II. 기타 유용한 함수
    1. explode("\t", $a_str)
        - 구분자를 탭으로 하여 문자열을 array 로 반환한다.
    2. intval()
        - 문자열 중에서 숫자 부분만 정수로 바꾸어 리턴한다.  ("12 age" 이면 12 만 리턴) 
    3. nl2br()
        - 문자열에 뉴라인(\r\n, \n\r, \n, \r) 이 있으면 <br /> 로 변경한다. 
    4. isset()
        - 변수가 세팅되었거나 값이 있는지 확인한다.
$name = $_POST['name'];
$password = $_POST[password'];

if ( (!isset($name)) || (!isset($password)) ) {
    echo '사용자 id와 패스워드를 입력하세요.';

    5. urlencode(), urldecode()
        - 문자열을 url 에 맞게 encode 및 decode 한다.

    6. die(), exit()
        - 스크립트 실행을 중단시킨다.
        - die() 는 오류메세지를 출력하거나 스크립트를 끝내기 전에 함수를 실행시킬 수 도 있고,
          절반쯤 끝난 페이지를 출력버퍼에서 제거할 수 도 있다.
function err_msg() {
    echo 'MySQL error was: ' . mysql_error();
}

mysql_query($query) or die(err_msg()); 






 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG php함수
I. 데이터 타입
    1. four scalar types
        - boolean
        - integer
        - float ( double)
        - string

    2. two compound types
        - array
            $arr = array("foo" => "bar", 12 => true);
            echo $arr["foo"];   // bar
            echo $arr[12];       // 1
            unset($arr);

        - object

    3. two special types
        - resource
        - NULL 

II. 타입 알아내기 
    1. gettype($a_str)
        - "bool", "int", "double", "string", "array", "object", "resource", NULL, "unknown type" 중 하나를 반환한다
    2. is_int($an_int), is_long(), is_integer()
        - 변수가 정수형인지 검사
    3. is_double(), is_float(), is_real()
        - 변수가 부동소수점형인지 검사
    3. is_string($a_str)
    4. is_array($a_arr)
    5. is_bool()
    6. is_null()
    7. is_numeric()
    8. is_object()
    9. is_scalar()
    10. is_callable()
        - 변수에 저장된 값이 호출할 수 있는 함수의 이름인지 검사

III. 변수 초기화 여부 및 제거
    1. isset($a) : 변수값이 세팅되었으면 true
    2. unset($a) : 변수를 삭제
 
IV. 변수의 범위
    1. 전역 변수는 스크립트 내에서 정의된 변수로 스크립트 내에서 사용가능하지만 함수 안에서는 사용못함
    2. 함수 안에서 정의된 변수는 함수 안에서만 사용
    3. global 키워드로 슈퍼글로벌 변수로 정의 가능 (어디에서든 접근 가능)

V. 슈퍼글로벌 변수
    1. $GLOBALS
        - 모든 전역 변수의 배열 ($GLOBALS["myvalue"] 처럼 접근)
    2. $_SERVER
    3. $_GET
    4. $_POST
    5. $_COOKIE
    6. $_FILES
    7. $_ENV
    8. $_REQUEST
        - $_GET, $_POST, $_COOKIE 를 포함
    9. $_SESSION


 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com