php 1 строка не целое число - PullRequest
2 голосов
/ 22 мая 2009

Я использую переменную GET, и люди получают ее по следующему URL:

page?siteID=1

и я проверяю, чтобы siteID был целым числом, но PHP говорит, что это строка.

Как я могу преобразовать его в целое число? Я заметил, что intval() преобразует 0x1A в 26, чего я не хочу.

Ответы [ 12 ]

9 голосов
/ 22 мая 2009

Если вы не хотите преобразовывать переменную, а просто проверить, представляет ли она число, вы также можете использовать функцию is_numeric. Либо так, либо вы можете использовать методы конвертации, как описано в других ответах, в зависимости от того, что больше всего соответствует вашим конкретным потребностям.

РЕДАКТИРОВАТЬ: на основе комментария Джеймса Сокол, возможно, стоит также посмотреть на функцию ctype_digit Для вашего конкретного приложения (похоже, вы хотите проверить какой-либо идентификационный номер страницы), это может быть лучше, чем функция is_numeric.

9 голосов
/ 22 мая 2009

Как примечание, чтобы вы знали , почему это происходит, вот что происходит.

Когда веб-браузер отправляет запрос GET, это весь текст. URL `http://example.com/page?siteID=1' фактически отправляется в виде одной строки; в HTTP-запросе это будет следующая строка:

GET /page?siteID=1 HTTP/1.0

(Часть "http://example.com" использовалась веб-браузером для определения, с каким сервером разговаривать и какой сетевой протокол использовать.)

PHP овладевает этим и проделывает огромную работу для того, чтобы вы его проанализировали. Он разбивает его на три части на основе этих пробелов (метод "GET", URI "/page?siteID=1" и протокол "HTTP/1.1"), а затем анализирует URI в путь ("/page") и запрос параметры ("siteID = 1"), которые затем анализируются в пары имя / значение. И даже вся эта строка GET, указанная выше, была только частью полнотекстового потока, доставляемого на HTTP-сервер в качестве запроса.

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

Если вам действительно любопытно, вы можете использовать такие инструменты, как Wireshark или плагин Firefox Live HTTP Headers , чтобы увидеть подробную информацию о том, какие текстовые строки действительно передаются по сети. Это стоит узнать, если вы веб-разработчик.

5 голосов
/ 22 мая 2009

Либо приведен к int

$id = (int)$_GET['siteID'];

зная правила преобразования строки в целое . Или используйте

if (ctype_digit($_GET['siteID'])) { //...

Если вы хотите убедиться, что он содержит только цифры (символы 0-9). Если вы хотите, чтобы это была числовая строка, включая «-1.35e + 105», вы можете использовать is_numeric().

3 голосов
/ 22 мая 2009

вам нужно привести его к int

, например

$ siteid = (int) $ _GET ['siteID'];

Это сделает это.

2 голосов
/ 22 мая 2009
1 голос
/ 22 мая 2009

что вы могли бы сделать; ctype_digit ($ _ GET [ 'siteID'])

0 голосов
/ 17 апреля 2011

Путь URI page?siteID=1 является строкой; Значение $_GET['siteID'] изначально будет строкой.

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

is_numeric() недостаточно в этом случае, к сожалению, потому что is_numeric('7e2') возвращает true.

Вы хотите проверить строковое значение siteID как целое число без преобразования значения из $ _GET, сохраняя ваш $ _GET с необработанными значениями, потому что они могут понадобиться вам позже.

function is_valid_id($id) {
    return strval($id) === strval(intval($id)) && $id > 0;
}

if (is_valid_id($_GET['siteID']))
    $siteID = intval($_GET['siteID']);
    # Value is ready to be processed as integer
else
    # Refresh page with invalid id error message

Он отображает недопустимые значения «0», «0,0», «-0», «07», «-09», «0y», «7e2», «-w», «-b.9», «G98». ',' -h7 ',' 98R ', '98 .7', '98, 8 ',' 0x1A ',' \ x1A ',' 5 + 5 ',' 5 * 5 'и т. д.

0 голосов
/ 23 мая 2009

Я бы рекомендовал использовать mod_rewrite (если есть) и регулярные выражения для обфускации и защиты ваших переменных GET вместо того, чтобы приводить их в коде.

0 голосов
/ 22 мая 2009

Больше идей:

$isInt = ($_GET['id'] == (int)$_GET['id']); // not strict comparing!
$isInt2 = preg_match('/\-?[0-9]+/', $_GET['id']);

и, наконец, безопасный способ получить $ id:

$id = (isset($_GET['id']) && ($_GET['id'] == (int)$_GET['id'])) 
    ? (int)$_GET['id'] 
    : 0;
0 голосов
/ 22 мая 2009

Php слабо набран. Для него целое число и строка могут угрожать одинаково, он будет пытаться угадать, как в соответствии с контекстом.

В любом случае, когда вы передаете переменную с помощью GET, это всегда строка, потому что HTTP-протоколь полностью связан с текстом.

Итак, две вещи:

  • в большинстве случаев вам не нужно проверять, является ли оно целым числом. Используйте утку: если это строка, которая выглядит как целое число, используйте ее напрямую.

  • , если вы действительно хотите проверить, используйте is_numeric ().

  • если вам нужен условный оператор, то использование == для проверки строки на целое число будет работать. Если вы хотите проверить с принудительным использованием типа, используйте ===.

Фантастический способ управления переменными является частью того, что делает PHP, ну, в общем, PHP. Любите это или ненавидите, но не пытайтесь писать код на PHP, как в JAVA или C #.

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