2010-03-23 5 views
-1

я получаю это как предупреждение, я хочу, чтобы избежать этого предупреждения, когда он не определен, не поворачивая предупреждения отPHP Неопределенная переменная: article_id

здесь контекст

$url_items = array("foo"); 
    $article_id = db_escape($url_items[1]); 
    $article = get_article($article_id); 

    function get_article($article_id = NULL) {.....} 
+0

Это странно, потому что '$ article_id = db_escape ($ url_items [1]); 'должно присваивать некоторое значение' $ article_id'. Я думаю, что предупреждение не должно происходить (или это где-то еще в вашем коде). –

+0

hm ваше право вообще не упоминает об этом ... im, не знакомый с db_escape(), он что-то возвращает? или лучше это всегда возвращает что-то ...hm ok просто протестировал его, функция вернет значение null, если ничего не будет возвращено, так как эта функция может возвращать НИЧЕГО вообще? – Nexum

+0

PHP обычно предоставляет файл и номер строки при выдаче предупреждений. Разве этого не должно быть достаточно, чтобы найти проблему? – lunohodov

ответ

3

Я думаю, что самый простой способ решить это так:

$url_items = array("foo"); 
$article = empty($url_items[1]) ? get_article() : get_article(db_escape($url_items[1])); 

function get_article($article_id = NULL) {.....} 

Этот должен работает, потому что вы даете $article_id значение по умолчанию в функции. Тем не менее, вы можете так же легко изменить среднюю тройную часть на нуль, если вы вообще не хотите выполнять, если нет $article_id.

Edit: Если у вас есть article_id 0, вы можете захотеть изменить empty к !isset
Edit 2: Modified, чтобы избежать смещений неопределенного предупреждения.

0

поставить это перед кодом :

error_reporting(E_ALL^E_NOTICE); 

PHP Manual: error_reporting

+1

Это совсем не так, но особенно в этом случае. Почему бы не E_ALL? –

+0

, потому что E_ALL по-прежнему будет отображать ошибки? – Iraklis

+1

Ахаха, я думал, что вы поможете найти ошибку, а не скрыть ее :) Это просто не пришло мне в голову. Какой смешной ответ от разработчика. –

-1

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

$article_id = db_escape($url_items[1]); 
if(empty($article_id)){ 
    $article_id = null; 
} 

редактировать исправленный код

+3

Аргумент для пустого ** должен быть ** переменной, он не работает с выражениями. – Powerlord

+0

это действительно дает мне ошибку синтаксического анализа – mcgrailm

+0

Powerlord прав, как говорится в документах: * Примечание: empty() проверяет только переменные, поскольку что-то еще приведет к ошибке синтаксического анализа. Другими словами, следующее не будет работать: empty (trim ($ name)). * –

-1

Я не знаю, если это связано с ошибка, но вы должны знать, что PHP индексы массивов начинаются с 0, поэтому вторая строка должна быть

$article_id = db_escape($url_items[0]); 

Кроме того, это, вероятно, опечатка, но первая строка должна быть

var $url_items = array("foo"); 
+0

Я знаю, что они начинаются с нуля Дело в том, что $ url_items [1]; не имеет значения и мне не нужен вар перед переменным, и я не уверен, но я думаю, что может быть проблемой, если я положил его туда – mcgrailm

+0

вар вызовет ошибку – mcgrailm

1

Вы не указали точно, какая строка вызывает ошибку, но вы должны использовать isset для любых переменных, которые вы не уверены. Например:

$url_items = array("foo"); 
if (isset($url_items[1])) 
{ 
    $article_id = db_escape($url_items[1]); 
    $article = get_article($article_id); 
} 

function get_article($article_id = NULL) {.....} 

Вы также хотите, чтобы проверить содержание метода db_escape, в случае, который также делает что-то с неопределенной переменной.


Другой способ решения проблемы заключается в передаче переменной в функцию по ссылке, используя &:

function get_article(&$article_id) { 
    if ($article_id == null) { 
     // handle null case here 
    } 
    else { 
     // get the article 
    } 
} 
+0

ааа да, но я все равно нужно сделать вызов get_article, даже если $ article_id не установлен – mcgrailm

+0

@mmcgrail: да, я дал вашему коду попробовать, но не получил никаких предупреждений. Я получил 'Примечание: неопределенное смещение: 1'. Единственный раз, когда я получаю «Неопределенная переменная», - это удалить строку, которая устанавливает '$ article_id'. Вы уверены, что ваш код такой же, как и вы выше? Проводка содержимого 'db_escape()' тоже помогла бы. – DisgruntledGoat

+0

yes your right Я тоже получаю это, и я все еще не вижу, как db_escape имеет к этому какое-то отношение. но это действительно приводит меня к ответу – mcgrailm

0

так что это было довольно просто после того, как все, что да, возможно, я мог бы сформулировал свой вопрос лучше, но он по-прежнему беспокоит меня, что не существует более простой способ сделать это

if (isset($url_items[1])){ 
     $article_id = db_escape($url_items[1]); 
    }else{ 
     $article_id = null; 
    } 
    $article = get_article($article_id); 
Смежные вопросы