2009-06-21 7 views
1
$thread_id = (isset($_GET['id'])); 
$thread_id = intval($_GET['id']); 

$q = mysql_query("SELECT * FROM threads WHERE id = $thread_id"); 

Не можете ли вы использовать две функции для одной переменной? Как вы можете видеть, что я проверить, если его набор, но он по-прежнему дает мне:Примечание: Неопределенный индекс

Примечание: Undefined индекс: идентификатор в C: \ WAMP \ WWW \ bfhq \ thread.php на линии 7

+0

Некоторое время назад я предложил конструктор языка setor() для PHP для решения этой общей проблемы. К сожалению, он был преобразован в новый?: Синтаксис, который не решает проблему E_NOTICE. О хорошо ... – gahooa

ответ

3

Исеть() возвращает логическое значение: TRUE/FALSE. Если вы хотите определить, установлен ли $ _GET ["id"], вам нужно сделать это в IF-Statement или через тернарный оператор.

if (isset($_GET["id"])) { 
    $thread_id = $_GET["id"]; // Bad idea taking values in from $_GET directly 
} else { 
    die("Thread id not set"); 
} 
+0

Вызов intval() по значению $ _GET вполне разумен, если вы ожидаете, что переменная будет ID. –

+0

Ты прав, Паоло. Извините за поспешное заявление от моего имени - я просто очень чувствителен, когда вижу $ _GET и закрывающий запрос;) – Sampson

+0

Имейте в виду, что целое число php может иметь разные значения min/max, чем числовые значения mysql. – VolkerK

5

Попробуйте это:

$thread_id = isset($_GET['id']) ? intval($_GET['id']) : 0; 

который гласит "если $_GET['id'] установлен, установите $thread_id в intval($_GET['id']), если нет, то значение 0"

0

Эта ошибка зависит от ошибки/предупреждения уровня в php.ini. Его хорошая практика, чтобы использовать ...

array_key_exists('id', $_GET); 

http://us2.php.net/manual/en/function.array-key-exists.php

также: убедитесь, что вы дезинфицировать, что вход от $ _GET, прежде чем сделать это. Вы оставляете себя открытым для инъекций mysql.

+1

Может ли mysql инъекции обходить intval()? doesnt intval допускает только числа. ура – 2009-06-21 03:28:50

+0

ах, да, полагаю, так. должен был убедиться, что intval не вернул false при ошибке, оставив вас с «WHERE =». однако факт, что он возвращает 0 при ошибке, может быть проблемой, если у вас есть записи с идентификатором 0. – nategood

0

Вы можете избавиться от всех уведомлений, просто используя error_reporting(4);. Другой, может быть грубым, но работает, способ подавить уведомление и дезинфицировать переменная может быть:

$thread_id = (int)@$_GET["id"]; 

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

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