📄 mysqli_api.c
字号:
{ MY_MYSQL *mysql; zval *mysql_link; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);#if !defined(HAVE_MYSQLND) if (mysql->li_read) { efree(Z_STRVAL_P(mysql->li_read)); zval_dtor(mysql->li_read); mysql->li_read = NULL; }#else mysqlnd_local_infile_default(mysql->mysql);#endif}/* }}} *//* {{{ proto bool mysqli_set_local_infile_handler(object link, callback read_func) U Set callback functions for LOAD DATA LOCAL INFILE */PHP_FUNCTION(mysqli_set_local_infile_handler){ MY_MYSQL *mysql; zval *mysql_link; zval callback_name; zval *callback_func; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &mysql_link, mysqli_link_class_entry, &callback_func) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); if (UG(unicode)) { convert_to_string(callback_func); } /* check callback function */ if (!zend_is_callable(callback_func, 0, &callback_name)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %R", Z_TYPE(callback_name), Z_UNIVAL(callback_name)); zval_dtor(&callback_name); RETURN_FALSE; } zval_dtor(&callback_name); /* save callback function */#if !defined(HAVE_MYSQLND) ALLOC_ZVAL(mysql->li_read); ZVAL_STRING(mysql->li_read, callback_func->value.str.val, 1);#else mysqlnd_set_local_infile_handler(mysql->mysql, callback_func->value.str.val);#endif RETURN_TRUE;}/* }}} *//* {{{ proto bool mysqli_more_results(object link) U check if there any more query results from a multi query */PHP_FUNCTION(mysqli_more_results){ MY_MYSQL *mysql; zval *mysql_link; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); RETURN_BOOL(mysql_more_results(mysql->mysql));}/* }}} *//* {{{ proto bool mysqli_next_result(object link) U read next result from multi_query */PHP_FUNCTION(mysqli_next_result) { MY_MYSQL *mysql; zval *mysql_link; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); if (!mysql_more_results(mysql->mysql)) { php_error_docref(NULL TSRMLS_CC, E_STRICT, "There is no next result set. " "Please, call mysqli_more_results()/mysqli::more_results() to check " "whether to call this function/method"); } RETURN_BOOL(!mysql_next_result(mysql->mysql));}/* }}} *//* {{{ proto int mysqli_num_fields(object result) U Get number of fields in result */PHP_FUNCTION(mysqli_num_fields){ MYSQL_RES *result; zval *mysql_result; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); RETURN_LONG(mysql_num_fields(result));}/* }}} *//* {{{ proto mixed mysqli_num_rows(object result) U Get number of rows in result */PHP_FUNCTION(mysqli_num_rows){ MYSQL_RES *result; zval *mysql_result; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);#if !defined(HAVE_MYSQLND) if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT)#else if (result->conn)#endif { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT"); RETURN_LONG(0); } MYSQLI_RETURN_LONG_LONG(mysql_num_rows(result));}/* }}} *//* {{{ proto bool mysqli_options(object link, int flags, mixed values) U Set options */PHP_FUNCTION(mysqli_options){ MY_MYSQL *mysql; zval *mysql_link = NULL; zval *mysql_value; long mysql_option; unsigned int l_value; long ret; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); switch (Z_TYPE_PP(&mysql_value)) { case IS_UNICODE: zval_unicode_to_string(mysql_value TSRMLS_CC); case IS_STRING: ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value)); break; default: convert_to_long_ex(&mysql_value); l_value = Z_LVAL_PP(&mysql_value); ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value); break; } RETURN_BOOL(!ret);} /* }}} *//* {{{ proto bool mysqli_ping(object link) U Ping a server connection or reconnect if there is no connection */PHP_FUNCTION(mysqli_ping){ MY_MYSQL *mysql; zval *mysql_link; long rc; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); rc = mysql_ping(mysql->mysql); MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_BOOL(!rc);}/* }}} *//* {{{ proto mixed mysqli_prepare(object link, string query) U Prepare a SQL statement for execution */PHP_FUNCTION(mysqli_prepare){ MY_MYSQL *mysql; MY_STMT *stmt; char *query; int query_len; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&",&mysql_link, mysqli_link_class_entry, &query, &query_len, UG(utf8_conv)) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);#if !defined(HAVE_MYSQLND) if (mysql->mysql->status == MYSQL_STATUS_GET_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "All data must be fetched before a new statement prepare takes place"); RETURN_FALSE; }#endif stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT)); if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) { if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {#if !defined(HAVE_MYSQLND) char last_error[MYSQL_ERRMSG_SIZE]; char sqlstate[SQLSTATE_LENGTH+1]; unsigned int last_errno; /* mysql_stmt_close() (libmysql) clears errors, so we have to store them temporarily */ last_errno = stmt->stmt->last_errno; memcpy(last_error, stmt->stmt->last_error, MYSQL_ERRMSG_SIZE); memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);#endif mysqli_stmt_close(stmt->stmt, FALSE); stmt->stmt = NULL;#if !defined(HAVE_MYSQLND) /* restore error messages */ mysql->mysql->net.last_errno = last_errno; memcpy(mysql->mysql->net.last_error, last_error, MYSQL_ERRMSG_SIZE); memcpy(mysql->mysql->net.sqlstate, sqlstate, SQLSTATE_LENGTH+1);#endif } } /* don't initialize stmt->query with NULL, we ecalloc()-ed the memory */ /* Get performance boost if reporting is switched off */ if (stmt->stmt && query_len && (MyG(report_mode) & MYSQLI_REPORT_INDEX)) { stmt->query = (char *)emalloc(query_len + 1); memcpy(stmt->query, query, query_len); stmt->query[query_len] = '\0'; } /* don't join to the previous if because it won't work if mysql_stmt_prepare_fails */ if (!stmt->stmt) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); efree(stmt); RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)stmt; /* change status */ mysqli_resource->status = MYSQLI_STATUS_VALID; MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);}/* }}} *//* {{{ proto bool mysqli_real_connect(object link [,string hostname [,string username [,string passwd [,string dbname [,int port [,string socket [,int flags]]]]]]]) U Open a connection to a mysql server */ PHP_FUNCTION(mysqli_real_connect){ MY_MYSQL *mysql; char *hostname, *username, *passwd, *dbname, *socket; int hostname_len, username_len, passwd_len = 0, dbname_len, socket_len = 0; unsigned long port=0, flags=0; zval *mysql_link; /* optional parameters have to be initialized */ hostname = username = dbname = passwd = socket = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|s&s&s&s&ls&l", &mysql_link, mysqli_link_class_entry, &hostname, &hostname_len, UG(utf8_conv), &username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv), &dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv), &flags) == FAILURE) { return; } if (!socket_len) { socket = NULL; } if (!passwd) { passwd = MyG(default_pw); passwd_len = strlen(passwd); } if (!username){ username = MyG(default_user); } if (!hostname) { hostname = MyG(default_host); } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); /* remove some insecure options */ flags ^= CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */ if (PG(open_basedir) && strlen(PG(open_basedir))) { flags ^= CLIENT_LOCAL_FILES; }#if !defined(HAVE_MYSQLND) if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname ,port, socket ,flags) == NULL) #else if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len, port, socket, flags, MyG(mysqlnd_zval_cache) TSRMLS_CC) == NULL)#endif { php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC); php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC, "%s", mysql_error(mysql->mysql)); /* change status */ MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_INITIALIZED); RETURN_FALSE; } php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC);#if !defined(HAVE_MYSQLND) mysql->mysql->reconnect = MyG(reconnect); /* set our own local_infile handler */ php_set_local_infile_handler_default(mysql);#endif /* change status */ MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_VALID); RETURN_TRUE;}/* }}} *//* {{{ proto bool mysqli_real_query(object link, string query) U Binary-safe version of mysql_query() */PHP_FUNCTION(mysqli_real_query){ MY_MYSQL *mysql; zval *mysql_link; char *query; int query_len; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, &query, &query_len, UG(utf8_conv)) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); MYSQLI_DISABLE_MQ; /* disable multi statements/queries */ if (mysql_real_query(mysql->mysql, query, query_len)) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETVAL_FALSE; } else { if (!mysql_field_count(mysql->mysql)) { if (MyG(report_mode) & MYSQLI_REPORT_INDEX) { php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC); } } RETVAL_TRUE; }}/* }}} *//* {{{ proto string mysqli_real_escape_string(object link, string escapestr) U Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection */PHP_FUNCTION(mysqli_real_escape_string) { MY_MYSQL *mysql; zval *mysql_link = NULL; char *escapestr; int escapestr_len; char *newstr; int newstr_len; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len, UG(utf8_conv)) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); newstr = safe_emalloc(2, escapestr_len, 1); newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr, escapestr_len); newstr = erealloc(newstr, newstr_len + 1); RETURN_UTF8_STRING(newstr, ZSTR_AUTOFREE);}/* }}} *//* {{{ proto bool mysqli_rollback(object link) U Undo actions from current transaction */PHP_FUNCTION(mysqli_rollback){ MY_MYSQL *mysql; zval *mysql_link; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID); if (mysql_rollback(mysql->mysql)) { RETURN_FALSE; } RETURN_TRUE;}/* }}} *//* {{{ proto bool mysqli_stmt_send_long_data(object stmt, int param_nr, string data) U*/PHP_FUNCTION(mysqli_stmt_send_long_data){ MY_STMT *stmt; zval *mysql_stmt; long param_nr; char *data; int data_len; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols&", &mysql_stmt, mysqli_stmt_class_entry, ¶m_nr, &data, &data_len, UG(utf8_conv)) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID); if (param_nr < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number"); RETURN_FALSE; } if (mysql_stmt_send_long_data(stmt->stmt, param_nr, data, data_len)) { RETURN_FALSE; } else { RETURN_TRUE; }}/* }}} *//* {{{ proto mixed mysqli_stmt_affected_rows(object stmt) U
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -