- 论坛徽章:
- 0
|
这里是我这几天来研究PHP扩展的一些体会,和解决掉的错误
- PHP_FUNCTION(passport_register){
- // 和之前的代码比较,我没有为*connection分配内存,显然,内存是由Zend进行管理的。必须用Zend的内存管理函数来分配和回收内存资源。
- MYSQL *connection = (MYSQL*)emalloc(sizeof(MYSQL));
- MYSQL_RES *resultset = (MYSQL_RES*)emalloc(sizeof(MYSQL_RES));
- // MYSQL_ROW row = (MYSQL_ROW)emalloc(sizeof(MYSQL_ROW));
- // MYSQL_FIELD *fields = (MYSQL_FIELD*)emalloc(sizeof(MYSQL_FIELD));
- unsigned int numrows, numcols, i;
- mysql_init(connection);
- if(connection == NULL){
- RETURN_FALSE;
- }
- if (mysql_real_connect(connection,"localhost","develop","********","passport",3306,NULL,0) == NULL){
- RETURN_FALSE;
- }
- zval *rconn;
- MAKE_STD_ZVAL(rconn);
- // 要注册资源类型。之前却没有注册。
- ZEND_REGISTER_RESOURCE(rconn, connection, le_sample_connection);
- array_init(return_value);
- add_index_zval(return_value, 0, rconn);
-
- char query[] = "SELECT username,usertypeid,email,status,ipaddr_registered FROM passport";
- // 要在此使用资源数据类型,要从Zend内部的HashTable 中取回资源。
- ZEND_FETCH_RESOURCE(connection, MYSQL*, &rconn, -1, "mysql connection", le_sample_connection);
-
- if (mysql_query(connection, query) != 0)
- {
- RETURN_FALSE;
- }
- resultset = mysql_use_result(connection);
- if (resultset == NULL){
- RETURN_FALSE;
- }
- zval *rresult;
- MAKE_STD_ZVAL(rresult);
- ZEND_REGISTER_RESOURCE(rresult, resultset, le_sample_result);
- add_index_zval(return_value, 2, rresult);
-
- }
复制代码
php 测试代码:
- $passport = passport_register();
- var_dump($passport);
复制代码
输出结果:
- array(2) {
- [0]=>
- resource(3) of type (mysql connection)
- [2]=>
- resource(4) of type (mysql result)
- }
复制代码 |
|