函数不会接受少于三个参数

时间:2010-09-08 06:35:36

标签: php sql mysql

我正在使用其他人的数据库连接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)

3 个答案:

答案 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::$currentConnull

在应该建立数据库连接时,这个问题应该早得多,但是作者似乎是错误抑制的粉丝,所以问题只在这里体现出来。

故事的寓意:

  • 始终阅读错误消息三次。
  • 在提问时始终提供确切的错误消息。
  • 不要压制错误。

:)

答案 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);
  • 在此代码中,您将提供2个参数来运行。