Функция для сокращения запросов не работает

#php #sql #function

#php #sql #функция

Вопрос:

Вот мой код:

 function query($query, $variables = NULL) {
    $execute = sprintf($query, $variables);
    $execute = mysql_query($execute);

    return $execute;
}

$insert = query("INSERT INTO accounts (username, email, password, validation_code, registration_timestamp, registration_ip) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", "$username, $email, $passwordEncrypted, $validationCode, $timestamp, $ip");
  

Если есть только одна переменная, она будет работать. Но с любым после этого это не сработает. Есть предложения по исправлению и улучшению этой функции? Спасибо, ребята!

Ответ №1:

перепишите ее на:

 function query($query, $variables = array()) {
    $execute = vprintf($query, $variables);
    $execute = mysql_query($execute);

    return $execute;
}

$insert = query("INSERT INTO accounts (username, email, password, validation_code, registration_timestamp, registration_ip) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", array($username, $email, $passwordEncrypted, $validationCode, $timestamp, $ip));
  

Кстати, я абсолютно согласен с @Alex, и вместо этого вам нужно перейти на подготовленные инструкции mysqli / PDO.

PS: не забудьте применить mysql_real_escape_string к каждой переменной.

Комментарии:

1. @alex: БОЖЕ, никогда не знал, что есть такая функция:-S

2. Спасибо, что сработало. На самом деле я никогда не заглядывал в mysqli / PDO. Может быть, есть на что обратить внимание

3. Ложная тревога. Я столкнулся с проблемой. Я получаю ошибки «предоставленный аргумент не является допустимым ресурсом результата MySQL в», и это повторяет мои запросы?

4. @Marcus Krueger: ну, вы пытались посмотреть, что не так с вашими запросами? mysql_error() var_dump(vprintf($query, $variables))

Ответ №2:

Не передавайте строку, когда вы должны передавать ее непосредственно в виде массива вашей функции.

Тем не менее, вы не должны мне создавать оболочку для mysql_query() , когда существуют лучшие альтернативы, такие как PDO.

Комментарии:

1. Что, если в любой переменной есть запятая? ;-P

2. @zerkms Да, попытка сделать это таким образом — ловушка.

Ответ №3:

попробуйте что-то вроде этого:

 function query()
{
    $query = call_user_func_array('sprintf',func_get_args());
    return mysql_query($query);
}
  

а затем используйте вот так:

 $insert = query(
    "INSERT INTO accounts (username, email, password, validation_code, registration_timestamp, registration_ip) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')",
    $username,
    $email,
    $passwordEncrypted,
    $validationCode,
    $timestamp,
    $ip
);