2012-12-20 5 views
1

PHP 확장 (PHP에서는 pdo 래퍼 클래스가 아닌 C 언어 사용)에서 PDO MySQL을 사용하고 싶습니다. 그러나이 경우에 대해서는 아무도 모릅니다. 누구든지 나를 도울 수 있습니까? 감사.PHP 확장 기능을 사용하려면 어떻게해야합니까?

+1

php5.4가 설치되었습니다. – DotDash

+0

내선에서 PDO로 정확히 무엇을 할 계획입니까? 이것은 주로 PHP 코드를위한 서비스이며, 다른 확장 기능을위한 것이 아닙니다. – duskwuff

+0

check http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/ –

답변

4

내 문제는 Google에서 해결 했으므로이 가이드에 따라 문제를 해결할 수 있으며 다른 zend 클래스에서 사용할 수 있습니다.

참고 : 에 대한 기본 개념은에 PHP 확장을 만드는 방법입니다. 기원은 만 미만 3 인수를 지원 zend_call_method 때문에

1.You는 원점 zend_call_method 패치를해야하고, PDO의 생성자는 1-4 인수를 사용합니다.

PDO :: __ 구조() (문자열 $ DSN [문자열 $ 사용자 이름 [, 문자열 $ 암호 [, 배열 $ driver_options]]])

하면 PHP에서 "zend_interfaces.c"을 찾기 (아마도 "PHP-5.xx의-SRC \ 젠드 \ zend_interfaces.c"의) 소스 디렉토리는, 목표는 "zend_call_method"부분은,이 같은 코드에 붙여 넣기 할 복사하기 :

/* {{{ zend_call_method 
Only returns the returned zval if retval_ptr != NULL */ 
ZEND_API zval* zend_call_method_n_params(
    zval **object_pp, zend_class_entry *obj_ce, 
    zend_function **fn_proxy, const char *function_name, 
    int function_name_len, zval **retval_ptr_ptr, 
    int param_count, zval *** params TSRMLS_DC) 
// ↑↑↑new function definition 
// only change "zval* arg1, zval* arg2" to "zval *** params" 
// make a new function name "zend_call_method_n_params" 
{ 
     ... 

    //zval **params[2];   ← delete it! 
    //params[0] = &arg1;   ← delete it! 
    //params[1] = &arg2;   ← delete it! done. 

     ... 
} 
/* }}} */ 

참고 : n 일부 매크로 :

#define call_method(obj, obj_ce, fn_proxy, function_name, retval, param_count, params) \ 
    zend_call_method_n_params(obj, obj_ce, fn_proxy, function_name, sizeof(function_name)-1, retval, param_count, params TSRMLS_CC) 

#define call_function(function_name, retval, param_count, params) \ 
    zend_call_method(NULL, NULL, NULL, function_name, retval, param_count, params) 

#define call_construct(obj, obj_ce, param_count, params) \ 
    call_method(obj, obj_ce, &obj_ce->constructor, obj_ce->constructor->common.function_name, NULL, param_count, params) 

2.hello world!

설정 코드, 우리는 다음과 같이 호출 할 수 PHP에서 속성 "PDO"

PHP_MINIT_FUNCTION(yourextension) 
{ 
    ... 
    zend_declare_property_null(you_class_entry, ZEND_STRL("pdo"), 
           ZEND_ACC_PUBLIC TSRMLS_CC); 
    ... 
} 
PHP_METHOD(foo, bar) 
{ 
    char * dsn = "mysql:dbname=yourdb;host=127.0.0.1;port=3306"; 
    char * usr = "username"; 
    char * pwd = "password"; 
    zval * zdsn = NULL; 
    zval * zusr = NULL; 
    zval * zpwd = NULL; 

    zval ** params[3]; 
    zend_class_entry * pdo_class_entry; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { 
     RETURN_FALSE; 
    } 

    // get class entry for PDO 
    pdo_class_entry = zend_fetch_class(ZEND_STRL("PDO"), 
            ZEND_FETCH_CLASS_AUTO TSRMLS_CC); 

    // initial PDO instance 
    MAKE_STD_ZVAL(pdo_inst); 
    object_init_ex(pdo_inst, pdo_class_entry); 

    // arg1: dns string 
    ALLOC_INIT_ZVAL(zdns); 
    ZVAL_STRINGL(zdsn, dsn, sizeof(dsn)-1, 1); 

    // arg2: username 
    ALLOC_INIT_ZVAL(zusr); 
    ZVAL_STRINGL(zusr, usr, sizeof(usr)-1, 1); 

    // arg3: password 
    ALLOC_INIT_ZVAL(zpwd); 
    ZVAL_STRINGL(zpwd, pwd, sizeof(pwd)-1, 1); 

    // put them in params array 
    params[0] = &zdsn; 
    params[1] = &zusr; 
    params[2] = &zpwd; 

    // call PDO::__construct(zdns, zusr, zpwd) 
    zend_call_method_n_params(&pdo_inst, 
     pdo_class_entry, 
     &pdo_class_entry->constructor, 
     ZEND_STRL(pdo_class_entry->constructor->common.function_name), 
     NULL, 3, // 3 params 
     params TSRMLS_CC); 
    // or simply use macro instead() 
    //call_construct(&pdo_inst, pdo_class_entry,3,params); 
    if (pdo_inst && Z_TYPE_P(pdo_inst) == IS_OBJECT) { 
     zend_update_property(your_class_entry, getThis(), 
          ZEND_STRL("pdo") , pdo_inst TSRMLS_CC); 
     zend_printf("Success.\n"); 
    } else { 
     zend_printf("Failure.\n"); 
    } 
} 

이 필요합니다 : 그것은 잘 작동

$foo = new foo(); 
$foo->bar(); // connect by PDO and update $foo->pdo 
// you can use pdo property now 
var_dump($foo->pdo->query("select * from table")->fetchAll()); 

. 건배!

관련 문제