mysql_query 源码_求mysql_query 内部源码

本文详细解析了`mysql_query`函数的内部实现,包括如何发送SQL查询到MySQL,错误处理,以及在不同MySQL版本中的行为差异。通过示例展示了如何检查并优化查询效率。
摘要由CSDN通过智能技术生成

展开全部

|Sends an SQL query to MySQL */

PHP_FUNCTION(mysql_query)

{

php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);

}

static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store)

{

char *query;

size_t query_len;

zval *mysql_link = NULL;

php_mysql_conn *mysql;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|r", &query, &query_len, &mysql_link) == FAILURE) {

return;

}

if (!e69da5e887aa62616964757a686964616f31333337386562mysql_link) {

zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);

CHECK_LINK(res);

mysql = (php_mysql_conn*)res->ptr;

} else {

if (!(mysql = (php_mysql_conn *)zend_fetch_resource2(Z_RES_P(mysql_link), "MySQL-Link", le_link, le_plink))) {

RETURN_FALSE;

}

}

php_mysql_do_query_general(mysql, query, query_len, NULL, use_store, return_value);

}

/* {{{ php_mysql_do_query_general

*/

static void php_mysql_do_query_general(php_mysql_conn *mysql, char *query, int query_len, char *db, int use_store, zval *return_value)

{

MYSQL_RES *mysql_result;

if (db) {

if (!php_mysql_select_db(mysql, db)) {

RETURN_FALSE;

}

}

PHPMY_UNBUFFERED_QUERY_CHECK();

MYSQL_DISABLE_MQ;

#ifndef MYSQL_USE_MYSQLND

/* check explain */

if (MySG(trace_mode)) {

if (!strncasecmp("select", query, 6)){

MYSQL_ROW       row;

char *newquery;

int newql = spprintf(&newquery, 0, "EXPLAIN %s", query);

mysql_real_query(mysql->conn, newquery, newql);

efree (newquery);

if (mysql_errno(mysql->conn)) {

php_error_docref("http://www.mysql.com/doc", E_WARNING, "%s", mysql_error(mysql->conn));

RETURN_FALSE;

}

else {

mysql_result = mysql_use_result(mysql->conn);

while ((row = mysql_fetch_row(mysql_result))) {

if (!strcmp("ALL", row[1])) {

php_error_docref("http://www.mysql.com/doc", E_WARNING, "Your query requires a full tablescan (table %s, %s rows affected). Use EXPLAIN to optimize your query.", row[0], row[6]);

} else if (!strcmp("INDEX", row[1])) {

php_error_docref("http://www.mysql.com/doc", E_WARNING, "Your query requires a full indexscan (table %s, %s rows affected). Use EXPLAIN to optimize your query.", row[0], row[6]);

}

}

mysql_free_result(mysql_result);

}

}

} /* end explain */

#endif

/* mysql_query is binary unsafe, use mysql_real_query */

#if MYSQL_VERSION_ID > 32199

if (mysql_real_query(mysql->conn, query, query_len)!=0) {

/* check possible error */

if (MySG(trace_mode)){

if (mysql_errno(mysql->conn)){

php_error_docref("http://www.mysql.com/doc", E_WARNING, "%s", mysql_error(mysql->conn));

}

}

RETURN_FALSE;

}

#else

if (mysql_query(mysql->conn, query)!=0) {

/* check possible error */

if (MySG(trace_mode)){

if (mysql_errno(mysql->conn)){

php_error_docref("http://www.mysql.com/doc", E_WARNING, "%s", mysql_error(mysql->conn));

}

}

RETURN_FALSE;

}

#endif

if(use_store == MYSQL_USE_RESULT) {

mysql_result = mysql_use_result(mysql->conn);

} else {

mysql_result = mysql_store_result(mysql->conn);

}

if (!mysql_result) {

if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */

php_error_docref(NULL, E_WARNING, "Unable to save result set");

RETURN_FALSE;

} else {

RETURN_TRUE;

}

}

MySG(result_allocated)++;

ZVAL_RES(return_value, zend_register_resource(mysql_result, le_result));

if (use_store == MYSQL_USE_RESULT) {

mysql->active_result_res = Z_RES_P(return_value);

Z_ADDREF_P(return_value);

}

}

/* }}} */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值