PHP 확장 (PHP에서는 pdo 래퍼 클래스가 아닌 C 언어 사용)에서 PDO MySQL을 사용하고 싶습니다. 그러나이 경우에 대해서는 아무도 모릅니다. 누구든지 나를 도울 수 있습니까? 감사.PHP 확장 기능을 사용하려면 어떻게해야합니까?
1
A
답변
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());
. 건배!
관련 문제
- 1. tabcontols에서 저장 기능을 사용하려면 어떻게해야합니까?
- 2. SOS 디버깅 확장 프로그램을 효과적으로 사용하려면 어떻게해야합니까?
- 3. 파이썬의 curses 라이브러리에서 확장 문자를 사용하려면 어떻게해야합니까?
- 4. C++ 내 기능을 효율적으로 사용하려면 어떻게해야합니까?
- 5. 내 텍스트 상자에이 트림 기능을 사용하려면 어떻게해야합니까?
- 6. Clang에서 C++ 11 기능을 사용하려면 어떻게해야합니까?
- 7. eclipse에서 Java 프로젝트에 Aptana 기능을 사용하려면 어떻게해야합니까?
- 8. JQuery에서 JSFiddle echo 기능을 사용하려면 어떻게해야합니까?
- 9. Android 시뮬레이터 : 레이아웃 감지 기능을 사용하려면 어떻게해야합니까?
- 10. PHP의 최신 버전에서 비추천 기능을 사용하려면 어떻게해야합니까?
- 11. 내가 바보인가? XAML2009 기능을 사용하려면 어떻게해야합니까?
- 12. VS 2012에서 CSS 편집기 기능을 사용하려면 어떻게해야합니까?
- 13. MOSEK의 핫 스타트 기능을 사용하려면 어떻게해야합니까?
- 14. 확장 메서드에서 HTML 도우미 메서드를 사용하려면 어떻게해야합니까?
- 15. 크롬 확장 프로그램에서 chrome.tabs.executeScript를 사용하려면 어떻게해야합니까?
- 16. Chrome 확장 프로그램에서 Python을 사용하려면 어떻게해야합니까?
- 17. ASP.NET MVC 뷰에서 확장 메서드를 사용하려면 어떻게해야합니까?
- 18. 레일 3.1+ 애플리케이션에서 PHP 클래스를 사용하려면 어떻게해야합니까?
- 19. PHP 5.4와 함께 WAMP에서 PDO를 사용하려면 어떻게해야합니까?
- 20. Flex 4 웹 응용 프로그램에서 Google Checkout 기능을 사용하려면 어떻게해야합니까?
- 21. 파이어 폭스에서이 확장 기능을 컴파일하려면 어떻게해야합니까?
- 22. 디버깅을 위해 PHP 편집기를 사용하려면 어떻게해야합니까?
- 23. JavaScript 변수를 PHP 변수로 사용하려면 어떻게해야합니까?
- 24. JavaScript 내에서 PHP 변수를 사용하려면 어떻게해야합니까?
- 25. OAuth를 PHP 및 cURL과 함께 사용하려면 어떻게해야합니까?
- 26. 젠드 서버에서 php-win을 사용하려면 어떻게해야합니까?
- 27. Drools를 PHP 응용 프로그램과 함께 사용하려면 어떻게해야합니까?
- 28. PHP 스크립트에서 document.documentElement.clientwidth의 결과를 사용하려면 어떻게해야합니까?
- 29. Kohana에서 MongoDB를 사용하려면 어떻게해야합니까?
- 30. ie와 firefox에서 요소를 선택하는 기능을 다시 사용하려면 어떻게해야합니까?
php5.4가 설치되었습니다. – DotDash
내선에서 PDO로 정확히 무엇을 할 계획입니까? 이것은 주로 PHP 코드를위한 서비스이며, 다른 확장 기능을위한 것이 아닙니다. – duskwuff
check http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/ –