|
|
|
| Существует БД 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:02)
| | И вообще если так подумать то тело цикла (если оно и будет повторяться) будет всегда выводить одно и то же, на деле получается иначе. | |
|
|
|
|
|
|
|
для: Alexhoppus
(05.08.2009 в 23:02)
| | И вообще если так подумать то тело цикла (если оно и будет повторяться) будет всегда выводить одно и то же, на деле получается иначе. | |
|
|
|
|
|
|
|
для: Alexhoppus
(05.08.2009 в 23:02)
| | while ($row =
Вот этот знак равенства - это не сравнение. Это операция присваивания.
Сравнение пишется как ==
Так что переменная здесь именно что определяется. | |
|
|
|
|
|
|
|
для: Trianon
(05.08.2009 в 23:31)
| | А что в условии выполнения тела цикла делает оператор присваивания, не могу понять, объясните пожалуйста, обычно там условие бывает. | |
|
|
|
|
|
|
|
для: Alexhoppus
(05.08.2009 в 23:34)
| | Вот в моем понимании цикла while в пхп
while($i<=200000)
{
$iSum+=$i;
if($i==100)
{
break;
}
$i++;
}
Почему там в скобках стоит оператор присваивания, как операция присваивания может быть условием она же не условие, а операция присваивания, я запутался. | |
|
|
|
|
|
|
|
для: Alexhoppus
(05.08.2009 в 23:34)
| | Условие все равно присутствует.
Условием является неравенство нулю вычисленного выражения (выражения присваивания).
Результатом выражения присваивания считается значение переменной после присваивания.
Результат равный нулю функция возвращает, когда не в состоянии вернуть очередную строку result-set'а.
Так что логически здесь всё корректно. Хотя и слегка запутано для неискушенного в С-подобной семантике. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: Alexhoppus
(05.08.2009 в 23:52)
| | Вообще говоря, если почитать в мануале описание функции (hint: php.net/mysql_fetch_array ), то станет ясно, что возвращать она может не только массив.
А что по поводу %s? | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2009 в 00:06)
| | Ладно буду сам разбираться, уже итак много вопросов задал, спасибо большое. Если тока может кого не затруднит просьба эту конструкцию написать через for если это возможно. | |
|
|
|
|
|
|
|
для: Alexhoppus
(06.08.2009 в 00:17)
| |
for($res = mysql_query("SELECT * from table");
($row = mysql_fetch_assoc($res) != 0 ;
)
{
print_r($row);
}
|
Я действительно не понял, что с %s не так. | |
|
|
|
|
|
|
|
для: 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 не массив, а его элемент. Возникла следующая проблема: вывод осуществляется со второй строки в базе данных, первая куда-то пропадает! | |
|
|
|
|
|
|
|
для: Alexhoppus
(07.08.2009 в 01:45)
| | >Путем проб и ошибок выяснил, что запись
Вы пытались разобраться как цикл работает?
Так это имело смысл делать до знакомства с MySQL.
>Получается переменная $f не массив, а его элемент.
$f - массив, представляющий очередную строку рез.таблицы.
$f["SURNAME"] - элемент массива, представляющий поле SURNAME этой строки.
В чем противоречие?
>Возникла следующая проблема: вывод осуществляется со второй строки в базе данных, первая куда-то пропадает!
дамп таблицы и код в студию.
Явно в коде ошибка. | |
|
|
|
|
|
|
|
для: 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";
то выводит все как надо, не пойму почему только
?> | |
|
|
|
|
|
|
|
для: Trianon
(07.08.2009 в 02:11)
| | Противоречия нет, просто много вещей в синтаксисе языка непривычных совершенно. В моем понимании тогда $f должен быть 2 мерным массивом, где будет присутствовать вся таблица, а не строкой таблицы которая перезаписывается постоянно на себя.
Я перакрасно понимаю как работает цикл, просто я не понимал почему одна и та же по виду строчка, стоящая в теле цикла, выводит разные элементы с каждым новым повторениям тела. | |
|
|
|
|
|
|
|
для: Alexhoppus
(07.08.2009 в 02:32)
| | показывайте фрагмент вывода.
По идее у Вас должны выводиться все строки.
Просто перед первой будет вылезать вот это echo "$num_rows Rows\n"; как и написали. | |
|
|
|
|
|
|
|
для: Alexhoppus
(07.08.2009 в 02:32)
| | >Противоречия нет, просто много вещей в синтаксисе языка непривычных совершенно.
вот уж синтаксис здесь совсем в стороне.
а к какому языку Вы привыкли?
>В моем понимании тогда $f должен быть 2 мерным массивом, где будет присутствовать вся таблица, а не строкой таблицы которая перезаписывается постоянно на себя...
вся таблица может не поместиться в память. Да и не нужны уже обрботанные строки... | |
|
|
|
|
|
|
|
для: Trianon
(07.08.2009 в 02:50)
| | я привык к делфи.
По поводу вывода - не думаю, что я путаю число строк с первой строкой таблицы. Впрочем не важно, это не такая уж большая проблема, спасибо за помощь, вы мне очень помогли. | |
|
|
|