Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обработка результирующей таблицы
 
 автор: Alexhoppus   (05.08.2009 в 23:02)   письмо автору
 
 

Существует БД MyDb с таблицей mytable и полями id и name.

<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Could not connect: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf ("ID: %s Name: %s", $row["id"], $row["name"]);
}
mysql_free_result($result);
?>

Я не могу понимать вот эту часть скрипта
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf ("ID: %s Name: %s", $row["id"], $row["name"]);
Вопросы следующие:
1.) Переменная $row не объявлялась ранее, какой смысл вообще в условии окончания цикла?
2.) если mysql_fetch_array это функция, возвращающая массив (как написано в теории), то где его проиндексированные элементы, а $row["id"] это, что массив со всеми id в массиве $row, че то я запутался помогите.
3.) что такое %s?

Благодарю за любую помощь.

  Ответить  
 
 автор: Alexhoppus   (05.08.2009 в 23:04)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:02)
 

И вообще если так подумать то тело цикла (если оно и будет повторяться) будет всегда выводить одно и то же, на деле получается иначе.

  Ответить  
 
 автор: Alexhoppus   (05.08.2009 в 23:05)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:02)
 

И вообще если так подумать то тело цикла (если оно и будет повторяться) будет всегда выводить одно и то же, на деле получается иначе.

  Ответить  
 
 автор: Trianon   (05.08.2009 в 23:31)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:02)
 

while ($row =

Вот этот знак равенства - это не сравнение. Это операция присваивания.
Сравнение пишется как ==
Так что переменная здесь именно что определяется.

  Ответить  
 
 автор: Alexhoppus   (05.08.2009 в 23:34)   письмо автору
 
   для: Trianon   (05.08.2009 в 23:31)
 

А что в условии выполнения тела цикла делает оператор присваивания, не могу понять, объясните пожалуйста, обычно там условие бывает.

  Ответить  
 
 автор: Alexhoppus   (05.08.2009 в 23:37)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:34)
 

Вот в моем понимании цикла while в пхп
while($i<=200000)
{
$iSum+=$i;
if($i==100)
{
break;
}
$i++;
}
Почему там в скобках стоит оператор присваивания, как операция присваивания может быть условием она же не условие, а операция присваивания, я запутался.

  Ответить  
 
 автор: Trianon   (05.08.2009 в 23:40)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:34)
 

Условие все равно присутствует.
Условием является неравенство нулю вычисленного выражения (выражения присваивания).
Результатом выражения присваивания считается значение переменной после присваивания.
Результат равный нулю функция возвращает, когда не в состоянии вернуть очередную строку result-set'а.
Так что логически здесь всё корректно. Хотя и слегка запутано для неискушенного в С-подобной семантике.

  Ответить  
 
 автор: Alexhoppus   (05.08.2009 в 23:52)   письмо автору
 
   для: Trianon   (05.08.2009 в 23:40)
 

Благодарю, эта часть мне понятна.
если можно, ещё вопрос

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf ("ID: %s Name: %s", $row["id"], $row["name"]);

Пока соблюдается условие неравенства нулю $row выполняется тело цикла. но функция которую мы присваиваем к $row вообще говоря возвразает массив, как массив может быть равен нулю? Я вообще не встречался с подобным присваиванием массивов в своей скудной пратике программирования, не знаю разрешено ли это в пхп. Выглядит по крайней мере странно. И ещё хотелось бы спросить по поводу %s.

  Ответить  
 
 автор: Trianon   (06.08.2009 в 00:06)   письмо автору
 
   для: Alexhoppus   (05.08.2009 в 23:52)
 

Вообще говоря, если почитать в мануале описание функции (hint: php.net/mysql_fetch_array ), то станет ясно, что возвращать она может не только массив.

А что по поводу %s?

  Ответить  
 
 автор: Alexhoppus   (06.08.2009 в 00:17)   письмо автору
 
   для: Trianon   (06.08.2009 в 00:06)
 

Ладно буду сам разбираться, уже итак много вопросов задал, спасибо большое. Если тока может кого не затруднит просьба эту конструкцию написать через for если это возможно.

  Ответить  
 
 автор: Trianon   (06.08.2009 в 00:46)   письмо автору
 
   для: Alexhoppus   (06.08.2009 в 00:17)
 

for($res = mysql_query("SELECT * from table");
       ($row = mysql_fetch_assoc($res)  != 0 ; 
    )
{
    print_r($row);
}


Я действительно не понял, что с %s не так.

  Ответить  
 
 автор: Alexhoppus   (07.08.2009 в 01:45)   письмо автору
 
   для: Trianon   (06.08.2009 в 00:46)
 

Путем проб и ошибок выяснил, что запись
$f = mysql_fetch_array($result, MYSQL_ASSOC);
print_r($f["SURNAME"]);
$f = mysql_fetch_array($result, MYSQL_ASSOC);
print_r($f["SURNAME"]);
....
$f = mysql_fetch_array($result, MYSQL_ASSOC);
print_r($f["SURNAME"]);

Фактически будет эквивалентна данному циклу
while ($f = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf ("FIO: %s " , $f["SURNAME"]);

Получается переменная $f не массив, а его элемент. Возникла следующая проблема: вывод осуществляется со второй строки в базе данных, первая куда-то пропадает!

  Ответить  
 
 автор: Trianon   (07.08.2009 в 02:11)   письмо автору
 
   для: Alexhoppus   (07.08.2009 в 01:45)
 

>Путем проб и ошибок выяснил, что запись

Вы пытались разобраться как цикл работает?
Так это имело смысл делать до знакомства с MySQL.

>Получается переменная $f не массив, а его элемент.

$f - массив, представляющий очередную строку рез.таблицы.
$f["SURNAME"] - элемент массива, представляющий поле SURNAME этой строки.
В чем противоречие?

>Возникла следующая проблема: вывод осуществляется со второй строки в базе данных, первая куда-то пропадает!

дамп таблицы и код в студию.
Явно в коде ошибка.

  Ответить  
 
 автор: Alexhoppus   (07.08.2009 в 02:25)   письмо автору
 
   для: Trianon   (07.08.2009 в 02:11)
 

Пожалуйста
<?php
$lnk = mysql_connect('localhost', 'log', 'pass') or die ( 'Not connected : ' . mysql_error() );
mysql_select_db('BD', $lnk) or die ('Can\'t use foo : ' . mysql_error());
echo "$lnk";
echo"<br>";
mysql_query( 'SET NAMES cp1251' );
$result = mysql_query("SELECT * FROM ID", $lnk) or die(mysql_error());
$num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
while ($f = mysql_fetch_array($result, MYSQL_ASSOC))
{
printf ("FIO: %s DATE: %s" , $f["SURNAME"], $f["DATE"]);
echo"<br>";
}

Если закомментировать вот эти две строки
$num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
то выводит все как надо, не пойму почему только
?>

  Ответить  
 
 автор: Alexhoppus   (07.08.2009 в 02:32)   письмо автору
 
   для: Trianon   (07.08.2009 в 02:11)
 

Противоречия нет, просто много вещей в синтаксисе языка непривычных совершенно. В моем понимании тогда $f должен быть 2 мерным массивом, где будет присутствовать вся таблица, а не строкой таблицы которая перезаписывается постоянно на себя.
Я перакрасно понимаю как работает цикл, просто я не понимал почему одна и та же по виду строчка, стоящая в теле цикла, выводит разные элементы с каждым новым повторениям тела.

  Ответить  
 
 автор: Trianon   (07.08.2009 в 02:48)   письмо автору
 
   для: Alexhoppus   (07.08.2009 в 02:32)
 

показывайте фрагмент вывода.
По идее у Вас должны выводиться все строки.
Просто перед первой будет вылезать вот это echo "$num_rows Rows\n"; как и написали.

  Ответить  
 
 автор: Trianon   (07.08.2009 в 02:50)   письмо автору
 
   для: Alexhoppus   (07.08.2009 в 02:32)
 

>Противоречия нет, просто много вещей в синтаксисе языка непривычных совершенно.

вот уж синтаксис здесь совсем в стороне.
а к какому языку Вы привыкли?

>В моем понимании тогда $f должен быть 2 мерным массивом, где будет присутствовать вся таблица, а не строкой таблицы которая перезаписывается постоянно на себя...

вся таблица может не поместиться в память. Да и не нужны уже обрботанные строки...

  Ответить  
 
 автор: Alexhoppus   (07.08.2009 в 13:11)   письмо автору
 
   для: Trianon   (07.08.2009 в 02:50)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования