Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Объясните пожалуста оператор РНР (http://forum.oszone.net/showthread.php?t=259332)

alef2474 24-04-2013 20:30 2139048

Объясните пожалуста оператор РНР
 
Не могу понять очень распространенную фразу в 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 2139058

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

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

Iska 24-04-2013 21:11 2139061

Разве там не присвоение?
PHP: Оператор присваивания - Manual
PHP: while - Manual

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

alef2474 24-04-2013 23:18 2139118

Цитата 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 2139169

Цитата:

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

alef2474, цитирую именно по ссылке PHP: Оператор присваивания - Manual:
Цитата:

Базовый оператор присваивания обозначается как "=". На первый взгляд может показаться, что это оператор "равно". На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).

Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения "$a = 3" будет равен 3. Это позволяет делать трюки наподобие:
PHP код:

<?php
$a 
= ($b 4) + 5// $a теперь равно 9, а $b было присвоено 4.
?>


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

alef2474 26-04-2013 14:28 2139965

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




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

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

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


Время: 15:43.

Время: 15:43.
© OSzone.net 2001-