📄 php_mysql.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Zeev Suraski <zeev@zend.com> | | Zak Greant <zak@mysql.com> | | Georg Richter <georg@php.net> | +----------------------------------------------------------------------+*/ /* $Id: php_mysql.c,v 1.174.2.29.2.3 2007/01/01 09:46:45 sebastian Exp $ *//* TODO: * * ? Safe mode implementation */#ifdef HAVE_CONFIG_H# include "config.h"#endif#include "php.h"#include "php_globals.h"#include "ext/standard/info.h"#include "ext/standard/php_string.h"#if HAVE_MYSQL#ifdef PHP_WIN32# include <winsock.h># define signal(a, b) NULL#elif defined(NETWARE)# include <sys/socket.h># define signal(a, b) NULL#else# if HAVE_SIGNAL_H# include <signal.h># endif# if HAVE_SYS_TYPES_H# include <sys/types.h># endif# include <netdb.h># include <netinet/in.h># if HAVE_ARPA_INET_H# include <arpa/inet.h># endif#endif#include <mysql.h>#include "php_ini.h"#include "php_mysql.h"/* True globals, no need for thread safety */static int le_result, le_link, le_plink;#ifdef HAVE_MYSQL_REAL_CONNECT# ifdef HAVE_ERRMSG_H# include <errmsg.h># endif#endif#define SAFE_STRING(s) ((s)?(s):"")#if MYSQL_VERSION_ID > 32199# define mysql_row_length_type unsigned long# define HAVE_MYSQL_ERRNO#else# define mysql_row_length_type unsigned int# ifdef mysql_errno# define HAVE_MYSQL_ERRNO# endif#endif#if MYSQL_VERSION_ID >= 32032#define HAVE_GETINFO_FUNCS#endif#if MYSQL_VERSION_ID > 32133 || defined(FIELD_TYPE_TINY)#define MYSQL_HAS_TINY#endif#if MYSQL_VERSION_ID >= 32200#define MYSQL_HAS_YEAR#endif#define MYSQL_ASSOC 1<<0#define MYSQL_NUM 1<<1#define MYSQL_BOTH (MYSQL_ASSOC|MYSQL_NUM)#define MYSQL_USE_RESULT 0#define MYSQL_STORE_RESULT 1#if MYSQL_VERSION_ID < 32224#define PHP_MYSQL_VALID_RESULT(mysql) \ (mysql_num_fields(mysql)>0)#else#define PHP_MYSQL_VALID_RESULT(mysql) \ (mysql_field_count(mysql)>0)#endiftypedef struct _php_mysql_conn { MYSQL conn; int active_result_id;} php_mysql_conn;/* {{{ mysql_functions[] */function_entry mysql_functions[] = { PHP_FE(mysql_connect, NULL) PHP_FE(mysql_pconnect, NULL) PHP_FE(mysql_close, NULL) PHP_FE(mysql_select_db, NULL)#ifndef NETWARE /* The below two functions not supported on NetWare */#if MYSQL_VERSION_ID < 40000 PHP_FE(mysql_create_db, NULL) PHP_FE(mysql_drop_db, NULL)#endif#endif /* NETWARE */ PHP_FE(mysql_query, NULL) PHP_FE(mysql_unbuffered_query, NULL) PHP_FE(mysql_db_query, NULL) PHP_FE(mysql_list_dbs, NULL) PHP_FE(mysql_list_tables, NULL) PHP_FE(mysql_list_fields, NULL) PHP_FE(mysql_list_processes, NULL) PHP_FE(mysql_error, NULL)#ifdef HAVE_MYSQL_ERRNO PHP_FE(mysql_errno, NULL)#endif PHP_FE(mysql_affected_rows, NULL) PHP_FE(mysql_insert_id, NULL) PHP_FE(mysql_result, NULL) PHP_FE(mysql_num_rows, NULL) PHP_FE(mysql_num_fields, NULL) PHP_FE(mysql_fetch_row, NULL) PHP_FE(mysql_fetch_array, NULL) PHP_FE(mysql_fetch_assoc, NULL) PHP_FE(mysql_fetch_object, NULL) PHP_FE(mysql_data_seek, NULL) PHP_FE(mysql_fetch_lengths, NULL) PHP_FE(mysql_fetch_field, NULL) PHP_FE(mysql_field_seek, NULL) PHP_FE(mysql_free_result, NULL) PHP_FE(mysql_field_name, NULL) PHP_FE(mysql_field_table, NULL) PHP_FE(mysql_field_len, NULL) PHP_FE(mysql_field_type, NULL) PHP_FE(mysql_field_flags, NULL) PHP_FE(mysql_escape_string, NULL) PHP_FE(mysql_real_escape_string, NULL) PHP_FE(mysql_stat, NULL) PHP_FE(mysql_thread_id, NULL) PHP_FE(mysql_client_encoding, NULL) PHP_FE(mysql_ping, NULL)#ifdef HAVE_GETINFO_FUNCS PHP_FE(mysql_get_client_info, NULL) PHP_FE(mysql_get_host_info, NULL) PHP_FE(mysql_get_proto_info, NULL) PHP_FE(mysql_get_server_info, NULL)#endif PHP_FE(mysql_info, NULL) /* for downwards compatability */ PHP_FALIAS(mysql, mysql_db_query, NULL) PHP_FALIAS(mysql_fieldname, mysql_field_name, NULL) PHP_FALIAS(mysql_fieldtable, mysql_field_table, NULL) PHP_FALIAS(mysql_fieldlen, mysql_field_len, NULL) PHP_FALIAS(mysql_fieldtype, mysql_field_type, NULL) PHP_FALIAS(mysql_fieldflags, mysql_field_flags, NULL) PHP_FALIAS(mysql_selectdb, mysql_select_db, NULL)#ifndef NETWARE /* The below two functions not supported on NetWare */#if MYSQL_VERSION_ID < 40000 PHP_FALIAS(mysql_createdb, mysql_create_db, NULL) PHP_FALIAS(mysql_dropdb, mysql_drop_db, NULL)#endif#endif /* NETWARE */ PHP_FALIAS(mysql_freeresult, mysql_free_result, NULL) PHP_FALIAS(mysql_numfields, mysql_num_fields, NULL) PHP_FALIAS(mysql_numrows, mysql_num_rows, NULL) PHP_FALIAS(mysql_listdbs, mysql_list_dbs, NULL) PHP_FALIAS(mysql_listtables, mysql_list_tables, NULL) PHP_FALIAS(mysql_listfields, mysql_list_fields, NULL) PHP_FALIAS(mysql_db_name, mysql_result, NULL) PHP_FALIAS(mysql_dbname, mysql_result, NULL) PHP_FALIAS(mysql_tablename, mysql_result, NULL) PHP_FALIAS(mysql_table_name, mysql_result, NULL) {NULL, NULL, NULL}};/* }}} *//* {{{ mysql_module_entry */zend_module_entry mysql_module_entry = { STANDARD_MODULE_HEADER, "mysql", mysql_functions, ZEND_MODULE_STARTUP_N(mysql), PHP_MSHUTDOWN(mysql), PHP_RINIT(mysql), PHP_RSHUTDOWN(mysql), PHP_MINFO(mysql), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};/* }}} */ZEND_DECLARE_MODULE_GLOBALS(mysql)#ifdef COMPILE_DL_MYSQLZEND_GET_MODULE(mysql)#endifvoid timeout(int sig);#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }#define PHPMY_UNBUFFERED_QUERY_CHECK() \{ \ if (mysql->active_result_id) { \ do { \ int type; \ MYSQL_RES *mysql_result; \ \ mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \ if (mysql_result && type==le_result) { \ if (!mysql_eof(mysql_result)) { \ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \ while (mysql_fetch_row(mysql_result)); \ } \ zend_list_delete(mysql->active_result_id); \ mysql->active_result_id = 0; \ } \ } while(0); \ } \} \/* {{{ _free_mysql_result * This wrapper is required since mysql_free_result() returns an integer, and * thus, cannot be used directly */static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC){ MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr; mysql_free_result(mysql_result); MySG(result_allocated)--;}/* }}} *//* {{{ php_mysql_set_default_link */static void php_mysql_set_default_link(int id TSRMLS_DC){ if (MySG(default_link) != -1) { zend_list_delete(MySG(default_link)); } MySG(default_link) = id; zend_list_addref(id);}/* }}} *//* {{{ php_mysql_select_db*/static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC){ PHPMY_UNBUFFERED_QUERY_CHECK(); if (mysql_select_db(&mysql->conn, db) != 0) { return 0; } else { return 1; }}/* }}} *//* {{{ _close_mysql_link */static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC){ php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr; void (*handler) (int); handler = signal(SIGPIPE, SIG_IGN); mysql_close(&link->conn); signal(SIGPIPE, handler); efree(link); MySG(num_links)--;}/* }}} *//* {{{ _close_mysql_plink */static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC){ php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr; void (*handler) (int); handler = signal(SIGPIPE, SIG_IGN); mysql_close(&link->conn); signal(SIGPIPE, handler); free(link); MySG(num_persistent)--; MySG(num_links)--;}/* }}} *//* {{{ PHP_INI_MH */static PHP_INI_MH(OnMySQLPort){ if (new_value==NULL) { /* default port */#if !defined(PHP_WIN32) && !defined(NETWARE) struct servent *serv_ptr; char *env; MySG(default_port) = MYSQL_PORT; if ((serv_ptr = getservbyname("mysql", "tcp"))) { MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port); } if ((env = getenv("MYSQL_TCP_PORT"))) { MySG(default_port) = (uint) atoi(env); }#else MySG(default_port) = MYSQL_PORT;#endif } else { MySG(default_port) = atoi(new_value); } return SUCCESS;}/* }}} *//* {{{ PHP_INI */PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("mysql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_mysql_globals, mysql_globals) STD_PHP_INI_ENTRY_EX("mysql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_mysql_globals, mysql_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX("mysql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, zend_mysql_globals, mysql_globals, display_link_numbers) STD_PHP_INI_ENTRY("mysql.default_host", NULL, PHP_INI_ALL, OnUpdateString, default_host, zend_mysql_globals, mysql_globals) STD_PHP_INI_ENTRY("mysql.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_mysql_globals, mysql_globals) STD_PHP_INI_ENTRY("mysql.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, zend_mysql_globals, mysql_globals) PHP_INI_ENTRY("mysql.default_port", NULL, PHP_INI_ALL, OnMySQLPort) STD_PHP_INI_ENTRY("mysql.default_socket", NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_socket, zend_mysql_globals, mysql_globals) STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateInt, connect_timeout, zend_mysql_globals, mysql_globals) STD_PHP_INI_BOOLEAN("mysql.trace_mode", "0", PHP_INI_ALL, OnUpdateInt, trace_mode, zend_mysql_globals, mysql_globals)PHP_INI_END()/* }}} *//* {{{ php_mysql_init_globals */static void php_mysql_init_globals(zend_mysql_globals *mysql_globals){ mysql_globals->num_persistent = 0; mysql_globals->default_socket = NULL; mysql_globals->default_host = NULL; mysql_globals->default_user = NULL; mysql_globals->default_password = NULL; mysql_globals->connect_errno = 0; mysql_globals->connect_error = NULL; mysql_globals->connect_timeout = 0; mysql_globals->trace_mode = 0; mysql_globals->result_allocated = 0;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */ZEND_MODULE_STARTUP_D(mysql){ ZEND_INIT_MODULE_GLOBALS(mysql, php_mysql_init_globals, NULL); REGISTER_INI_ENTRIES(); le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number); le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number); le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number); Z_TYPE(mysql_module_entry) = type; REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);#if MYSQL_VERSION_ID >= 40000 REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);#endif REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); #ifdef ZTS# if MYSQL_VERSION_ID >= 40000 mysql_thread_init();# endif#endif return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(mysql){#ifdef ZTS# if MYSQL_VERSION_ID >= 40000 mysql_thread_end();# endif#endif UNREGISTER_INI_ENTRIES(); return SUCCESS;}/* }}} *//* {{{ PHP_RINIT_FUNCTION */PHP_RINIT_FUNCTION(mysql){ MySG(default_link)=-1; MySG(num_links) = MySG(num_persistent); /* Reset connect error/errno on every request */ MySG(connect_error) = NULL; MySG(connect_errno) =0; MySG(result_allocated) = 0; return SUCCESS;}/* }}} *//* {{{ PHP_RSHUTDOWN_FUNCTION */PHP_RSHUTDOWN_FUNCTION(mysql){ if (MySG(trace_mode)) { if (MySG(result_allocated)){ php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, "%lu result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query()", MySG(result_allocated)); } } if (MySG(connect_error)!=NULL) { efree(MySG(connect_error)); } return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(mysql){ char buf[32]; php_info_print_table_start(); php_info_print_table_header(2, "MySQL Support", "enabled"); sprintf(buf, "%ld", MySG(num_persistent)); php_info_print_table_row(2, "Active Persistent Links", buf); sprintf(buf, "%ld", MySG(num_links)); php_info_print_table_row(2, "Active Links", buf); php_info_print_table_row(2, "Client API version", mysql_get_client_info());#if !defined (PHP_WIN32) && !defined (NETWARE) php_info_print_table_row(2, "MYSQL_MODULE_TYPE", PHP_MYSQL_TYPE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -