2010-09-08 4 views
0

Я работаю с чужого соединения с базой данных. Функция PHP работает отлично, пока я передаю ей как минимум три аргумента. Если бы я передать ему два аргумента, то журнал апач говорит:Функция не принимает меньше трех аргументов

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); 
} 

Спасибо тонну!

EDIT

Как 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

Пожалуйста, приведите пример того, как вы назвали бы эту функцию только с одним аргументом. Кажется, что изменение, которое вы ищете, не соответствует цели функции. – 2010-09-08 06:44:16

+0

@Jeff, правда, что. Многие извинения за плохую формулировку. Я имею в виду один дополнительный аргумент для SQL-запроса. Я отредактировал свой пост, чтобы уточнить. Но до сих пор это займет всего три аргумента (включая SQL-запрос) или больше. – Kyle

+2

Это выглядит подозрительно, как будто вы пытаетесь изобрести колесо (PDO). Рассматривали ли вы использование существующей библиотеки подключения к базе данных? – Amber

ответ

4

mysql_real_escape_string() ожидает параметр 2 будет ресурс, нуль данный

Это совершенно другая проблема, чем количество аргументов, которые принимает функция.Прочитайте это снова:

mysql_real_escape_string() ожидает параметр 2 быть ресурсом, null дал

Это относится к этой линии:

mysql_real_escape_string($args[$i], self::$currentCon); 

Второй параметр для mysql_real_escape_string, то есть self::$currentCon, должен быть ссылкой (ресурс) на открытое соединение MySQL. В этом случае это было null.

Это означает, что есть некоторые проблемы с self::$currentCon. Либо есть проблема в коде, который устанавливает self::$currentCon, либо данные конфигурации вашей базы данных (имя пользователя, пароль, сокет и т. Д.) Являются неправильными и невозможно установить соединение с базой данных, поэтому self::$currentCon - null.

Эта проблема должна была быть поймана намного раньше, в то время, когда должно было быть установлено соединение с базой данных, но автор, похоже, является фанатом подавления ошибок, поэтому проблема проявляется здесь.

Мораль истории:

  • Всегда читать сообщения об ошибках трижды.
  • Всегда задавайте точное сообщение об ошибке при задании вопроса.
  • Не подавлять ошибки.

:)

+0

спасибо @deceze !, что имеет смысл, и я последую этому примеру ...Однако соединение с базой данных работает, если я ее кормлю: $ sql = DatabaseManager :: prepare («SELECT * FROM sometable WHERE id =». $ Somevar); но терпит неудачу, когда я его подаю $ sql = DatabaseManager :: prepare («SELECT * FROM sometable WHERE somevar =% d», $ var); Любая причина для этого? – Kyle

+1

@Emile Да. Если вы не добавляете лишних '$ args', цикл' for (...) {...} 'не запускается вообще, поэтому оскорбительное' mysql_real_escape_string' никогда не вызывается. Этот цикл выполняется только столько раз, сколько есть (дополнительных) аргументов. – deceze

+0

gotchya !! Благодаря!! – Kyle

0

Вашему готовому нужно 1 параметр ($ query);

DatabaseManager::prepare("SELECT * FROM sometable WHERE somevar = %d", $var); 
  • в этом коде вы даете 2 параметры функции.
+0

очень хороший момент @ Александр ... Спасибо за помощь в разъяснении моего вопроса. Я имею в виду, что для этого не потребуется 1 дополнительный параметр. Таким образом, включая SQL-запрос, он не будет принимать ничего меньшего, чем 3 параметра. Я уточнил свой вопрос, чтобы уточнить. – Kyle

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(), а затем проверить если есть или нет второй аргумент .. это кажется слишком сложным, по крайней мере для меня

+0

Спасибо @pleasedontbelong ... Мои первые шаги в PHP так простите меня за незнание, но в моем Apache-журнале говорится: «Недопустимый аргумент, предоставленный foreach()», когда я запускаю код с помощью вашей функции. (Хотя вы избавились от последнее сообщение об ошибке :) Любые идеи? – Kyle

+1

Хорошо ... прочитав другие ответы и журнал apache, я думаю, что это не проблема, поэтому @deceze может быть прав. Но как ссылка, если вы используете функцию как я опубликовал здесь вам придется вызывать функцию по-другому .. что-то вроде этого готовят («SELECT ...», array ($ var1, $ var2, ...)); ... в любом случае .. используйте свой оригинал код и проверить параметры, переданные функции mysql_real_escape_string() – pleasedontbelong

+0

, спасибо @pleasedontbelong за код чирика! – Kyle

Смежные вопросы