2010-08-12 3 views
0

Я был включен в nstrees из другого вопроса и работал через скрипт. В последний раз он был обновлен в 2005 году и опирался на некоторые вещи, которые с тех пор, по-видимому, были устаревшими, как HTTP_POST_VARS, о которых я не знал сразу, поскольку я занимаюсь PHP всего лишь немногим меньше года.нужна некоторая простая помощь, понимающая немного кода pre-PHP5

В любом случае, стиль кодирования кажется странным моим новобранец глаз, и я хотел бы второе мнение о том, что часть этой функции делает:

// returns the first node that matches the '$whereclause'. 
// The WHERE clause can optionally contain ORDER BY or LIMIT clauses too. 
function nstGetNodeWhere ($thandle, $whereclause) { 
    $noderes['l'] = 0; 
    $noderes['r'] = 0; 
    $res = mysql_query("SELECT * FROM ".$thandle['table']." WHERE ".$whereclause); 
    if (!$res) { // problem area 1 
     _prtError(); 
    } else { 
     if ($row = mysql_fetch_array($res)) { // problem area 2 
      $noderes['l'] = $row[$thandle['lvalname']]; 
      $noderes['r'] = $row[$thandle['rvalname']]; 
     } 
    } 
    return $noderes; 
} 

В коде выше я отметил пятно я не совсем уверен, как // problem area x, все остальное - оригинальный сценарий.

Что касается PA1, это просто проверка того, был ли запрос успешно запущен?

И PA2, NetBeans дает мне предупреждение «Возможное случайное назначение, задания в условиях следует избегать». ... поэтому я быстро изменил это с = до == и, разумеется, сломал скрипт, хе.

Думать об этом, я думаю, это просто еще одна проверка ошибки на $res, на этот раз, чтобы убедиться, что некоторые данные были действительно возвращены?

Наконец, это странный PHP, или я просто слишком зеленый, чтобы его проверить?

Спасибо, dude (tte) s!

ответ

1

Проблема Область 1 - это именно то, что вы думаете. Он проверяет, успешно ли выполнялся запрос. Посмотрите документацию для mysql_query (так как вы используете Netbeans, вы также можете выделить имя функции в редакторе и нажать F2, чтобы получить встроенное всплывающее окно). Вы ищете раздел «Возвращаемые значения». Там говорится, что он вернет FALSE (логическое FALSE) при любых ошибках.

Проверка

if (!$res) 

такая же, как проверка

if ($res == false) 

В идеале вы должны быть проверки для

if ($res === false) 

, потому что это безопаснее, так как PHP очень расслаблены о переменных == ложь, но я бы не стал путать вас с этим прямо сейчас. Если вы хотите, чтобы начать, прочитав около strong typing.

Проблемная область 2 довольно распространена, но покажет предупреждение в Netbeans, да. То, что он делает, это присвоение значения из mysql_fetch_array() в $ row и проверка, если , что теперь истинно или ложно, а также позволяет использовать то же значение теперь в $ row в следующем блоке кода внутри if().

+0

Благодарим за подробное объяснение PA2. Это был единственный из опубликованных 3, которые действительно помогли мне «получить». Я не понимал, что строительство было фактически двухступенчатым (назначить, проверить). Теперь имеет смысл! – Drew

0

Я предполагаю, что этот код может загружать статьи, а затем сортировать их в массив «влево-вправо», чтобы его можно было печатать в двух столбце. Может быть. :)

Да, PA1 проверяет, был ли запрос успешным или нет. PA2 просто извлекает фактическую строку.

0
if (!$res) { // problem area 1 

mysql_query возвращает false, если ему не удается выполнить запрос SQL. Это в основном тест на нет (!) Любое значение, кроме ложной, так что, если тест будет соответствовать, если произошла ошибка в mysql_query и выполнить ветвь ошибки печати кода

if ($row = mysql_fetch_array($res)) { // problem area 2 

Назначает следующую строку из набор результатов - $ row; или устанавливает $ row в false, если в наборе результатов больше нет строк, и в этом случае «if test» будет ложным