PDA

Показать полную графическую версию : Объясните пожалуста оператор РНР


alef2474
24-04-2013, 20:30
Не могу понять очень распространенную фразу в PHP, т.к. в учебниках она разбирается по частям, а не вместе:

1)$sql="SELECT * FROM table WHERE id_s='$last' ORDER BY id";
2)$result=@mysql_query($sql);

3)if(@mysql_num_rows($result)>0)
{
4)while($row=@mysql_fetch_array($result))
{
операторы
}


В строках 1-2 вроде понятно: в переменную $result запихиваются все строки из таблицы, имеющие в колонке id_s определенное значение $last и эти строки отсортированы по возрастанию значения в колонке id

3) условный оператор тоже понятен: если в $result вообще отобрались какие-то строки(хотя бы одна >0), то условие и все что в него вложено выполняется.

Но что за странное условие цикла 4), не пойму
mysql_fetch_array судя по описанию и по названию $row должна строки таблицы из $result запихивать в элементы массива с индексами-названиями
т.е получается что какая-то неопределенная переменная $row сравнивается со строкой из таблицы $result. Естественно они не будут равны и цикл не должен выполняться, но в программе предполагается, что он вдруг выполняется, будто под while не логическая операция сравнения, а будто бы оператор присваивания переменной (элементу массива?) $row значения строки из $result.
Объясните пожалуйста, кто знает, что это за оператор while, может где есть нормальные примеры, а не просто теория.

Coutty
24-04-2013, 21:03
В строке 4 функция mysql_fetch_array() одну строку из запроса разбивает в массив и присваивает его в $row. Затем while проверяет, если $row - не false, то выполняются операторы. $row == false, если, например, закончились строки на перебор.

Внутри while операторы выполняются до тех пор, пока условие в скобках true.

Iska
24-04-2013, 21:11
Разве там не присвоение?
PHP: Оператор присваивания - Manual (http://www.php.net/manual/ru/language.operators.assignment.php)
PHP: while - Manual (http://www.php.net/manual/ru/control-structures.while.php)

Update: припоздал ;).

alef2474
24-04-2013, 23:18
Цитата Coutty:
пока условие в скобках true. »


Но в скобках-то не условие, а оператор присваивания, а в некоторых мануалах пишут, что должно быть условие.
Условие выглядит ведь $row==чему-то, т.е. 2 знака =, а не один.

Iska привел ссылку, где в while должно стоять expr-"выражение", а что такое "выражение" не пояснено.

Еще можно понять пример где while($a = each($two)), но там тоже одно = , и по крайней мере функция each означает обход "каждого".

Откуда можно понять, что выражение $row=столбцам строки - это TRUE,
а выражение $row=пусто(кончились строки) - это FALSE? В описании mysql_fetch_array это не указано.
Ведь $row после выполнения while должно быть, наверно, равно значению последней полученной строки, а не FALSE?
(вернее $row[0]=первый столбец последней строки, $row[1]=второй столбец последней строки,...??)

Что означает значок "@" перед функцией-оператором? В описании функций этого значка нет. Может, дело в нем?

Iska
25-04-2013, 02:14
Но в скобках-то не условие, а оператор присваивания, а в некоторых мануалах пишут, что должно быть условие.
Условие выглядит ведь $row==чему-то, т.е. 2 знака =, а не один. »
alef2474, цитирую именно по ссылке PHP: Оператор присваивания - Manual (http://www.php.net/manual/ru/language.operators.assignment.php):
Базовый оператор присваивания обозначается как "=". На первый взгляд может показаться, что это оператор "равно". На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).

Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения "$a = 3" будет равен 3. Это позволяет делать трюки наподобие:
<?php
$a = ($b = 4) + 5; // $a теперь равно 9, а $b было присвоено 4.
?>

Понимаете? Условием для цикла while является результат выражения в скобках. Пока этот результат, результат присваивания переменной $row возвращаемого функцией значения, будет отличен от false — цикл будет выполняться.

alef2474
26-04-2013, 14:28
Цитата Iska:
Базовый оператор присваивания обозначается как "=". На первый взгляд может показаться, что это оператор "равно". На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).
Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения "$a = 3" будет равен 3. Это позволяет делать трюки наподобие: »




Спасибо, вчитался в это сумбурное объяснение и понял, особенно благодаря примеру.

Имхо, объяснить надо было по-другому:

Выражение присваивания, кроме выполнения собственно операции присваивания значения правого операнда левому операнду, может выступать и целиком как значение только правого операнда для различных операций.
Т.е. выражение $a=3 может выступать как просто 3, а выражение $b=false как просто false.




© OSzone.net 2001-2012