You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2346 lines
63 KiB

25 years ago
25 years ago
27 years ago
27 years ago
25 years ago
27 years ago
27 years ago
27 years ago
27 years ago
27 years ago
27 years ago
27 years ago
27 years ago
27 years ago
25 years ago
27 years ago
27 years ago
27 years ago
27 years ago
24 years ago
25 years ago
27 years ago
27 years ago
27 years ago
25 years ago
25 years ago
25 years ago
27 years ago
27 years ago
27 years ago
24 years ago
24 years ago
26 years ago
26 years ago
26 years ago
25 years ago
25 years ago
25 years ago
27 years ago
25 years ago
27 years ago
25 years ago
25 years ago
25 years ago
25 years ago
26 years ago
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 4 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2002 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 2.02 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available at through the world-wide-web at |
  10. | http://www.php.net/license/2_02.txt. |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Zeev Suraski <zeev@zend.com> |
  16. | Zak Greant <zak@mysql.com> |
  17. | Georg Richter <georg@php.net> |
  18. +----------------------------------------------------------------------+
  19. */
  20. /* $Id$ */
  21. /* TODO:
  22. *
  23. * ? Safe mode implementation
  24. */
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28. #include "php.h"
  29. #include "php_globals.h"
  30. #include "ext/standard/info.h"
  31. #include "ext/standard/php_string.h"
  32. #if HAVE_MYSQL
  33. #ifdef PHP_WIN32
  34. # include <winsock.h>
  35. # define signal(a, b) NULL
  36. #elif defined(NETWARE)
  37. # include <sys/socket.h>
  38. # define signal(a, b) NULL
  39. #else
  40. # include "build-defs.h"
  41. # if HAVE_SIGNAL_H
  42. # include <signal.h>
  43. # endif
  44. # if HAVE_SYS_TYPES_H
  45. # include <sys/types.h>
  46. # endif
  47. # include <netdb.h>
  48. # include <netinet/in.h>
  49. #endif
  50. #include <mysql.h>
  51. #include "php_ini.h"
  52. #include "php_mysql.h"
  53. /* True globals, no need for thread safety */
  54. static int le_result, le_link, le_plink;
  55. #ifdef HAVE_MYSQL_REAL_CONNECT
  56. # ifdef HAVE_ERRMSG_H
  57. # include <errmsg.h>
  58. # endif
  59. #endif
  60. #define SAFE_STRING(s) ((s)?(s):"")
  61. #if MYSQL_VERSION_ID > 32199
  62. # define mysql_row_length_type unsigned long
  63. # define HAVE_MYSQL_ERRNO
  64. #else
  65. # define mysql_row_length_type unsigned int
  66. # ifdef mysql_errno
  67. # define HAVE_MYSQL_ERRNO
  68. # endif
  69. #endif
  70. #if MYSQL_VERSION_ID >= 32032
  71. #define HAVE_GETINFO_FUNCS
  72. #endif
  73. #if MYSQL_VERSION_ID > 32133 || defined(FIELD_TYPE_TINY)
  74. #define MYSQL_HAS_TINY
  75. #endif
  76. #if MYSQL_VERSION_ID >= 32200
  77. #define MYSQL_HAS_YEAR
  78. #endif
  79. #define MYSQL_ASSOC 1<<0
  80. #define MYSQL_NUM 1<<1
  81. #define MYSQL_BOTH (MYSQL_ASSOC|MYSQL_NUM)
  82. #define MYSQL_USE_RESULT 0
  83. #define MYSQL_STORE_RESULT 1
  84. #if MYSQL_VERSION_ID < 32223
  85. #define PHP_MYSQL_VALID_RESULT(mysql) \
  86. (mysql_num_fields(mysql)>0)
  87. #else
  88. #define PHP_MYSQL_VALID_RESULT(mysql) \
  89. (mysql_field_count(mysql)>0)
  90. #endif
  91. typedef struct _php_mysql_conn {
  92. MYSQL conn;
  93. int active_result_id;
  94. } php_mysql_conn;
  95. /* {{{ mysql_functions[]
  96. */
  97. function_entry mysql_functions[] = {
  98. PHP_FE(mysql_connect, NULL)
  99. PHP_FE(mysql_pconnect, NULL)
  100. PHP_FE(mysql_close, NULL)
  101. PHP_FE(mysql_select_db, NULL)
  102. #ifndef NETWARE /* The below two functions not supported on NetWare */
  103. #if MYSQL_VERSION_ID < 40000
  104. PHP_FE(mysql_create_db, NULL)
  105. PHP_FE(mysql_drop_db, NULL)
  106. #endif
  107. #endif /* NETWARE */
  108. PHP_FE(mysql_query, NULL)
  109. PHP_FE(mysql_unbuffered_query, NULL)
  110. PHP_FE(mysql_db_query, NULL)
  111. PHP_FE(mysql_list_dbs, NULL)
  112. PHP_FE(mysql_list_tables, NULL)
  113. PHP_FE(mysql_list_fields, NULL)
  114. PHP_FE(mysql_list_processes, NULL)
  115. PHP_FE(mysql_error, NULL)
  116. #ifdef HAVE_MYSQL_ERRNO
  117. PHP_FE(mysql_errno, NULL)
  118. #endif
  119. PHP_FE(mysql_affected_rows, NULL)
  120. PHP_FE(mysql_insert_id, NULL)
  121. PHP_FE(mysql_result, NULL)
  122. PHP_FE(mysql_num_rows, NULL)
  123. PHP_FE(mysql_num_fields, NULL)
  124. PHP_FE(mysql_fetch_row, NULL)
  125. PHP_FE(mysql_fetch_array, NULL)
  126. PHP_FE(mysql_fetch_assoc, NULL)
  127. PHP_FE(mysql_fetch_object, NULL)
  128. PHP_FE(mysql_data_seek, NULL)
  129. PHP_FE(mysql_fetch_lengths, NULL)
  130. PHP_FE(mysql_fetch_field, NULL)
  131. PHP_FE(mysql_field_seek, NULL)
  132. PHP_FE(mysql_free_result, NULL)
  133. PHP_FE(mysql_field_name, NULL)
  134. PHP_FE(mysql_field_table, NULL)
  135. PHP_FE(mysql_field_len, NULL)
  136. PHP_FE(mysql_field_type, NULL)
  137. PHP_FE(mysql_field_flags, NULL)
  138. PHP_FE(mysql_escape_string, NULL)
  139. PHP_FE(mysql_real_escape_string, NULL)
  140. PHP_FE(mysql_stat, NULL)
  141. PHP_FE(mysql_thread_id, NULL)
  142. PHP_FE(mysql_character_set_name, NULL)
  143. PHP_FE(mysql_ping, NULL)
  144. #ifdef HAVE_GETINFO_FUNCS
  145. PHP_FE(mysql_get_client_info, NULL)
  146. PHP_FE(mysql_get_host_info, NULL)
  147. PHP_FE(mysql_get_proto_info, NULL)
  148. PHP_FE(mysql_get_server_info, NULL)
  149. #endif
  150. PHP_FE(mysql_info, NULL)
  151. /* for downwards compatability */
  152. PHP_FALIAS(mysql, mysql_db_query, NULL)
  153. PHP_FALIAS(mysql_fieldname, mysql_field_name, NULL)
  154. PHP_FALIAS(mysql_fieldtable, mysql_field_table, NULL)
  155. PHP_FALIAS(mysql_fieldlen, mysql_field_len, NULL)
  156. PHP_FALIAS(mysql_fieldtype, mysql_field_type, NULL)
  157. PHP_FALIAS(mysql_fieldflags, mysql_field_flags, NULL)
  158. PHP_FALIAS(mysql_selectdb, mysql_select_db, NULL)
  159. #ifndef NETWARE /* The below two functions not supported on NetWare */
  160. #if MYSQL_VERSION_ID < 40000
  161. PHP_FALIAS(mysql_createdb, mysql_create_db, NULL)
  162. PHP_FALIAS(mysql_dropdb, mysql_drop_db, NULL)
  163. #endif
  164. #endif /* NETWARE */
  165. PHP_FALIAS(mysql_freeresult, mysql_free_result, NULL)
  166. PHP_FALIAS(mysql_numfields, mysql_num_fields, NULL)
  167. PHP_FALIAS(mysql_numrows, mysql_num_rows, NULL)
  168. PHP_FALIAS(mysql_listdbs, mysql_list_dbs, NULL)
  169. PHP_FALIAS(mysql_listtables, mysql_list_tables, NULL)
  170. PHP_FALIAS(mysql_listfields, mysql_list_fields, NULL)
  171. PHP_FALIAS(mysql_db_name, mysql_result, NULL)
  172. PHP_FALIAS(mysql_dbname, mysql_result, NULL)
  173. PHP_FALIAS(mysql_tablename, mysql_result, NULL)
  174. PHP_FALIAS(mysql_table_name, mysql_result, NULL)
  175. {NULL, NULL, NULL}
  176. };
  177. /* }}} */
  178. /* {{{ mysql_module_entry
  179. */
  180. zend_module_entry mysql_module_entry = {
  181. STANDARD_MODULE_HEADER,
  182. "mysql",
  183. mysql_functions,
  184. ZEND_MODULE_STARTUP_N(mysql),
  185. PHP_MSHUTDOWN(mysql),
  186. PHP_RINIT(mysql),
  187. PHP_RSHUTDOWN(mysql),
  188. PHP_MINFO(mysql),
  189. NO_VERSION_YET,
  190. STANDARD_MODULE_PROPERTIES
  191. };
  192. /* }}} */
  193. ZEND_DECLARE_MODULE_GLOBALS(mysql)
  194. #ifdef COMPILE_DL_MYSQL
  195. ZEND_GET_MODULE(mysql)
  196. #endif
  197. void timeout(int sig);
  198. #define CHECK_LINK(link) { if (link==-1) { php_error(E_WARNING, "%s(): A link to the server could not be established", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } }
  199. /* {{{ _rollback_mysql_transactions
  200. */
  201. static int _rollback_mysql_transactions(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  202. {
  203. php_mysql_conn *link;
  204. char query[128];
  205. /* check if its a persistent link */
  206. if (Z_TYPE_P(rsrc) != le_plink)
  207. return 0;
  208. link = (php_mysql_conn *) rsrc->ptr;
  209. /* rollback possible transactions */
  210. strcpy (query, "ROLLBACK");
  211. mysql_real_query(&link->conn, query, strlen(query));
  212. return 0;
  213. }
  214. /* }}} */
  215. /* {{{ _free_mysql_result
  216. * This wrapper is required since mysql_free_result() returns an integer, and
  217. * thus, cannot be used directly
  218. */
  219. static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  220. {
  221. MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr;
  222. mysql_free_result(mysql_result);
  223. }
  224. /* }}} */
  225. /* {{{ php_mysql_set_default_link
  226. */
  227. static void php_mysql_set_default_link(int id TSRMLS_DC)
  228. {
  229. if (MySG(default_link)!=-1) {
  230. zend_list_delete(MySG(default_link));
  231. }
  232. MySG(default_link) = id;
  233. zend_list_addref(id);
  234. }
  235. /* }}} */
  236. /* {{{ _close_mysql_link
  237. */
  238. static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  239. {
  240. php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;
  241. void (*handler) (int);
  242. handler = signal(SIGPIPE, SIG_IGN);
  243. mysql_close(&link->conn);
  244. signal(SIGPIPE, handler);
  245. efree(link);
  246. MySG(num_links)--;
  247. }
  248. /* }}} */
  249. /* {{{ _close_mysql_plink
  250. */
  251. static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
  252. {
  253. php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;
  254. void (*handler) (int);
  255. handler = signal(SIGPIPE, SIG_IGN);
  256. mysql_close(&link->conn);
  257. signal(SIGPIPE, handler);
  258. free(link);
  259. MySG(num_persistent)--;
  260. MySG(num_links)--;
  261. }
  262. /* }}} */
  263. /* {{{ PHP_INI_MH
  264. */
  265. static PHP_INI_MH(OnMySQLPort)
  266. {
  267. if (new_value==NULL) { /* default port */
  268. #if !defined(PHP_WIN32) && !defined(NETWARE)
  269. struct servent *serv_ptr;
  270. char *env;
  271. MySG(default_port) = MYSQL_PORT;
  272. if ((serv_ptr = getservbyname("mysql", "tcp"))) {
  273. MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port);
  274. }
  275. if ((env = getenv("MYSQL_TCP_PORT"))) {
  276. MySG(default_port) = (uint) atoi(env);
  277. }
  278. #else
  279. MySG(default_port) = MYSQL_PORT;
  280. #endif
  281. } else {
  282. MySG(default_port) = atoi(new_value);
  283. }
  284. return SUCCESS;
  285. }
  286. /* }}} */
  287. /* {{{ PHP_INI */
  288. PHP_INI_BEGIN()
  289. STD_PHP_INI_BOOLEAN("mysql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_mysql_globals, mysql_globals)
  290. STD_PHP_INI_ENTRY_EX("mysql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_mysql_globals, mysql_globals, display_link_numbers)
  291. STD_PHP_INI_ENTRY_EX("mysql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, zend_mysql_globals, mysql_globals, display_link_numbers)
  292. STD_PHP_INI_ENTRY("mysql.default_host", NULL, PHP_INI_ALL, OnUpdateString, default_host, zend_mysql_globals, mysql_globals)
  293. STD_PHP_INI_ENTRY("mysql.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_mysql_globals, mysql_globals)
  294. STD_PHP_INI_ENTRY("mysql.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, zend_mysql_globals, mysql_globals)
  295. PHP_INI_ENTRY("mysql.default_port", NULL, PHP_INI_ALL, OnMySQLPort)
  296. STD_PHP_INI_ENTRY("mysql.default_socket", NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_socket, zend_mysql_globals, mysql_globals)
  297. STD_PHP_INI_ENTRY_EX("mysql.connect_timeout", "0", PHP_INI_SYSTEM, OnUpdateInt, connect_timeout, zend_mysql_globals, mysql_globals, display_link_numbers)
  298. PHP_INI_END()
  299. /* }}} */
  300. /* {{{ php_mysql_init_globals
  301. */
  302. static void php_mysql_init_globals(zend_mysql_globals *mysql_globals)
  303. {
  304. mysql_globals->num_persistent = 0;
  305. mysql_globals->default_socket = NULL;
  306. mysql_globals->default_host = NULL;
  307. mysql_globals->default_user = NULL;
  308. mysql_globals->default_password = NULL;
  309. mysql_globals->connect_errno = 0;
  310. mysql_globals->connect_error = NULL;
  311. mysql_globals->connect_timeout = 0;
  312. }
  313. /* }}} */
  314. /* {{{ PHP_MINIT_FUNCTION
  315. */
  316. ZEND_MODULE_STARTUP_D(mysql)
  317. {
  318. ZEND_INIT_MODULE_GLOBALS(mysql, php_mysql_init_globals, NULL);
  319. REGISTER_INI_ENTRIES();
  320. le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number);
  321. le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number);
  322. le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number);
  323. Z_TYPE(mysql_module_entry) = type;
  324. REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT);
  325. REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT);
  326. REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);
  327. REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
  328. REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
  329. REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
  330. REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
  331. #ifdef ZTS
  332. # if MYSQL_VERSION_ID >= 40000
  333. mysql_thread_init();
  334. # endif
  335. #endif
  336. return SUCCESS;
  337. }
  338. /* }}} */
  339. /* {{{ PHP_MSHUTDOWN_FUNCTION
  340. */
  341. PHP_MSHUTDOWN_FUNCTION(mysql)
  342. {
  343. #ifdef ZTS
  344. # if MYSQL_VERSION_ID >= 40000
  345. mysql_thread_end();
  346. # endif
  347. #endif
  348. UNREGISTER_INI_ENTRIES();
  349. return SUCCESS;
  350. }
  351. /* }}} */
  352. /* {{{ PHP_RINIT_FUNCTION
  353. */
  354. PHP_RINIT_FUNCTION(mysql)
  355. {
  356. MySG(default_link)=-1;
  357. MySG(num_links) = MySG(num_persistent);
  358. /* Reset connect error/errno on every request */
  359. MySG(connect_error) = NULL;
  360. MySG(connect_errno)=0;
  361. return SUCCESS;
  362. }
  363. /* }}} */
  364. /* {{{ PHP_RSHUTDOWN_FUNCTION
  365. */
  366. PHP_RSHUTDOWN_FUNCTION(mysql)
  367. {
  368. zend_hash_apply(&EG(persistent_list), (apply_func_t) _rollback_mysql_transactions TSRMLS_CC);
  369. if (MySG(connect_error)!=NULL) {
  370. efree(MySG(connect_error));
  371. }
  372. return SUCCESS;
  373. }
  374. /* }}} */
  375. /* {{{ PHP_MINFO_FUNCTION
  376. */
  377. PHP_MINFO_FUNCTION(mysql)
  378. {
  379. char buf[32];
  380. php_info_print_table_start();
  381. php_info_print_table_header(2, "MySQL Support", "enabled");
  382. sprintf(buf, "%ld", MySG(num_persistent));
  383. php_info_print_table_row(2, "Active Persistent Links", buf);
  384. sprintf(buf, "%ld", MySG(num_links));
  385. php_info_print_table_row(2, "Active Links", buf);
  386. php_info_print_table_row(2, "Client API version", mysql_get_client_info());
  387. #if !defined (PHP_WIN32) && !defined (NETWARE)
  388. php_info_print_table_row(2, "MYSQL_MODULE_TYPE", PHP_MYSQL_TYPE);
  389. php_info_print_table_row(2, "MYSQL_SOCKET", MYSQL_UNIX_ADDR);
  390. php_info_print_table_row(2, "MYSQL_INCLUDE", PHP_MYSQL_INCLUDE);
  391. php_info_print_table_row(2, "MYSQL_LIBS", PHP_MYSQL_LIBS);
  392. #endif
  393. php_info_print_table_end();
  394. DISPLAY_INI_ENTRIES();
  395. }
  396. /* }}} */
  397. /* {{{ php_mysql_do_connect
  398. */
  399. #define MYSQL_DO_CONNECT_CLEANUP() \
  400. if (free_host) { \
  401. efree(host); \
  402. }
  403. #define MYSQL_DO_CONNECT_RETURN_FALSE() \
  404. MYSQL_DO_CONNECT_CLEANUP(); \
  405. RETURN_FALSE;
  406. static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
  407. {
  408. char *user=NULL, *passwd=NULL, *host_and_port=NULL, *socket=NULL, *tmp=NULL, *host=NULL;
  409. char *hashed_details=NULL;
  410. int hashed_details_length, port = MYSQL_PORT;
  411. int client_flags = 0;
  412. php_mysql_conn *mysql=NULL;
  413. void (*handler) (int);
  414. zval **z_host=NULL, **z_user=NULL, **z_passwd=NULL, **z_new_link=NULL, **z_client_flags=NULL;
  415. zend_bool free_host=0, new_link=0;
  416. long connect_timeout;
  417. connect_timeout = MySG(connect_timeout);
  418. socket = MySG(default_socket);
  419. if (PG(sql_safe_mode)) {
  420. if (ZEND_NUM_ARGS()>0) {
  421. php_error(E_NOTICE, "%s(): SQL safe mode in effect - ignoring host/user/password information", get_active_function_name(TSRMLS_C));
  422. }
  423. host_and_port=passwd=NULL;
  424. user=php_get_current_user();
  425. hashed_details_length = strlen(user)+5+3;
  426. hashed_details = (char *) emalloc(hashed_details_length+1);
  427. sprintf(hashed_details, "mysql__%s_", user);
  428. client_flags = CLIENT_INTERACTIVE;
  429. } else {
  430. host_and_port = MySG(default_host);
  431. user = MySG(default_user);
  432. passwd = MySG(default_password);
  433. switch(ZEND_NUM_ARGS()) {
  434. case 0: /* defaults */
  435. break;
  436. case 1: {
  437. if (zend_get_parameters_ex(1, &z_host)==FAILURE) {
  438. MYSQL_DO_CONNECT_RETURN_FALSE();
  439. }
  440. }
  441. break;
  442. case 2: {
  443. if (zend_get_parameters_ex(2, &z_host, &z_user)==FAILURE) {
  444. MYSQL_DO_CONNECT_RETURN_FALSE();
  445. }
  446. convert_to_string_ex(z_user);
  447. user = Z_STRVAL_PP(z_user);
  448. }
  449. break;
  450. case 3: {
  451. if (zend_get_parameters_ex(3, &z_host, &z_user, &z_passwd) == FAILURE) {
  452. MYSQL_DO_CONNECT_RETURN_FALSE();
  453. }
  454. convert_to_string_ex(z_user);
  455. convert_to_string_ex(z_passwd);
  456. user = Z_STRVAL_PP(z_user);
  457. passwd = Z_STRVAL_PP(z_passwd);
  458. }
  459. break;
  460. case 4: {
  461. if (!persistent) {
  462. if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_new_link) == FAILURE) {
  463. MYSQL_DO_CONNECT_RETURN_FALSE();
  464. }
  465. convert_to_string_ex(z_user);
  466. convert_to_string_ex(z_passwd);
  467. user = Z_STRVAL_PP(z_user);
  468. passwd = Z_STRVAL_PP(z_passwd);
  469. new_link = Z_BVAL_PP(z_new_link);
  470. }
  471. else {
  472. if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_client_flags) == FAILURE) {
  473. MYSQL_DO_CONNECT_RETURN_FALSE();
  474. }
  475. convert_to_string_ex(z_user);
  476. convert_to_string_ex(z_passwd);
  477. user = Z_STRVAL_PP(z_user);
  478. passwd = Z_STRVAL_PP(z_passwd);
  479. client_flags = Z_LVAL_PP(z_client_flags);
  480. }
  481. }
  482. break;
  483. case 5: {
  484. if (zend_get_parameters_ex(5, &z_host, &z_user, &z_passwd, &z_new_link, &z_client_flags) == FAILURE) {
  485. MYSQL_DO_CONNECT_RETURN_FALSE();
  486. }
  487. convert_to_string_ex(z_user);
  488. convert_to_string_ex(z_passwd);
  489. user = Z_STRVAL_PP(z_user);
  490. passwd = Z_STRVAL_PP(z_passwd);
  491. new_link = Z_BVAL_PP(z_new_link);
  492. client_flags = Z_LVAL_PP(z_client_flags);
  493. }
  494. break;
  495. default:
  496. WRONG_PARAM_COUNT;
  497. break;
  498. }
  499. if (z_host) {
  500. SEPARATE_ZVAL(z_host); /* We may modify z_host if it contains a port, separate */
  501. convert_to_string_ex(z_host);
  502. host_and_port = Z_STRVAL_PP(z_host);
  503. if (z_user) {
  504. convert_to_string_ex(z_user);
  505. user = Z_STRVAL_PP(z_user);
  506. if (z_passwd) {
  507. convert_to_string_ex(z_passwd);
  508. passwd = Z_STRVAL_PP(z_passwd);
  509. }
  510. }
  511. }
  512. hashed_details_length = sizeof("mysql___")-1 + strlen(SAFE_STRING(host_and_port))+strlen(SAFE_STRING(user))+strlen(SAFE_STRING(passwd));
  513. hashed_details = (char *) emalloc(hashed_details_length+1);
  514. sprintf(hashed_details, "mysql_%s_%s_%s", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd));
  515. }
  516. /* We cannot use mysql_port anymore in windows, need to use
  517. * mysql_real_connect() to set the port.
  518. */
  519. if (host_and_port && (tmp=strchr(host_and_port, ':'))) {
  520. host = estrndup(host_and_port, tmp-host_and_port);
  521. free_host = 1;
  522. tmp++;
  523. if (tmp[0] != '/') {
  524. port = atoi(tmp);
  525. if ((tmp=strchr(tmp, ':'))) {
  526. tmp++;
  527. socket=tmp;
  528. }
  529. } else {
  530. socket = tmp;
  531. }
  532. } else {
  533. host = host_and_port;
  534. port = MySG(default_port);
  535. }
  536. #if MYSQL_VERSION_ID < 32200
  537. mysql_port = port;
  538. #endif
  539. if (!MySG(allow_persistent)) {
  540. persistent=0;
  541. }
  542. if (persistent) {
  543. list_entry *le;
  544. /* try to find if we already have this link in our persistent list */
  545. if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */
  546. list_entry new_le;
  547. if (MySG(max_links)!=-1 && MySG(num_links)>=MySG(max_links)) {
  548. php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C), MySG(num_links));
  549. efree(hashed_details);
  550. MYSQL_DO_CONNECT_RETURN_FALSE();
  551. }
  552. if (MySG(max_persistent)!=-1 && MySG(num_persistent)>=MySG(max_persistent)) {
  553. php_error(E_WARNING, "%s(): Too many open persistent links (%d)", get_active_function_name(TSRMLS_C), MySG(num_persistent));
  554. efree(hashed_details);
  555. MYSQL_DO_CONNECT_RETURN_FALSE();
  556. }
  557. /* create the link */
  558. mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn));
  559. mysql->active_result_id = 0;
  560. #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
  561. mysql_init(&mysql->conn);
  562. if (connect_timeout != -1)
  563. mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
  564. if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
  565. #else
  566. if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
  567. #endif
  568. /* Populate connect error globals so that the error functions can read them */
  569. if (MySG(connect_error)!=NULL) efree(MySG(connect_error));
  570. MySG(connect_error)=estrdup(mysql_error(&mysql->conn));
  571. php_error(E_WARNING, "%s(): %s", get_active_function_name(TSRMLS_C), MySG(connect_error));
  572. #if defined(HAVE_MYSQL_ERRNO)
  573. MySG(connect_errno)=mysql_errno(&mysql->conn);
  574. #endif
  575. free(mysql);
  576. efree(hashed_details);
  577. MYSQL_DO_CONNECT_RETURN_FALSE();
  578. }
  579. /* hash it up */
  580. Z_TYPE(new_le) = le_plink;
  581. new_le.ptr = mysql;
  582. if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) {
  583. free(mysql);
  584. efree(hashed_details);
  585. MYSQL_DO_CONNECT_RETURN_FALSE();
  586. }
  587. MySG(num_persistent)++;
  588. MySG(num_links)++;
  589. } else { /* we do */
  590. if (Z_TYPE_P(le) != le_plink) {
  591. MYSQL_DO_CONNECT_RETURN_FALSE();
  592. }
  593. /* ensure that the link did not die */
  594. handler=signal(SIGPIPE, SIG_IGN);
  595. #if defined(HAVE_MYSQL_ERRNO) && defined(CR_SERVER_GONE_ERROR)
  596. mysql_stat(le->ptr);
  597. if (mysql_errno(&((php_mysql_conn *) le->ptr)->conn) == CR_SERVER_GONE_ERROR) {
  598. #else
  599. if (!strcasecmp(mysql_stat(le->ptr), "mysql server has gone away")) { /* the link died */
  600. #endif
  601. signal(SIGPIPE, handler);
  602. #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
  603. if (mysql_real_connect(le->ptr, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
  604. #else
  605. if (mysql_connect(le->ptr, host, user, passwd)==NULL) {
  606. #endif
  607. php_error(E_WARNING, "%s: Link to server lost, unable to reconnect", get_active_function_name(TSRMLS_C));
  608. zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1);
  609. efree(hashed_details);
  610. MYSQL_DO_CONNECT_RETURN_FALSE();
  611. }
  612. }
  613. signal(SIGPIPE, handler);
  614. mysql = (php_mysql_conn *) le->ptr;
  615. }
  616. ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink);
  617. } else { /* non persistent */
  618. list_entry *index_ptr, new_index_ptr;
  619. /* first we check the hash for the hashed_details key. if it exists,
  620. * it should point us to the right offset where the actual mysql link sits.
  621. * if it doesn't, open a new mysql link, add it to the resource list,
  622. * and add a pointer to it with hashed_details as the key.
  623. */
  624. if (!new_link && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1,(void **) &index_ptr)==SUCCESS) {
  625. int type, link;
  626. void *ptr;
  627. if (Z_TYPE_P(index_ptr) != le_index_ptr) {
  628. MYSQL_DO_CONNECT_RETURN_FALSE();
  629. }
  630. link = (int) index_ptr->ptr;
  631. ptr = zend_list_find(link,&type); /* check if the link is still there */
  632. if (ptr && (type==le_link || type==le_plink)) {
  633. zend_list_addref(link);
  634. Z_LVAL_P(return_value) = link;
  635. php_mysql_set_default_link(link TSRMLS_CC);
  636. Z_TYPE_P(return_value) = IS_RESOURCE;
  637. efree(hashed_details);
  638. MYSQL_DO_CONNECT_CLEANUP();
  639. return;
  640. } else {
  641. zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1);
  642. }
  643. }
  644. if (MySG(max_links)!=-1 && MySG(num_links)>=MySG(max_links)) {
  645. php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C), MySG(num_links));
  646. efree(hashed_details);
  647. MYSQL_DO_CONNECT_RETURN_FALSE();
  648. }
  649. mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn));
  650. mysql->active_result_id = 0;
  651. #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
  652. mysql_init(&mysql->conn);
  653. if (connect_timeout != -1)
  654. mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
  655. if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
  656. #else
  657. if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
  658. #endif
  659. /* Populate connect error globals so that the error functions can read them */
  660. if (MySG(connect_error)!=NULL) efree(MySG(connect_error));
  661. MySG(connect_error)=estrdup(mysql_error(&mysql->conn));
  662. php_error(E_WARNING, "%s(): %s", get_active_function_name(TSRMLS_C), MySG(connect_error));
  663. #if defined(HAVE_MYSQL_ERRNO)
  664. MySG(connect_errno)=mysql_errno(&mysql->conn);
  665. #endif
  666. php_error(E_WARNING, "%s(): MySQL Connection Failed: %s\n", get_active_function_name(TSRMLS_C), mysql_error(&mysql->conn));
  667. efree(hashed_details);
  668. efree(mysql);
  669. MYSQL_DO_CONNECT_RETURN_FALSE();
  670. }
  671. /* add it to the list */
  672. ZEND_REGISTER_RESOURCE(return_value, mysql, le_link);
  673. /* add it to the hash */
  674. new_index_ptr.ptr = (void *) Z_LVAL_P(return_value);
  675. Z_TYPE(new_index_ptr) = le_index_ptr;
  676. if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1,(void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) {
  677. efree(hashed_details);
  678. MYSQL_DO_CONNECT_RETURN_FALSE();
  679. }
  680. MySG(num_links)++;
  681. }
  682. efree(hashed_details);
  683. php_mysql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC);
  684. MYSQL_DO_CONNECT_CLEANUP();
  685. }
  686. /* }}} */
  687. /* {{{ php_mysql_get_default_link
  688. */
  689. static int php_mysql_get_default_link(INTERNAL_FUNCTION_PARAMETERS)
  690. {
  691. if (MySG(default_link)==-1) { /* no link opened yet, implicitly open one */
  692. ht = 0;
  693. php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
  694. }
  695. return MySG(default_link);
  696. }
  697. /* }}} */
  698. /* {{{ proto resource mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string password [, bool new [, int flags]]]]])
  699. Opens a connection to a MySQL Server */
  700. PHP_FUNCTION(mysql_connect)
  701. {
  702. php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
  703. }
  704. /* }}} */
  705. /* {{{ proto resource mysql_pconnect([string hostname[:port][:/path/to/socket] [, string username [, string password [, int flags]]]])
  706. Opens a persistent connection to a MySQL Server */
  707. PHP_FUNCTION(mysql_pconnect)
  708. {
  709. php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
  710. }
  711. /* }}} */
  712. /* {{{ proto bool mysql_close([int link_identifier])
  713. Close a MySQL connection */
  714. PHP_FUNCTION(mysql_close)
  715. {
  716. zval **mysql_link=NULL;
  717. int id;
  718. php_mysql_conn *mysql;
  719. switch (ZEND_NUM_ARGS()) {
  720. case 0:
  721. id = MySG(default_link);
  722. break;
  723. case 1:
  724. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  725. RETURN_FALSE;
  726. }
  727. id = -1;
  728. break;
  729. default:
  730. WRONG_PARAM_COUNT;
  731. break;
  732. }
  733. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  734. if (id==-1) { /* explicit resource number */
  735. zend_list_delete(Z_RESVAL_PP(mysql_link));
  736. }
  737. if (id!=-1
  738. || (mysql_link && Z_RESVAL_PP(mysql_link)==MySG(default_link))) {
  739. zend_list_delete(MySG(default_link));
  740. MySG(default_link) = -1;
  741. }
  742. RETURN_TRUE;
  743. }
  744. /* }}} */
  745. /* {{{ proto bool mysql_select_db(string database_name [, int link_identifier])
  746. Selects a MySQL database */
  747. PHP_FUNCTION(mysql_select_db)
  748. {
  749. zval **db, **mysql_link;
  750. int id;
  751. php_mysql_conn *mysql;
  752. switch(ZEND_NUM_ARGS()) {
  753. case 1:
  754. if (zend_get_parameters_ex(1, &db)==FAILURE) {
  755. RETURN_FALSE;
  756. }
  757. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  758. CHECK_LINK(id);
  759. break;
  760. case 2:
  761. if (zend_get_parameters_ex(2, &db, &mysql_link)==FAILURE) {
  762. RETURN_FALSE;
  763. }
  764. id = -1;
  765. break;
  766. default:
  767. WRONG_PARAM_COUNT;
  768. break;
  769. }
  770. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  771. convert_to_string_ex(db);
  772. if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
  773. RETVAL_FALSE;
  774. } else {
  775. RETVAL_TRUE;
  776. }
  777. }
  778. /* }}} */
  779. #ifdef HAVE_GETINFO_FUNCS
  780. /* {{{ proto string mysql_get_client_info(void)
  781. Returns a string that represents the client library version */
  782. PHP_FUNCTION(mysql_get_client_info)
  783. {
  784. if (ZEND_NUM_ARGS() != 0) {
  785. WRONG_PARAM_COUNT;
  786. }
  787. RETURN_STRING(mysql_get_client_info(),1);
  788. }
  789. /* }}} */
  790. /* {{{ proto string mysql_get_host_info([int link_identifier])
  791. Returns a string describing the type of connection in use, including the server host name */
  792. PHP_FUNCTION(mysql_get_host_info)
  793. {
  794. zval **mysql_link;
  795. int id;
  796. php_mysql_conn *mysql;
  797. switch(ZEND_NUM_ARGS()) {
  798. case 0:
  799. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  800. CHECK_LINK(id);
  801. break;
  802. case 1:
  803. if (zend_get_parameters_ex(1,&mysql_link)==FAILURE) {
  804. RETURN_FALSE;
  805. }
  806. id = -1;
  807. break;
  808. default:
  809. WRONG_PARAM_COUNT;
  810. break;
  811. }
  812. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  813. RETURN_STRING(mysql_get_host_info(&mysql->conn),1);
  814. }
  815. /* }}} */
  816. /* {{{ proto int mysql_get_proto_info([int link_identifier])
  817. Returns the protocol version used by current connection */
  818. PHP_FUNCTION(mysql_get_proto_info)
  819. {
  820. zval **mysql_link;
  821. int id;
  822. php_mysql_conn *mysql;
  823. switch(ZEND_NUM_ARGS()) {
  824. case 0:
  825. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  826. CHECK_LINK(id);
  827. break;
  828. case 1:
  829. if (zend_get_parameters_ex(1,&mysql_link)==FAILURE) {
  830. RETURN_FALSE;
  831. }
  832. id = -1;
  833. break;
  834. default:
  835. WRONG_PARAM_COUNT;
  836. break;
  837. }
  838. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  839. RETURN_LONG(mysql_get_proto_info(&mysql->conn));
  840. }
  841. /* }}} */
  842. /* {{{ proto string mysql_get_server_info([int link_identifier])
  843. Returns a string that represents the server version number */
  844. PHP_FUNCTION(mysql_get_server_info)
  845. {
  846. zval **mysql_link;
  847. int id;
  848. php_mysql_conn *mysql;
  849. switch(ZEND_NUM_ARGS()) {
  850. case 0:
  851. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  852. CHECK_LINK(id);
  853. break;
  854. case 1:
  855. if (zend_get_parameters_ex(1,&mysql_link)==FAILURE) {
  856. RETURN_FALSE;
  857. }
  858. id = -1;
  859. break;
  860. default:
  861. WRONG_PARAM_COUNT;
  862. break;
  863. }
  864. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  865. RETURN_STRING(mysql_get_server_info(&mysql->conn),1);
  866. }
  867. /* }}} */
  868. /* {{{ proto string mysql_info([int link_identifier])
  869. Returns a string containing information about the most recent query */
  870. PHP_FUNCTION(mysql_info)
  871. {
  872. zval **mysql_link;
  873. int id;
  874. char *str;
  875. php_mysql_conn *mysql;
  876. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
  877. return;
  878. }
  879. if (ZEND_NUM_ARGS() == 0) {
  880. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  881. CHECK_LINK(id);
  882. }
  883. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  884. if ((str = mysql_info(&mysql->conn))) {
  885. RETURN_STRING(str,1);
  886. } else {
  887. RETURN_FALSE;
  888. }
  889. }
  890. /* }}} */
  891. /* {{{ proto int mysql_thread_id([int link_identifier])
  892. Returns the thread id of current connection */
  893. PHP_FUNCTION(mysql_thread_id)
  894. {
  895. zval *mysql_link = NULL;
  896. int id = -1;
  897. php_mysql_conn *mysql;
  898. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
  899. return;
  900. }
  901. if (ZEND_NUM_ARGS() == 0) {
  902. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  903. CHECK_LINK(id);
  904. }
  905. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  906. RETURN_LONG(mysql_thread_id(&mysql->conn));
  907. }
  908. /* }}} */
  909. /* {{{ proto string mysql_stat([int link_identifier])
  910. Returns a string containing status information */
  911. PHP_FUNCTION(mysql_stat)
  912. {
  913. zval *mysql_link = NULL;
  914. int id = -1;
  915. php_mysql_conn *mysql;
  916. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
  917. return;
  918. }
  919. if (ZEND_NUM_ARGS() == 0) {
  920. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  921. CHECK_LINK(id);
  922. }
  923. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  924. RETURN_STRING(mysql_stat(&mysql->conn), 1);
  925. }
  926. /* }}} */
  927. /* {{{ proto string mysql_character_set_name([int link_identifier])
  928. Returns the default character set for the current connection */
  929. PHP_FUNCTION(mysql_character_set_name)
  930. {
  931. zval *mysql_link = NULL;
  932. int id = -1;
  933. php_mysql_conn *mysql;
  934. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
  935. return;
  936. }
  937. if (ZEND_NUM_ARGS() == 0) {
  938. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  939. CHECK_LINK(id);
  940. }
  941. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  942. RETURN_STRING((char *)mysql_character_set_name(&mysql->conn), 1);
  943. }
  944. /* }}} */
  945. #endif
  946. #ifndef NETWARE /* The below two functions not supported on NetWare */
  947. #if MYSQL_VERSION_ID < 40000
  948. /* {{{ proto bool mysql_create_db(string database_name [, int link_identifier])
  949. Create a MySQL database */
  950. PHP_FUNCTION(mysql_create_db)
  951. {
  952. zval **db, **mysql_link;
  953. int id;
  954. php_mysql_conn *mysql;
  955. switch(ZEND_NUM_ARGS()) {
  956. case 1:
  957. if (zend_get_parameters_ex(1, &db)==FAILURE) {
  958. RETURN_FALSE;
  959. }
  960. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  961. CHECK_LINK(id);
  962. break;
  963. case 2:
  964. if (zend_get_parameters_ex(2, &db, &mysql_link)==FAILURE) {
  965. RETURN_FALSE;
  966. }
  967. id = -1;
  968. break;
  969. default:
  970. WRONG_PARAM_COUNT;
  971. break;
  972. }
  973. zend_error(E_NOTICE, "%s is deprecated; use mysql_query() to issue a SQL CREATE DATABASE statement instead.", get_active_function_name(TSRMLS_C));
  974. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  975. convert_to_string_ex(db);
  976. if (mysql_create_db(&mysql->conn, Z_STRVAL_PP(db))==0) {
  977. RETURN_TRUE;
  978. } else {
  979. RETURN_FALSE;
  980. }
  981. }
  982. /* }}} */
  983. /* {{{ proto bool mysql_drop_db(string database_name [, int link_identifier])
  984. Drops (delete) a MySQL database */
  985. PHP_FUNCTION(mysql_drop_db)
  986. {
  987. zval **db, **mysql_link;
  988. int id;
  989. php_mysql_conn *mysql;
  990. switch(ZEND_NUM_ARGS()) {
  991. case 1:
  992. if (zend_get_parameters_ex(1, &db)==FAILURE) {
  993. RETURN_FALSE;
  994. }
  995. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  996. CHECK_LINK(id);
  997. break;
  998. case 2:
  999. if (zend_get_parameters_ex(2, &db, &mysql_link)==FAILURE) {
  1000. RETURN_FALSE;
  1001. }
  1002. id = -1;
  1003. break;
  1004. default:
  1005. WRONG_PARAM_COUNT;
  1006. break;
  1007. }
  1008. zend_error(E_NOTICE, "%s is deprecated; use mysql_query() to issue a SQL DROP DATABASE statement instead.", get_active_function_name(TSRMLS_C));
  1009. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1010. convert_to_string_ex(db);
  1011. if (mysql_drop_db(&mysql->conn, Z_STRVAL_PP(db))==0) {
  1012. RETURN_TRUE;
  1013. } else {
  1014. RETURN_FALSE;
  1015. }
  1016. }
  1017. /* }}} */
  1018. #endif
  1019. #endif /* NETWARE */
  1020. /* {{{ php_mysql_do_query_general
  1021. */
  1022. static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link_id, zval **db, int use_store, zval *return_value TSRMLS_DC)
  1023. {
  1024. php_mysql_conn *mysql;
  1025. MYSQL_RES *mysql_result;
  1026. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, link_id, "MySQL-Link", le_link, le_plink);
  1027. if (db) {
  1028. convert_to_string_ex(db);
  1029. if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
  1030. RETURN_FALSE;
  1031. }
  1032. }
  1033. if (mysql->active_result_id) do {
  1034. int type;
  1035. MYSQL_RES *mysql_result;
  1036. mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type);
  1037. if (mysql_result && type==le_result) {
  1038. if (!mysql_eof(mysql_result)) {
  1039. php_error(E_NOTICE, "%s(): Function called without first fetching all rows from a previous unbuffered query",
  1040. get_active_function_name(TSRMLS_C));
  1041. while (mysql_fetch_row(mysql_result));
  1042. }
  1043. zend_list_delete(mysql->active_result_id);
  1044. mysql->active_result_id = 0;
  1045. }
  1046. } while(0);
  1047. convert_to_string_ex(query);
  1048. /* mysql_query is binary unsafe, use mysql_real_query */
  1049. #if MYSQL_VERSION_ID > 32199
  1050. if (mysql_real_query(&mysql->conn, Z_STRVAL_PP(query), Z_STRLEN_PP(query))!=0) {
  1051. RETURN_FALSE;
  1052. }
  1053. #else
  1054. if (mysql_query(&mysql->conn, Z_STRVAL_PP(query))!=0) {
  1055. RETURN_FALSE;
  1056. }
  1057. #endif
  1058. if(use_store == MYSQL_USE_RESULT) {
  1059. mysql_result=mysql_use_result(&mysql->conn);
  1060. } else {
  1061. mysql_result=mysql_store_result(&mysql->conn);
  1062. }
  1063. if (!mysql_result) {
  1064. if (PHP_MYSQL_VALID_RESULT(&mysql->conn)) { /* query should have returned rows */
  1065. php_error(E_WARNING, "%s(): Unable to save result set", get_active_function_name(TSRMLS_C));
  1066. RETURN_FALSE;
  1067. } else {
  1068. RETURN_TRUE;
  1069. }
  1070. }
  1071. ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
  1072. if (use_store == MYSQL_USE_RESULT) {
  1073. mysql->active_result_id = Z_LVAL_P(return_value);
  1074. }
  1075. }
  1076. /* }}} */
  1077. /* {{{ php_mysql_do_query
  1078. */
  1079. static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store)
  1080. {
  1081. zval **query, **mysql_link;
  1082. int id;
  1083. switch(ZEND_NUM_ARGS()) {
  1084. case 1:
  1085. if (zend_get_parameters_ex(1, &query)==FAILURE) {
  1086. RETURN_FALSE;
  1087. }
  1088. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1089. CHECK_LINK(id);
  1090. break;
  1091. case 2:
  1092. if (zend_get_parameters_ex(2, &query, &mysql_link)==FAILURE) {
  1093. RETURN_FALSE;
  1094. }
  1095. id = -1;
  1096. break;
  1097. default:
  1098. WRONG_PARAM_COUNT;
  1099. break;
  1100. }
  1101. php_mysql_do_query_general(query, mysql_link, id, NULL, use_store, return_value TSRMLS_CC);
  1102. }
  1103. /* }}} */
  1104. /* {{{ proto resource mysql_query(string query [, int link_identifier] [, int result_mode])
  1105. Sends an SQL query to MySQL */
  1106. PHP_FUNCTION(mysql_query)
  1107. {
  1108. php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
  1109. }
  1110. /* }}} */
  1111. /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier] [, int result_mode])
  1112. Sends an SQL query to MySQL, without fetching and buffering the result rows */
  1113. PHP_FUNCTION(mysql_unbuffered_query)
  1114. {
  1115. php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
  1116. }
  1117. /* }}} */
  1118. /* {{{ proto resource mysql_db_query(string database_name, string query [, int link_identifier])
  1119. Sends an SQL query to MySQL */
  1120. PHP_FUNCTION(mysql_db_query)
  1121. {
  1122. zval **db, **query, **mysql_link;
  1123. int id;
  1124. switch(ZEND_NUM_ARGS()) {
  1125. case 2:
  1126. if (zend_get_parameters_ex(2, &db, &query)==FAILURE) {
  1127. RETURN_FALSE;
  1128. }
  1129. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1130. CHECK_LINK(id);
  1131. break;
  1132. case 3:
  1133. if (zend_get_parameters_ex(3, &db, &query, &mysql_link)==FAILURE) {
  1134. RETURN_FALSE;
  1135. }
  1136. id = -1;
  1137. break;
  1138. default:
  1139. WRONG_PARAM_COUNT;
  1140. break;
  1141. }
  1142. zend_error(E_NOTICE, "%s is deprecated; use mysql_select_db() and mysql_query() instead", get_active_function_name(TSRMLS_C));
  1143. php_mysql_do_query_general(query, mysql_link, id, db, MYSQL_STORE_RESULT, return_value TSRMLS_CC);
  1144. }
  1145. /* }}} */
  1146. /* {{{ proto resource mysql_list_dbs([int link_identifier])
  1147. List databases available on a MySQL server */
  1148. PHP_FUNCTION(mysql_list_dbs)
  1149. {
  1150. zval **mysql_link;
  1151. int id;
  1152. php_mysql_conn *mysql;
  1153. MYSQL_RES *mysql_result;
  1154. switch(ZEND_NUM_ARGS()) {
  1155. case 0:
  1156. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1157. CHECK_LINK(id);
  1158. break;
  1159. case 1:
  1160. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  1161. RETURN_FALSE;
  1162. }
  1163. id = -1;
  1164. break;
  1165. default:
  1166. WRONG_PARAM_COUNT;
  1167. break;
  1168. }
  1169. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1170. if ((mysql_result=mysql_list_dbs(&mysql->conn, NULL))==NULL) {
  1171. php_error(E_WARNING, "%s(): Unable to save MySQL query result", get_active_function_name(TSRMLS_C));
  1172. RETURN_FALSE;
  1173. }
  1174. ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
  1175. }
  1176. /* }}} */
  1177. /* {{{ proto resource mysql_list_tables(string database_name [, int link_identifier])
  1178. List tables in a MySQL database */
  1179. PHP_FUNCTION(mysql_list_tables)
  1180. {
  1181. zval **db, **mysql_link;
  1182. int id;
  1183. php_mysql_conn *mysql;
  1184. MYSQL_RES *mysql_result;
  1185. switch(ZEND_NUM_ARGS()) {
  1186. case 1:
  1187. if (zend_get_parameters_ex(1, &db)==FAILURE) {
  1188. RETURN_FALSE;
  1189. }
  1190. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1191. CHECK_LINK(id);
  1192. break;
  1193. case 2:
  1194. if (zend_get_parameters_ex(2, &db, &mysql_link)==FAILURE) {
  1195. RETURN_FALSE;
  1196. }
  1197. id = -1;
  1198. break;
  1199. default:
  1200. WRONG_PARAM_COUNT;
  1201. break;
  1202. }
  1203. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1204. convert_to_string_ex(db);
  1205. if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
  1206. RETURN_FALSE;
  1207. }
  1208. if ((mysql_result=mysql_list_tables(&mysql->conn, NULL))==NULL) {
  1209. php_error(E_WARNING, "%s(): Unable to save MySQL query result", get_active_function_name(TSRMLS_C));
  1210. RETURN_FALSE;
  1211. }
  1212. ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
  1213. }
  1214. /* }}} */
  1215. /* {{{ proto resource mysql_list_fields(string database_name, string table_name [, int link_identifier])
  1216. List MySQL result fields */
  1217. PHP_FUNCTION(mysql_list_fields)
  1218. {
  1219. zval **db, **table, **mysql_link;
  1220. int id;
  1221. php_mysql_conn *mysql;
  1222. MYSQL_RES *mysql_result;
  1223. switch(ZEND_NUM_ARGS()) {
  1224. case 2:
  1225. if (zend_get_parameters_ex(2, &db, &table)==FAILURE) {
  1226. RETURN_FALSE;
  1227. }
  1228. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1229. CHECK_LINK(id);
  1230. break;
  1231. case 3:
  1232. if (zend_get_parameters_ex(3, &db, &table, &mysql_link)==FAILURE) {
  1233. RETURN_FALSE;
  1234. }
  1235. id = -1;
  1236. break;
  1237. default:
  1238. WRONG_PARAM_COUNT;
  1239. break;
  1240. }
  1241. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1242. convert_to_string_ex(db);
  1243. if (mysql_select_db(&mysql->conn, Z_STRVAL_PP(db))!=0) {
  1244. RETURN_FALSE;
  1245. }
  1246. convert_to_string_ex(table);
  1247. if ((mysql_result=mysql_list_fields(&mysql->conn, Z_STRVAL_PP(table), NULL))==NULL) {
  1248. php_error(E_WARNING, "%s(): Unable to save MySQL query result", get_active_function_name(TSRMLS_C));
  1249. RETURN_FALSE;
  1250. }
  1251. ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
  1252. }
  1253. /* }}} */
  1254. /* {{{ proto resource mysql_list_processes([int link_identifier])
  1255. Returns a result set describing the current server threads */
  1256. PHP_FUNCTION(mysql_list_processes)
  1257. {
  1258. zval *mysql_link = NULL;
  1259. int id = -1;
  1260. php_mysql_conn *mysql;
  1261. MYSQL_RES *mysql_result;
  1262. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
  1263. return;
  1264. }
  1265. if (ZEND_NUM_ARGS() == 0) {
  1266. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1267. CHECK_LINK(id);
  1268. }
  1269. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  1270. mysql_result = mysql_list_processes(&mysql->conn);
  1271. if (mysql_result == NULL) {
  1272. php_error(E_WARNING, "%s(): Unable to save MySQL query result", get_active_function_name(TSRMLS_C));
  1273. RETURN_FALSE;
  1274. }
  1275. ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
  1276. }
  1277. /* }}} */
  1278. /* {{{ proto string mysql_error([int link_identifier])
  1279. Returns the text of the error message from previous MySQL operation */
  1280. PHP_FUNCTION(mysql_error)
  1281. {
  1282. zval **mysql_link;
  1283. int id;
  1284. php_mysql_conn *mysql;
  1285. switch(ZEND_NUM_ARGS()) {
  1286. case 0:
  1287. id = MySG(default_link);
  1288. if (id==-1) {
  1289. if (MySG(connect_error)!=NULL){
  1290. RETURN_STRING(MySG(connect_error),1);
  1291. } else {
  1292. RETURN_FALSE;
  1293. }
  1294. }
  1295. break;
  1296. case 1:
  1297. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  1298. RETURN_FALSE;
  1299. }
  1300. id = -1;
  1301. break;
  1302. default:
  1303. WRONG_PARAM_COUNT;
  1304. break;
  1305. }
  1306. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1307. RETURN_STRING(mysql_error(&mysql->conn), 1);
  1308. }
  1309. /* }}} */
  1310. /* {{{ proto int mysql_errno([int link_identifier])
  1311. Returns the number of the error message from previous MySQL operation */
  1312. #ifdef HAVE_MYSQL_ERRNO
  1313. PHP_FUNCTION(mysql_errno)
  1314. {
  1315. zval **mysql_link;
  1316. int id;
  1317. php_mysql_conn *mysql;
  1318. switch(ZEND_NUM_ARGS()) {
  1319. case 0:
  1320. id = MySG(default_link);
  1321. if (id==-1) {
  1322. if (MySG(connect_errno)!=0){
  1323. RETURN_LONG(MySG(connect_errno));
  1324. } else {
  1325. RETURN_FALSE;
  1326. }
  1327. }
  1328. break;
  1329. case 1:
  1330. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  1331. RETURN_FALSE;
  1332. }
  1333. id = -1;
  1334. break;
  1335. default:
  1336. WRONG_PARAM_COUNT;
  1337. break;
  1338. }
  1339. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1340. RETURN_LONG(mysql_errno(&mysql->conn));
  1341. }
  1342. #endif
  1343. /* }}} */
  1344. /* {{{ proto int mysql_affected_rows([int link_identifier])
  1345. Gets number of affected rows in previous MySQL operation */
  1346. PHP_FUNCTION(mysql_affected_rows)
  1347. {
  1348. zval **mysql_link;
  1349. int id;
  1350. php_mysql_conn *mysql;
  1351. switch(ZEND_NUM_ARGS()) {
  1352. case 0:
  1353. id = MySG(default_link);
  1354. CHECK_LINK(id);
  1355. break;
  1356. case 1:
  1357. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  1358. RETURN_FALSE;
  1359. }
  1360. id = -1;
  1361. break;
  1362. default:
  1363. WRONG_PARAM_COUNT;
  1364. break;
  1365. }
  1366. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1367. /* conversion from int64 to long happing here */
  1368. Z_LVAL_P(return_value) = (long) mysql_affected_rows(&mysql->conn);
  1369. Z_TYPE_P(return_value) = IS_LONG;
  1370. }
  1371. /* }}} */
  1372. /* {{{ proto string mysql_escape_string(string to_be_escaped)
  1373. Escape string for mysql query */
  1374. PHP_FUNCTION(mysql_escape_string)
  1375. {
  1376. zval **str;
  1377. if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &str) == FAILURE) {
  1378. ZEND_WRONG_PARAM_COUNT();
  1379. }
  1380. convert_to_string_ex(str);
  1381. /* assume worst case situation, which is 2x of the original string.
  1382. * we don't realloc() down to the real size since it'd most probably not
  1383. * be worth it
  1384. */
  1385. zend_error(E_NOTICE, "%s is deprecated; use mysql_real_escape_string() instead", get_active_function_name(TSRMLS_C));
  1386. Z_STRVAL_P(return_value) = (char *) emalloc(Z_STRLEN_PP(str)*2+1);
  1387. Z_STRLEN_P(return_value) = mysql_escape_string(Z_STRVAL_P(return_value), Z_STRVAL_PP(str), Z_STRLEN_PP(str));
  1388. Z_TYPE_P(return_value) = IS_STRING;
  1389. }
  1390. /* }}} */
  1391. /* {{{ proto string mysql_real_escape_string(string to_be_escaped [, int link_identifier])
  1392. Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection */
  1393. PHP_FUNCTION(mysql_real_escape_string)
  1394. {
  1395. zval *mysql_link = NULL;
  1396. char *str;
  1397. char *new_str;
  1398. int id = -1, str_len, new_str_len;
  1399. php_mysql_conn *mysql;
  1400. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) {
  1401. return;
  1402. }
  1403. if (ZEND_NUM_ARGS() == 1) {
  1404. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  1405. CHECK_LINK(id);
  1406. }
  1407. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  1408. new_str = emalloc(str_len * 2 + 1);
  1409. new_str_len = mysql_real_escape_string(&mysql->conn, new_str, str, str_len);
  1410. new_str = erealloc(new_str, new_str_len + 1);
  1411. RETURN_STRINGL(new_str, new_str_len, 0);
  1412. }
  1413. /* }}} */
  1414. /* {{{ proto int mysql_insert_id([int link_identifier])
  1415. Gets the ID generated from the previous INSERT operation */
  1416. PHP_FUNCTION(mysql_insert_id)
  1417. {
  1418. zval **mysql_link;
  1419. int id;
  1420. php_mysql_conn *mysql;
  1421. switch(ZEND_NUM_ARGS()) {
  1422. case 0:
  1423. id = MySG(default_link);
  1424. CHECK_LINK(id);
  1425. break;
  1426. case 1:
  1427. if (zend_get_parameters_ex(1, &mysql_link)==FAILURE) {
  1428. RETURN_FALSE;
  1429. }
  1430. id = -1;
  1431. break;
  1432. default:
  1433. WRONG_PARAM_COUNT;
  1434. break;
  1435. }
  1436. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
  1437. /* conversion from int64 to long happing here */
  1438. Z_LVAL_P(return_value) = (long) mysql_insert_id(&mysql->conn);
  1439. Z_TYPE_P(return_value) = IS_LONG;
  1440. }
  1441. /* }}} */
  1442. /* {{{ proto mixed mysql_result(int result, int row [, mixed field])
  1443. Gets result data */
  1444. PHP_FUNCTION(mysql_result)
  1445. {
  1446. zval **result, **row, **field=NULL;
  1447. MYSQL_RES *mysql_result;
  1448. MYSQL_ROW sql_row;
  1449. mysql_row_length_type *sql_row_lengths;
  1450. int field_offset=0;
  1451. switch (ZEND_NUM_ARGS()) {
  1452. case 2:
  1453. if (zend_get_parameters_ex(2, &result, &row)==FAILURE) {
  1454. RETURN_FALSE;
  1455. }
  1456. break;
  1457. case 3:
  1458. if (zend_get_parameters_ex(3, &result, &row, &field)==FAILURE) {
  1459. RETURN_FALSE;
  1460. }
  1461. break;
  1462. default:
  1463. WRONG_PARAM_COUNT;
  1464. break;
  1465. }
  1466. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1467. convert_to_long_ex(row);
  1468. if (Z_LVAL_PP(row)<0 || Z_LVAL_PP(row)>=(int)mysql_num_rows(mysql_result)) {
  1469. php_error(E_WARNING, "%s(): Unable to jump to row %d on MySQL result index %d", get_active_function_name(TSRMLS_C), Z_LVAL_PP(row), Z_LVAL_PP(result));
  1470. RETURN_FALSE;
  1471. }
  1472. mysql_data_seek(mysql_result, Z_LVAL_PP(row));
  1473. if ((sql_row=mysql_fetch_row(mysql_result))==NULL
  1474. || (sql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) { /* shouldn't happen? */
  1475. RETURN_FALSE;
  1476. }
  1477. if (field) {
  1478. switch(Z_TYPE_PP(field)) {
  1479. case IS_STRING: {
  1480. int i=0;
  1481. MYSQL_FIELD *tmp_field;
  1482. char *table_name, *field_name, *tmp;
  1483. if ((tmp=strchr(Z_STRVAL_PP(field), '.'))) {
  1484. table_name = estrndup(Z_STRVAL_PP(field), tmp-Z_STRVAL_PP(field));
  1485. field_name = estrdup(tmp+1);
  1486. } else {
  1487. table_name = NULL;
  1488. field_name = estrndup(Z_STRVAL_PP(field),Z_STRLEN_PP(field));
  1489. }
  1490. mysql_field_seek(mysql_result, 0);
  1491. while ((tmp_field=mysql_fetch_field(mysql_result))) {
  1492. if ((!table_name || !strcasecmp(tmp_field->table, table_name)) && !strcasecmp(tmp_field->name, field_name)) {
  1493. field_offset = i;
  1494. break;
  1495. }
  1496. i++;
  1497. }
  1498. if (!tmp_field) { /* no match found */
  1499. php_error(E_WARNING, "%s(): %s%s%s not found in MySQL result index %d", get_active_function_name(TSRMLS_C),
  1500. (table_name?table_name:""), (table_name?".":""), field_name, Z_LVAL_PP(result));
  1501. efree(field_name);
  1502. if (table_name) {
  1503. efree(table_name);
  1504. }
  1505. RETURN_FALSE;
  1506. }
  1507. efree(field_name);
  1508. if (table_name) {
  1509. efree(table_name);
  1510. }
  1511. }
  1512. break;
  1513. default:
  1514. convert_to_long_ex(field);
  1515. field_offset = Z_LVAL_PP(field);
  1516. if (field_offset<0 || field_offset>=(int)mysql_num_fields(mysql_result)) {
  1517. php_error(E_WARNING, "%s(): Bad column offset specified", get_active_function_name(TSRMLS_C));
  1518. RETURN_FALSE;
  1519. }
  1520. break;
  1521. }
  1522. }
  1523. if (sql_row[field_offset]) {
  1524. Z_TYPE_P(return_value) = IS_STRING;
  1525. if (PG(magic_quotes_runtime)) {
  1526. Z_STRVAL_P(return_value) = php_addslashes(sql_row[field_offset], sql_row_lengths[field_offset],&Z_STRLEN_P(return_value), 0 TSRMLS_CC);
  1527. } else {
  1528. Z_STRLEN_P(return_value) = sql_row_lengths[field_offset];
  1529. Z_STRVAL_P(return_value) = (char *) safe_estrndup(sql_row[field_offset], Z_STRLEN_P(return_value));
  1530. }
  1531. } else {
  1532. Z_TYPE_P(return_value) = IS_NULL;
  1533. }
  1534. }
  1535. /* }}} */
  1536. /* {{{ proto int mysql_num_rows(int result)
  1537. Gets number of rows in a result */
  1538. PHP_FUNCTION(mysql_num_rows)
  1539. {
  1540. zval **result;
  1541. MYSQL_RES *mysql_result;
  1542. if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) {
  1543. WRONG_PARAM_COUNT;
  1544. }
  1545. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1546. /* conversion from int64 to long happing here */
  1547. Z_LVAL_P(return_value) = (long) mysql_num_rows(mysql_result);
  1548. Z_TYPE_P(return_value) = IS_LONG;
  1549. }
  1550. /* }}} */
  1551. /* {{{ proto int mysql_num_fields(int result)
  1552. Gets number of fields in a result */
  1553. PHP_FUNCTION(mysql_num_fields)
  1554. {
  1555. zval **result;
  1556. MYSQL_RES *mysql_result;
  1557. if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) {
  1558. WRONG_PARAM_COUNT;
  1559. }
  1560. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1561. Z_LVAL_P(return_value) = mysql_num_fields(mysql_result);
  1562. Z_TYPE_P(return_value) = IS_LONG;
  1563. }
  1564. /* }}} */
  1565. /* {{{ php_mysql_fetch_hash
  1566. */
  1567. static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type, int expected_args)
  1568. {
  1569. zval **result, **arg2;
  1570. MYSQL_RES *mysql_result;
  1571. MYSQL_ROW mysql_row;
  1572. MYSQL_FIELD *mysql_field;
  1573. mysql_row_length_type *mysql_row_lengths;
  1574. int num_fields;
  1575. int i;
  1576. if (ZEND_NUM_ARGS() > expected_args) {
  1577. WRONG_PARAM_COUNT;
  1578. }
  1579. switch (ZEND_NUM_ARGS()) {
  1580. case 1:
  1581. if (zend_get_parameters_ex(1, &result)==FAILURE) {
  1582. RETURN_FALSE;
  1583. }
  1584. if (!result_type) {
  1585. result_type = MYSQL_BOTH;
  1586. }
  1587. break;
  1588. case 2:
  1589. if (zend_get_parameters_ex(2, &result, &arg2)==FAILURE) {
  1590. RETURN_FALSE;
  1591. }
  1592. convert_to_long_ex(arg2);
  1593. result_type = Z_LVAL_PP(arg2);
  1594. break;
  1595. default:
  1596. WRONG_PARAM_COUNT;
  1597. break;
  1598. }
  1599. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1600. if ((mysql_row=mysql_fetch_row(mysql_result))==NULL
  1601. || (mysql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) {
  1602. RETURN_FALSE;
  1603. }
  1604. num_fields = mysql_num_fields(mysql_result);
  1605. if (array_init(return_value)==FAILURE) {
  1606. RETURN_FALSE;
  1607. }
  1608. mysql_field_seek(mysql_result, 0);
  1609. for (mysql_field=mysql_fetch_field(mysql_result), i=0; mysql_field; mysql_field=mysql_fetch_field(mysql_result), i++) {
  1610. if (mysql_row[i]) {
  1611. char *data;
  1612. int data_len;
  1613. int should_copy;
  1614. if (PG(magic_quotes_runtime)) {
  1615. data = php_addslashes(mysql_row[i], mysql_row_lengths[i],&data_len, 0 TSRMLS_CC);
  1616. should_copy = 0;
  1617. } else {
  1618. data = mysql_row[i];
  1619. data_len = mysql_row_lengths[i];
  1620. should_copy = 1;
  1621. }
  1622. if (result_type & MYSQL_NUM) {
  1623. add_index_stringl(return_value, i, data, data_len, should_copy);
  1624. should_copy = 1;
  1625. }
  1626. if (result_type & MYSQL_ASSOC) {
  1627. add_assoc_stringl(return_value, mysql_field->name, data, data_len, should_copy);
  1628. }
  1629. } else {
  1630. /* NULL value. */
  1631. if (result_type & MYSQL_NUM) {
  1632. add_index_null(return_value, i);
  1633. }
  1634. if (result_type & MYSQL_ASSOC) {
  1635. add_assoc_null(return_value, mysql_field->name);
  1636. }
  1637. }
  1638. }
  1639. }
  1640. /* }}} */
  1641. /* {{{ proto array mysql_fetch_row(int result)
  1642. Gets a result row as an enumerated array */
  1643. PHP_FUNCTION(mysql_fetch_row)
  1644. {
  1645. php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_NUM, 1);
  1646. }
  1647. /* }}} */
  1648. /* {{{ proto object mysql_fetch_object(int result [, int result_type])
  1649. Fetch a result row as an object */
  1650. PHP_FUNCTION(mysql_fetch_object)
  1651. {
  1652. php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_ASSOC, 2);
  1653. if (Z_TYPE_P(return_value) == IS_ARRAY) {
  1654. object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
  1655. }
  1656. }
  1657. /* }}} */
  1658. /* {{{ proto array mysql_fetch_array(int result [, int result_type])
  1659. Fetch a result row as an array (associative, numeric or both) */
  1660. PHP_FUNCTION(mysql_fetch_array)
  1661. {
  1662. php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 2);
  1663. }
  1664. /* }}} */
  1665. /* {{{ proto array mysql_fetch_assoc(int result)
  1666. Fetch a result row as an associative array */
  1667. PHP_FUNCTION(mysql_fetch_assoc)
  1668. {
  1669. php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_ASSOC, 1);
  1670. }
  1671. /* }}} */
  1672. /* {{{ proto bool mysql_data_seek(int result, int row_number)
  1673. Move internal result pointer */
  1674. PHP_FUNCTION(mysql_data_seek)
  1675. {
  1676. zval **result, **offset;
  1677. MYSQL_RES *mysql_result;
  1678. if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &result, &offset)==FAILURE) {
  1679. WRONG_PARAM_COUNT;
  1680. }
  1681. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1682. convert_to_long_ex(offset);
  1683. if (Z_LVAL_PP(offset)<0 || Z_LVAL_PP(offset)>=(int)mysql_num_rows(mysql_result)) {
  1684. php_error(E_WARNING, "%s(): Offset %d is invalid for MySQL result index %d (or the query data is unbuffered)", get_active_function_name(TSRMLS_C), Z_LVAL_PP(offset), Z_LVAL_PP(result));
  1685. RETURN_FALSE;
  1686. }
  1687. mysql_data_seek(mysql_result, Z_LVAL_PP(offset));
  1688. RETURN_TRUE;
  1689. }
  1690. /* }}} */
  1691. /* {{{ proto array mysql_fetch_lengths(int result)
  1692. Gets max data size of each column in a result */
  1693. PHP_FUNCTION(mysql_fetch_lengths)
  1694. {
  1695. zval **result;
  1696. MYSQL_RES *mysql_result;
  1697. mysql_row_length_type *lengths;
  1698. int num_fields;
  1699. int i;
  1700. if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) {
  1701. WRONG_PARAM_COUNT;
  1702. }
  1703. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1704. if ((lengths=mysql_fetch_lengths(mysql_result))==NULL) {
  1705. RETURN_FALSE;
  1706. }
  1707. if (array_init(return_value)==FAILURE) {
  1708. RETURN_FALSE;
  1709. }
  1710. num_fields = mysql_num_fields(mysql_result);
  1711. for (i=0; i<num_fields; i++) {
  1712. add_index_long(return_value, i, lengths[i]);
  1713. }
  1714. }
  1715. /* }}} */
  1716. /* {{{ php_mysql_get_field_name
  1717. */
  1718. static char *php_mysql_get_field_name(int field_type)
  1719. {
  1720. switch(field_type) {
  1721. case FIELD_TYPE_STRING:
  1722. case FIELD_TYPE_VAR_STRING:
  1723. return "string";
  1724. break;
  1725. #ifdef MYSQL_HAS_TINY
  1726. case FIELD_TYPE_TINY:
  1727. #endif
  1728. case FIELD_TYPE_SHORT:
  1729. case FIELD_TYPE_LONG:
  1730. case FIELD_TYPE_LONGLONG:
  1731. case FIELD_TYPE_INT24:
  1732. return "int";
  1733. break;
  1734. case FIELD_TYPE_FLOAT:
  1735. case FIELD_TYPE_DOUBLE:
  1736. case FIELD_TYPE_DECIMAL:
  1737. return "real";
  1738. break;
  1739. case FIELD_TYPE_TIMESTAMP:
  1740. return "timestamp";
  1741. break;
  1742. #ifdef MYSQL_HAS_YEAR
  1743. case FIELD_TYPE_YEAR:
  1744. return "year";
  1745. break;
  1746. #endif
  1747. case FIELD_TYPE_DATE:
  1748. return "date";
  1749. break;
  1750. case FIELD_TYPE_TIME:
  1751. return "time";
  1752. break;
  1753. case FIELD_TYPE_DATETIME:
  1754. return "datetime";
  1755. break;
  1756. case FIELD_TYPE_TINY_BLOB:
  1757. case FIELD_TYPE_MEDIUM_BLOB:
  1758. case FIELD_TYPE_LONG_BLOB:
  1759. case FIELD_TYPE_BLOB:
  1760. return "blob";
  1761. break;
  1762. case FIELD_TYPE_NULL:
  1763. return "null";
  1764. break;
  1765. default:
  1766. return "unknown";
  1767. break;
  1768. }
  1769. }
  1770. /* }}} */
  1771. /* {{{ proto object mysql_fetch_field(int result [, int field_offset])
  1772. Gets column information from a result and return as an object */
  1773. PHP_FUNCTION(mysql_fetch_field)
  1774. {
  1775. zval **result, **field=NULL;
  1776. MYSQL_RES *mysql_result;
  1777. MYSQL_FIELD *mysql_field;
  1778. switch (ZEND_NUM_ARGS()) {
  1779. case 1:
  1780. if (zend_get_parameters_ex(1, &result)==FAILURE) {
  1781. RETURN_FALSE;
  1782. }
  1783. break;
  1784. case 2:
  1785. if (zend_get_parameters_ex(2, &result, &field)==FAILURE) {
  1786. RETURN_FALSE;
  1787. }
  1788. convert_to_long_ex(field);
  1789. break;
  1790. default:
  1791. WRONG_PARAM_COUNT;
  1792. }
  1793. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1794. if (field) {
  1795. if (Z_LVAL_PP(field)<0 || Z_LVAL_PP(field)>=(int)mysql_num_fields(mysql_result)) {
  1796. php_error(E_WARNING, "%s(): Bad field offset", get_active_function_name(TSRMLS_C));
  1797. RETURN_FALSE;
  1798. }
  1799. mysql_field_seek(mysql_result, Z_LVAL_PP(field));
  1800. }
  1801. if ((mysql_field=mysql_fetch_field(mysql_result))==NULL) {
  1802. RETURN_FALSE;
  1803. }
  1804. if (object_init(return_value)==FAILURE) {
  1805. RETURN_FALSE;
  1806. }
  1807. add_property_string(return_value, "name",(mysql_field->name?mysql_field->name:empty_string), 1);
  1808. add_property_string(return_value, "table",(mysql_field->table?mysql_field->table:empty_string), 1);
  1809. add_property_string(return_value, "def",(mysql_field->def?mysql_field->def:empty_string), 1);
  1810. add_property_long(return_value, "max_length", mysql_field->max_length);
  1811. add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0);
  1812. add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0);
  1813. add_property_long(return_value, "multiple_key",(mysql_field->flags&MULTIPLE_KEY_FLAG?1:0));
  1814. add_property_long(return_value, "unique_key",(mysql_field->flags&UNIQUE_KEY_FLAG?1:0));
  1815. add_property_long(return_value, "numeric", IS_NUM(Z_TYPE_P(mysql_field))?1:0);
  1816. add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0);
  1817. add_property_string(return_value, "type", php_mysql_get_field_name(Z_TYPE_P(mysql_field)), 1);
  1818. add_property_long(return_value, "unsigned",(mysql_field->flags&UNSIGNED_FLAG?1:0));
  1819. add_property_long(return_value, "zerofill",(mysql_field->flags&ZEROFILL_FLAG?1:0));
  1820. }
  1821. /* }}} */
  1822. /* {{{ proto bool mysql_field_seek(int result, int field_offset)
  1823. Sets result pointer to a specific field offset */
  1824. PHP_FUNCTION(mysql_field_seek)
  1825. {
  1826. zval **result, **offset;
  1827. MYSQL_RES *mysql_result;
  1828. if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &result, &offset)==FAILURE) {
  1829. WRONG_PARAM_COUNT;
  1830. }
  1831. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1832. convert_to_long_ex(offset);
  1833. if (Z_LVAL_PP(offset)<0 || Z_LVAL_PP(offset)>=(int)mysql_num_fields(mysql_result)) {
  1834. php_error(E_WARNING, "%s(): Field %d is invalid for MySQL result index %d", get_active_function_name(TSRMLS_C), Z_LVAL_PP(offset), Z_LVAL_PP(result));
  1835. RETURN_FALSE;
  1836. }
  1837. mysql_field_seek(mysql_result, Z_LVAL_PP(offset));
  1838. RETURN_TRUE;
  1839. }
  1840. /* }}} */
  1841. #define PHP_MYSQL_FIELD_NAME 1
  1842. #define PHP_MYSQL_FIELD_TABLE 2
  1843. #define PHP_MYSQL_FIELD_LEN 3
  1844. #define PHP_MYSQL_FIELD_TYPE 4
  1845. #define PHP_MYSQL_FIELD_FLAGS 5
  1846. /* {{{ php_mysql_field_info
  1847. */
  1848. static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
  1849. {
  1850. zval **result, **field;
  1851. MYSQL_RES *mysql_result;
  1852. MYSQL_FIELD *mysql_field;
  1853. char buf[512];
  1854. int len;
  1855. if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &result, &field)==FAILURE) {
  1856. WRONG_PARAM_COUNT;
  1857. }
  1858. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  1859. convert_to_long_ex(field);
  1860. if (Z_LVAL_PP(field)<0 || Z_LVAL_PP(field)>=(int)mysql_num_fields(mysql_result)) {
  1861. php_error(E_WARNING, "%s(): Field %d is invalid for MySQL result index %d", get_active_function_name(TSRMLS_C), Z_LVAL_PP(field), Z_LVAL_PP(result));
  1862. RETURN_FALSE;
  1863. }
  1864. mysql_field_seek(mysql_result, Z_LVAL_PP(field));
  1865. if ((mysql_field=mysql_fetch_field(mysql_result))==NULL) {
  1866. RETURN_FALSE;
  1867. }
  1868. switch (entry_type) {
  1869. case PHP_MYSQL_FIELD_NAME:
  1870. Z_STRLEN_P(return_value) = strlen(mysql_field->name);
  1871. Z_STRVAL_P(return_value) = estrndup(mysql_field->name, Z_STRLEN_P(return_value));
  1872. Z_TYPE_P(return_value) = IS_STRING;
  1873. break;
  1874. case PHP_MYSQL_FIELD_TABLE:
  1875. Z_STRLEN_P(return_value) = strlen(mysql_field->table);
  1876. Z_STRVAL_P(return_value) = estrndup(mysql_field->table, Z_STRLEN_P(return_value));
  1877. Z_TYPE_P(return_value) = IS_STRING;
  1878. break;
  1879. case PHP_MYSQL_FIELD_LEN:
  1880. Z_LVAL_P(return_value) = mysql_field->length;
  1881. Z_TYPE_P(return_value) = IS_LONG;
  1882. break;
  1883. case PHP_MYSQL_FIELD_TYPE:
  1884. Z_STRVAL_P(return_value) = php_mysql_get_field_name(Z_TYPE_P(mysql_field));
  1885. Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
  1886. Z_STRVAL_P(return_value) = estrndup(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value));
  1887. Z_TYPE_P(return_value) = IS_STRING;
  1888. break;
  1889. case PHP_MYSQL_FIELD_FLAGS:
  1890. strcpy(buf, "");
  1891. #ifdef IS_NOT_NULL
  1892. if (IS_NOT_NULL(mysql_field->flags)) {
  1893. strcat(buf, "not_null ");
  1894. }
  1895. #endif
  1896. #ifdef IS_PRI_KEY
  1897. if (IS_PRI_KEY(mysql_field->flags)) {
  1898. strcat(buf, "primary_key ");
  1899. }
  1900. #endif
  1901. #ifdef UNIQUE_KEY_FLAG
  1902. if (mysql_field->flags&UNIQUE_KEY_FLAG) {
  1903. strcat(buf, "unique_key ");
  1904. }
  1905. #endif
  1906. #ifdef MULTIPLE_KEY_FLAG
  1907. if (mysql_field->flags&MULTIPLE_KEY_FLAG) {
  1908. strcat(buf, "multiple_key ");
  1909. }
  1910. #endif
  1911. #ifdef IS_BLOB
  1912. if (IS_BLOB(mysql_field->flags)) {
  1913. strcat(buf, "blob ");
  1914. }
  1915. #endif
  1916. #ifdef UNSIGNED_FLAG
  1917. if (mysql_field->flags&UNSIGNED_FLAG) {
  1918. strcat(buf, "unsigned ");
  1919. }
  1920. #endif
  1921. #ifdef ZEROFILL_FLAG
  1922. if (mysql_field->flags&ZEROFILL_FLAG) {
  1923. strcat(buf, "zerofill ");
  1924. }
  1925. #endif
  1926. #ifdef BINARY_FLAG
  1927. if (mysql_field->flags&BINARY_FLAG) {
  1928. strcat(buf, "binary ");
  1929. }
  1930. #endif
  1931. #ifdef ENUM_FLAG
  1932. if (mysql_field->flags&ENUM_FLAG) {
  1933. strcat(buf, "enum ");
  1934. }
  1935. #endif
  1936. #ifdef SET_FLAG
  1937. if (mysql_field->flags&SET_FLAG) {
  1938. strcat(buf, "set ");
  1939. }
  1940. #endif
  1941. #ifdef AUTO_INCREMENT_FLAG
  1942. if (mysql_field->flags&AUTO_INCREMENT_FLAG) {
  1943. strcat(buf, "auto_increment ");
  1944. }
  1945. #endif
  1946. #ifdef TIMESTAMP_FLAG
  1947. if (mysql_field->flags&TIMESTAMP_FLAG) {
  1948. strcat(buf, "timestamp ");
  1949. }
  1950. #endif
  1951. len = strlen(buf);
  1952. /* remove trailing space, if present */
  1953. if (len && buf[len-1] == ' ') {
  1954. buf[len-1] = 0;
  1955. len--;
  1956. }
  1957. Z_STRLEN_P(return_value) = len;
  1958. Z_STRVAL_P(return_value) = estrndup(buf, len);
  1959. Z_TYPE_P(return_value) = IS_STRING;
  1960. break;
  1961. default:
  1962. RETURN_FALSE;
  1963. }
  1964. }
  1965. /* }}} */
  1966. /* {{{ proto string mysql_field_name(int result, int field_index)
  1967. Gets the name of the specified field in a result */
  1968. PHP_FUNCTION(mysql_field_name)
  1969. {
  1970. php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_NAME);
  1971. }
  1972. /* }}} */
  1973. /* {{{ proto string mysql_field_table(int result, int field_offset)
  1974. Gets name of the table the specified field is in */
  1975. PHP_FUNCTION(mysql_field_table)
  1976. {
  1977. php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_TABLE);
  1978. }
  1979. /* }}} */
  1980. /* {{{ proto int mysql_field_len(int result, int field_offset)
  1981. Returns the length of the specified field */
  1982. PHP_FUNCTION(mysql_field_len)
  1983. {
  1984. php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_LEN);
  1985. }
  1986. /* }}} */
  1987. /* {{{ proto string mysql_field_type(int result, int field_offset)
  1988. Gets the type of the specified field in a result */
  1989. PHP_FUNCTION(mysql_field_type)
  1990. {
  1991. php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_TYPE);
  1992. }
  1993. /* }}} */
  1994. /* {{{ proto string mysql_field_flags(int result, int field_offset)
  1995. Gets the flags associated with the specified field in a result */
  1996. PHP_FUNCTION(mysql_field_flags)
  1997. {
  1998. php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_FLAGS);
  1999. }
  2000. /* }}} */
  2001. /* {{{ proto bool mysql_free_result(int result)
  2002. Free result memory */
  2003. PHP_FUNCTION(mysql_free_result)
  2004. {
  2005. zval **result;
  2006. MYSQL_RES *mysql_result;
  2007. if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) {
  2008. WRONG_PARAM_COUNT;
  2009. }
  2010. if (Z_TYPE_PP(result)==IS_RESOURCE && Z_LVAL_PP(result)==0) {
  2011. RETURN_FALSE;
  2012. }
  2013. ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
  2014. zend_list_delete(Z_LVAL_PP(result));
  2015. RETURN_TRUE;
  2016. }
  2017. /* }}} */
  2018. /* {{{ proto bool mysql_ping([int link_identifier])
  2019. Ping a server connection. If no connection then reconnect. */
  2020. PHP_FUNCTION(mysql_ping)
  2021. {
  2022. zval *mysql_link = NULL;
  2023. int id = -1;
  2024. php_mysql_conn *mysql;
  2025. if (0 == ZEND_NUM_ARGS()) {
  2026. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  2027. CHECK_LINK(id);
  2028. } else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mysql_link)==FAILURE) {
  2029. return;
  2030. }
  2031. ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
  2032. RETURN_BOOL(! mysql_ping(&mysql->conn));
  2033. }
  2034. /* }}} */
  2035. #endif
  2036. /*
  2037. * Local variables:
  2038. * tab-width: 4
  2039. * c-basic-offset: 4
  2040. * End:
  2041. * vim600: sw=4 ts=4 fdm=marker
  2042. * vim<600: sw=4 ts=4
  2043. */