2015-03-16 2 views
1

vsprintf() счастливо игнорирует следующие ошибки:Есть ли способ поймать, когда vsprintf вызывается с неправильным типом или неправильным числом аргументов?

// I'd like to tell me that there are too many arguments. 
vsprintf("%d", 1, 2); 

// this string gets converted to 0! instead of throwing an exception 
vsprintf("%d", "nonsense"); 

Есть ли способ, что я могу поймать эти типы ошибок?

Редактировать

Возможно, мой вопрос был не очень понятным. Мне нужно, чтобы на самом деле попытаться/поймать такие ошибки, как я использую vsprintf внутри простой MySQLi обертки, чтобы пользователи могли бы сделать что-то вроде:

DB::select("*")->from("User")->where("salary=%d %s",$bogus_string) 

В этом случае я должен сказать им осмысленно, что 1)% d ожидается целое число 2), что я не знаю, что делать с посторонними% s. 3) Мне также необходимо поддерживать производственные среды.

+0

Второй не может быть перехвачено. Это собственное поведение PHP: типы joggling. – sectus

+0

Спасибо, ребята, за ответы, см. Дальнейшие объяснения. Не уверен, почему этот вопрос был проголосован, хотя значимый комментарий с правом голоса всегда приветствуется. – Wulfire

ответ

0

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

  • Строка в формате vsprintf
  • Массива параметров
  • список получателей
  • отправитель
  • Тип

В конструкторе журнала сообщений я выполняю различные проверки, так как некоторые из этих атрибутов могут быть нулевыми, а некоторые комбинации не имеют смысла (например, «тип чата» без отправителя, список получателей с отправителем в нем и т. д.)

Поскольку мне нужно было проверить, были ли переданы правильные номера аргументов & vsprintf, я закончил называть vsprintf внутри мой конструктор в инструкции try...catch и отчет об исключении, которое было обнаружено.

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

Надеюсь, это поможет.

0

Вы можете написать что-то вроде этого:

try { 

    if (!preg_match('~[^%]%[bcdeEfFgGosuxX]~', $msg)) { throw new Exception('There are no sprintf() sequences in `haystack`'); } 

    $msg = vsprintf($msg, $data); 

    if (preg_match('~[^%]%[bcdeEfFgGosuxX]~', $msg)) { throw new Exception('There are sprintf() sequences in `haystack` - it means you\'re passing less or too many parameters than needed...'); } 

} catch (Exception $e) {} 

Пожалуйста, обратите внимание, что Regex получает много процессора & оперативной памяти на больших данных

+0

Также вы можете написать функцию с preg_replace_callback(), которая заменяет только vars, которые вы передали функции, а остальные остались без изменений – gzhegow

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