Эта тема на forum.dklab.ru


PyJIeT: MySQL более подробно
Здравствуйте опять это я.Буквально на днях понял-скрипты с бд на файлах маст дай.И вот я решил начать тренироваться на MySQL.Честно говоря неочень-то и понятно :\.Я приведу мои размышления в перемешку с вопросами, так и вам и мне будет легче понять.
mysql_connect("localhost"); //здесь мне все ясно
mysql_select_db("startpage"); //здесь тоже
$result=mysql_query("SELECT * FROM news ORDER BY id DESC"); //ну здесь впринцмпе тоже
А вот с этого момента начались проблемы.Я считал, что $result будет массивом, элементы которого - строки (не поля) в таблице.Однако я ошибался.Приведу пример: таблица:
id | name | text
___|______|_______
1 | me | grrr
2 | me2 | grrr2
4 | me4 | grrr4

Ну вообщем-то задача скрипта-вывести эти данные по формату.
...
$result=mysql_query("SELECT * FROM news ORDER BY id DESC");
foreach(mysql_fetch_row($result) as $news){
echo("имя :".$news[1]);
echo("<br>текст :".$news[2]);
}

Но вместо этого вылезает какая-то охинея.Если сделать через while, то все работает.
С while:
$result=mysql_query("SELECT * FROM news ORDER BY id DESC");
while($news=mysql_fetch_row($result)){
echo("имя :".$news[1]);
echo("<br>текст :".$news[2]);
}

Но почему-же не проходит через foreach?И как понять эту строку:
while($news=mysql_fetch_row($result)){
Ведь должен же из базы данных передаваться ответ в виде массива?!
after:
Используйте функцию mysql_fetch_assoc(), в Вашем примере она возвратит ассоциативный массив с ключами "name" и "text"

while ($row = mysql_fetch_assoc($result)) {
echo "Новости: ", $row["news"], "<br />";
echo "Текст: ", $row["text"];
}

А указанная Вами строка означает следующее. Функция mysql_fetch_row() возвращает очередную строку результата. Когда строки заканчиваются, функция возвращает ложное значение и цикл тоже заканчивается.
Дмитрий Котеров:
PyJIeT:
http://php.net/mysql_fetch_row

Не пренебрегайте документацией.
Rémy:
И еще вопрос:
В MySQL, вроде бы, все новые записи должны добавляться в самый конец таблицы, так?
А можно, что бы в специальном поле, скажем number, число строки проставлялось автоматически?
Например в гостевой книге, скрипт заносит в базу данных новое сообщение, а MySQL сама поставит его номер в специальное поле. А если админ решит удалить какое-либо сообщение, которое находится где-то в середине таблицы, то все номера после него сдвинуться на единицу???
PyJIeT:
>А можно, что бы в специальном поле, скажем number, число строки проставлялось автоматически?
Например в гостевой книге, скрипт заносит в базу данных новое сообщение, а MySQL сама поставит его номер в специальное поле

Для этого в Колонке Дополнительно поставь auto_increment, и далее флажок "по первичному".MySQL будет простовлять это поле автоматом.
id name
_______
1 me
2 me2
3 me3
4 me4

а что-бы последняя запись выводилась первой, необходимо дописать в запрос ORDER BY id DESC.
$result=mysql_query("SELECT * FROM news ORDER BY id DESC");
, тогда отсчет пойдет ни как 1 2 3 4, а 4 3 2 1.Про второе-я сам незнаю как такого добиться.
Евгений Галашин:
R&#233;my:
www.mysql.ru/docs/man ответит на все Ваши вопросы. И по-русски.
...самый конец таблицы, так?
с точки зрения теории реляционных БД у таблицы нет ни начала, ни конца. записи в таблице не упорядочены. Сортирует их СУБД, как Вы ей скажете.
Ant:
PyJIeT:
Для цитирования, выделите строку, которую хотите процитировать и нажмите «Вставить».
Remy:
Salut! Merci beaucoup, mon amis!!! :-)
Maus:
И еще вопрос:
А если админ решит удалить какое-либо сообщение, которое находится где-то в середине таблицы, то все номера после него сдвинуться на единицу???

Насколько мне известно, автоматически в MySQL это не делается...
Дмитрий Котеров:
А если админ решит удалить какое-либо сообщение, которое находится где-то в середине таблицы, то все номера после него сдвинуться на единицу???
Это и ни одна другая СУБД не делает, не только MySQL. Потому что никому не нужно. Нумеровать записи можно и нужено скриптовыми средствами, а не на уровне БД.
Maus:
Это и ни одна другая СУБД не делает
А вот где то я слыхал такие слова как "триггеры" и "хранимые процедуры" - они не годятся в данном случае?
В смысле возможности, а не "нужности"..
Дмитрий Котеров:
Вы понимаете, чем грозит смена ID у записей? Ведь поле ID нужно только для одной цели: чтобы другие записи в таблицах могли ссылаться по данному номеру. Если номер сменится, все ссылки побьются.

Можно, конечно, и все ссылки менять (в частности, через триггеры), но только это возня, ненужная нагрузка на базу и неустойчивость (попробуйте для какой-нибудь таблицы случайно пропустить контроль смены ID, и карачун).

Нумеровать можно и средствами MySQL, в два запроса, только зачем? Это же можно сделать и в скрипте.

set @i:=-1;
select (@i:=i+1) as i, * from tbl;

Эта тема на forum.dklab.ru