Как реализовать printf-подобную функцию в PHP? - PullRequest
0 голосов
/ 12 января 2012

Я хочу сделать db_queryf функцию для моей абстракции базы данных.Он будет работать примерно так же, как sqlite3_mprintf из SQLite: db_queryf('select * from pages where name=%q', $_GET['name']), где% q создаст правильно экранированную строку.Как правильно делать printf-подобные функции в PHP?Есть ли для этого какие-нибудь вспомогательные функции или я должен сам разобраться?

Ответы [ 4 ]

2 голосов
/ 12 января 2012

Я в замешательстве ... (s)printf явно уже существует, и вы, вероятно, захотите использовать для этого еще SQLite3Stmt::bindValue, если только вы не захотите оказаться в аду / sql-инъекция ада ..

1 голос
/ 12 января 2012

Использовать Подготовленные PDO заявления . Замена в строку не достаточно хорошо, вы должны дезинфицировать.

0 голосов
/ 26 ноября 2013

хорошо, так как у меня была точно такая же проблема, я дал ей шанс, и она, кажется, работает очень хорошо.

Следующая функция находится внутри класса обтекания базы данных и ожидает, что она будет вызываться как printfгде %% преобразуется в литерал%, %e отмечает строковый аргумент, который должен быть экранирован, а %u отмечает строковый аргумент, который принимается как есть.

LOGDB - вторая база данныхОберточный класс, который отвечает за перехват и регистрацию всех видов ошибок.

  public static function query($format)
  {
    $query = $format . ' ';

    $argc = func_num_args();
    $argv = func_get_args();

    $index_query = 0;
    $index_args = 1;

    while (($index_query = strpos($query, '%', $index_query)) !== false)
      {
        switch ($query[$index_query + 1])
          {
          case '%':
            $query = substr_replace($query, '', $index_query, 1);
            $index_query++;
            break;
          case 'e':
            if ($index_args >= $argc)
              {
                LOG::failedQuery($format, "not enough arguments for format");
                return false;
              }
            $query = substr_replace($query, DB::escape($argv[$index_args]), $index_query, 2);
            $index_query += strlen($argv[$index_args]);
            $index_args++;
            break;
          case 'u':
            if ($index_args >= $argc)
              {
                LOG::failedQuery($format, "not enough arguments for format");
                return false;
              }
            $query = substr_replace($query, $argv[$index_args], $index_query, 2);
            $index_query += strlen($argv[$index_args]);
            $index_args++;
            break;
          default:
            LOG::failedQuery($format, "unknown control sequence '%" . $query[$index_query + 1] . "'");
            return false;
          }
      }

    if ($index_args != $argc)
      {
        LOG::failedQuery($format, "too many arguments for format");
        return false;
      }

    $res = mysqli_query(self::$handle, $query);
    if (!$res)
      LOGDB::failedQuery($query, mysqli_error(self::$handle));

    return $res;
  }

Примечание: код в основном не проверен, скорее всего, он содержит кучу ошибок.используйте с осторожностью:)

0 голосов
/ 12 января 2012

sprintf()

sprintf('select * from pages where name=\'%s\'', $_GET['name']);

Это очень важно, чтобы вы очистили все в $_GET, прежде чем использовать его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...