我正在使用其他人的数据库连接PHP函数,只要我传递至少三个参数,它就能正常工作。如果我传递两个参数,那么apache日志会说:
mysql_real_escape_string() expects parameter 2 to be resource, null given
我需要函数来执行SQL查询,如下所示:
$sql = DatabaseManager::prepare("SELECT * FROM sometable WHERE somevar = %d", $var);
并准备安全执行。有人可以帮助它接受两个论点吗?
public static function prepare($query = null) { // ( $query, *$args )
$args = func_get_args();
array_shift($args);
// If args were passed as an array (as in vsprintf), move them up
if ( isset($args[0]) && is_array($args[0]) ){
$args = $args[0];
}
$query = str_replace("'%s'", '%s', $query); // in case someone mistakenly already singlequoted it
$query = str_replace('"%s"', '%s', $query); // doublequote unquoting
$query = str_replace('%s', "'%s'", $query); // quote the strings
for($i=0; $i<count($args); $i++){
$args[$i] = mysql_real_escape_string($args[$i], self::$currentCon);
}
//array_walk($args, array(&$this, 'mysql_real_escape_string'));
return @vsprintf($query, $args);
}
非常感谢!
修改
正如deceze所指出的,这大约是self::$currentCon)
,这意味着数据库连接将回来null
我多次尝试过这个。仍然好奇为什么这样做:
$sql = DatabaseManager::prepare("SELECT * FROM sometable WHERE id = ".$somevar);
但这失败了:
$sql = DatabaseManager::prepare("SELECT * FROM sometable WHERE somevar = %d", $var);
这会如何影响self::$currentCon)
?
答案 0 :(得分:4)
mysql_real_escape_string()期望参数2为资源,给定
为null
这是一个与函数接受的参数数量完全不同的问题。再读一遍:
mysql_real_escape_string()
期望参数2 为资源 ,null
给定< / p>
它指的是这一行:
mysql_real_escape_string($args[$i], self::$currentCon);
mysql_real_escape_string
的第二个参数,即self::$currentCon
,应该是对开放MySQL连接的引用(资源)。在这种情况下,虽然它是null
。
这意味着self::$currentCon
存在一些问题。设置self::$currentCon
的代码中存在问题,或者您的数据库配置详细信息(用户名,密码,套接字等)是错误的,并且无法建立与数据库的连接,因此self::$currentCon
是null
。
在应该建立数据库连接时,这个问题应该早得多,但是作者似乎是错误抑制的粉丝,所以问题只在这里体现出来。
故事的寓意:
:)
答案 1 :(得分:1)
也许只是我,我会写这样的功能
public static function prepare($query = null,$args = array()) {
$query = str_replace("'%s'", '%s', $query); // in case someone mistakenly already singlequoted it
$query = str_replace('"%s"', '%s', $query); // doublequote unquoting
$query = str_replace('%s', "'%s'", $query); // quote the strings
foreach($args as $key=>$arg){
$args[$key] = mysql_real_escape_string($arg, self::$currentCon);
}
//array_walk($args, array(&$this, 'mysql_real_escape_string'));
return @vsprintf($query, $args);
}
我还没有测试过..我不明白为什么函数使用func_get_args()
和array_shift()
然后测试是否有第二个参数..它看起来太复杂了,至少对我而言
答案 2 :(得分:0)
您的准备工作需要1个参数($ query);
DatabaseManager::prepare("SELECT * FROM sometable WHERE somevar = %d", $var);