今天遇到一个奇葩的问题 ,mysql_real_escape_string返回false;
$vvv['singer_name'] = '2PM'; //2PM 是接口的数据
$singer_name = mysql_real_escape_string($vvv['singer_name']);
echo $singer_name; //输出false
$singer_name = mysql_real_escape_string($vvv['singer_name']);
echo $singer_name; //输出false
此上直接运行则没事儿,2PM是接口数据,所以才有问题;
换成mysql_escape_string 则没事儿
难道是编码问题?
百度谷歌、查手册都没找到答案,然后看了一下PHP源码
PHP_FUNCTION(mysql_real_escape_string)
{
zval *mysql_link = NULL;
char *str;
char *new_str;
int id = -1, str_len, new_str_len;
php_mysql_conn *mysql;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) {
return;
}
if (ZEND_NUM_ARGS() == 1) {
id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
CHECK_LINK(id);
}
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
new_str = safe_emalloc(str_len, 2, 1);
new_str_len = mysql_real_escape_string(mysql->conn, new_str, str, str_len);
new_str = erealloc(new_str, new_str_len + 1);
RETURN_STRINGL(new_str, new_str_len, 0);
}
后来问师傅得知,第二个参数是数据库连接句柄,问起学习方法,是查的英文手册,我这才知道中英文手册内容是不一样的。
但是还有一个疑问,为何我本来测试没有返回fasle呢,就一个php页面,也没有连接数据库,原因在于mysql_connect() 默认连接成功即可;
然后测试确实是,开发机上mysql_connect不能成功,我的本地就能成功,而mysql_connect默认连接成功与否由php.ini配置。