📄 mysqli.c
字号:
((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;}/* }}} *//* {{{ mixed mysqli_result_construct() constructor for result object.Parameters: object [, mode] -> mysqli_store/use_result*/ZEND_FUNCTION(mysqli_result_construct){ MY_MYSQL *mysql; MYSQL_RES *result; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; long resmode = MYSQLI_STORE_RESULT; switch (ZEND_NUM_ARGS()) { case 1: if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) { return; } break; case 2: if (zend_parse_parameters(2 TSRMLS_CC, "Ol", &mysql_link, mysqli_link_class_entry, &resmode)==FAILURE) { return; } break; default: WRONG_PARAM_COUNT; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); result = (resmode == MYSQLI_STORE_RESULT) ? mysql_store_result(mysql->mysql) : mysql_use_result(mysql->mysql); if (!result) { RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)result; mysqli_resource->status = MYSQLI_STATUS_VALID; ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;}/* }}} *//* {{{ php_mysqli_fetch_into_hash */void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags, int into_object){ MYSQL_RES *result; zval *mysql_result; long fetchtype; zval *ctor_params = NULL; zend_class_entry *ce = NULL;#if !defined(HAVE_MYSQLND) unsigned int i; MYSQL_FIELD *fields; MYSQL_ROW row; unsigned long *field_len;#endif if (into_object) { char *class_name; int class_name_len; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sz", &mysql_result, mysqli_result_class_entry, &class_name, &class_name_len, &ctor_params) == FAILURE) { return; } if (ZEND_NUM_ARGS() < (getThis() ? 1 : 2)) { ce = zend_standard_class_def; } else { ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); } if (!ce) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name); return; } fetchtype = MYSQLI_ASSOC; } else { if (override_flags) { if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } fetchtype = override_flags; } else { fetchtype = MYSQLI_BOTH; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &fetchtype) == FAILURE) { return; } } } MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); if (fetchtype < MYSQLI_ASSOC || fetchtype > MYSQLI_BOTH) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH"); RETURN_FALSE; }#if !defined(HAVE_MYSQLND) if (!(row = mysql_fetch_row(result))) { RETURN_NULL(); } if (fetchtype & MYSQLI_ASSOC) { fields = mysql_fetch_fields(result); } array_init(return_value); field_len = mysql_fetch_lengths(result); for (i = 0; i < mysql_num_fields(result); i++) { if (row[i]) { zval *res; MAKE_STD_ZVAL(res); /* check if we need magic quotes */ if (PG(magic_quotes_runtime)) { Z_TYPE_P(res) = IS_STRING; Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC); } else { ZVAL_STRINGL(res, row[i], field_len[i], 1); } if (fetchtype & MYSQLI_NUM) { add_index_zval(return_value, i, res); } if (fetchtype & MYSQLI_ASSOC) { if (fetchtype & MYSQLI_NUM) { ZVAL_ADDREF(res); } add_assoc_zval(return_value, fields[i].name, res); } } else { if (fetchtype & MYSQLI_NUM) { add_index_null(return_value, i); } if (fetchtype & MYSQLI_ASSOC) { add_assoc_null(return_value, fields[i].name); } } }#else mysqlnd_fetch_into(result, MYSQLND_FETCH_ASSOC, return_value);#endif if (into_object && Z_TYPE_P(return_value) != IS_NULL) { zval dataset = *return_value; zend_fcall_info fci; zend_fcall_info_cache fcc; zval *retval_ptr; object_and_properties_init(return_value, ce, NULL); zend_merge_properties(return_value, Z_ARRVAL(dataset), 1 TSRMLS_CC); if (ce->constructor) { fci.size = sizeof(fci); fci.function_table = &ce->function_table; fci.function_name = NULL; fci.symbol_table = NULL; fci.object_pp = &return_value; fci.retval_ptr_ptr = &retval_ptr; if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) { if (Z_TYPE_P(ctor_params) == IS_ARRAY) { HashTable *ht = Z_ARRVAL_P(ctor_params); Bucket *p; fci.param_count = 0; fci.params = safe_emalloc(sizeof(zval*), ht->nNumOfElements, 0); p = ht->pListHead; while (p != NULL) { fci.params[fci.param_count++] = (zval**)p->pData; p = p->pListNext; } } else { /* Two problems why we throw exceptions here: PHP is typeless * and hence passing one argument that's not an array could be * by mistake and the other way round is possible, too. The * single value is an array. Also we'd have to make that one * argument passed by reference. */ zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Parameter ctor_params must be an array", 0 TSRMLS_CC); return; } } else { fci.param_count = 0; fci.params = NULL; } fci.no_separation = 1; fcc.initialized = 1; fcc.function_handler = ce->constructor; fcc.calling_scope = EG(scope); fcc.object_pp = &return_value; if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name, ce->constructor->common.function_name); } else { if (retval_ptr) { zval_ptr_dtor(&retval_ptr); } } if (fci.params) { efree(fci.params); } } else if (ctor_params) { zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %s does not have a constructor hence you cannot use ctor_params", ce->name); } }}/* }}} *//* {{{ php_mysqli_set_error */PHP_MYSQLI_API void php_mysqli_set_error(long mysql_errno, char *mysql_err TSRMLS_DC){ MyG(error_no) = mysql_errno; if (MyG(error_msg)) { efree(MyG(error_msg)); } MyG(error_msg) = estrdup(mysql_err);}/* }}} */#define ALLOC_CALLBACK_ARGS(a, b, c)\if (c) {\ a = (zval ***)safe_emalloc(c, sizeof(zval **), 0);\ for (i = b; i < c; i++) {\ a[i] = emalloc(sizeof(zval *));\ MAKE_STD_ZVAL(*a[i]);\ }\}#define FREE_CALLBACK_ARGS(a, b, c)\if (a) {\ for (i=b; i < c; i++) {\ zval_ptr_dtor(a[i]);\ efree(a[i]);\ }\ efree(a);\}#define LOCAL_INFILE_ERROR_MSG(source,dest)\memset(source, 0, LOCAL_INFILE_ERROR_LEN);\memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1);/* {{{ void php_set_local_infile_handler_default */void php_set_local_infile_handler_default(MY_MYSQL *mysql) { /* register internal callback functions */#if !defined(HAVE_MYSQLND) mysql_set_local_infile_handler(mysql->mysql, &php_local_infile_init, &php_local_infile_read, &php_local_infile_end, &php_local_infile_error, (void *)mysql); mysql->li_read = NULL;#else mysqlnd_local_infile_default(mysql->mysql);#endif}/* }}} */#if !defined(HAVE_MYSQLND)/* {{{ php_local_infile_init */int php_local_infile_init(void **ptr, const char *filename, void *userdata){ mysqli_local_infile *data; MY_MYSQL *mysql; php_stream_context *context = NULL; TSRMLS_FETCH(); /* save pointer to MY_MYSQL structure (userdata) */ if (!(*ptr= data= ((mysqli_local_infile *)calloc(1, sizeof(mysqli_local_infile))))) { return 1; } if (!(mysql = (MY_MYSQL *)userdata)) { LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); return 1; } /* check open_basedir */ if (PG(open_basedir)) { if (php_check_open_basedir_ex(filename, 0 TSRMLS_CC) == -1) { LOCAL_INFILE_ERROR_MSG(data->error_msg, "open_basedir restriction in effect. Unable to open file"); return 1; } } mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context); if (mysql->li_stream == NULL) { snprintf((char *)data->error_msg, sizeof(data->error_msg), "Can't find file '%-.64s'.", filename); return 1; } data->userdata = mysql; return 0;}/* }}} *//* {{{ int php_local_infile_read */int php_local_infile_read(void *ptr, char *buf, uint buf_len){ mysqli_local_infile *data; MY_MYSQL *mysql; zval ***callback_args; zval *retval; zval *fp; int argc = 4; int i; long rc; TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; mysql = data->userdata; /* default processing */ if (!mysql->li_read) { int count; count = (int)php_stream_read(mysql->li_stream, buf, buf_len); if (count < 0) { LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2)); } return count; } ALLOC_CALLBACK_ARGS(callback_args, 1, argc); /* set parameters: filepointer, buffer, buffer_len, errormsg */ MAKE_STD_ZVAL(fp); php_stream_to_zval(mysql->li_stream, fp); callback_args[0] = &fp; ZVAL_STRING(*callback_args[1], "", 1); ZVAL_LONG(*callback_args[2], buf_len); ZVAL_STRING(*callback_args[3], "", 1); if (call_user_function_ex(EG(function_table), NULL, mysql->li_read, &retval, argc, callback_args, 0, NULL TSRMLS_CC) == SUCCESS) { rc = Z_LVAL_P(retval); zval_ptr_dtor(&retval); if (rc > 0) { if (rc > buf_len) { /* check buffer overflow */ LOCAL_INFILE_ERROR_MSG(data->error_msg, "Read buffer too large"); rc = -1; } else { memcpy(buf, Z_STRVAL_P(*callback_args[1]), rc); } } if (rc < 0) { LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[3])); } } else { LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function"); rc = -1; } FREE_CALLBACK_ARGS(callback_args, 1, argc); efree(fp); return rc;}/* }}} *//* {{{ php_local_infile_error */int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len){ mysqli_local_infile *data = (mysqli_local_infile *) ptr; if (data) { strlcpy(error_msg, data->error_msg, error_msg_len); return 2000; } strlcpy(error_msg, ER(CR_OUT_OF_MEMORY), error_msg_len); return CR_OUT_OF_MEMORY;}/* }}} *//* {{{ php_local_infile_end */void php_local_infile_end(void *ptr) { mysqli_local_infile *data; MY_MYSQL *mysql; TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; if (!data || !(mysql = data->userdata)) { if (data) { free(data); } return; } php_stream_close(mysql->li_stream); free(data); return; }/* }}} */#endif/* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -