Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > взять из бд последние три новости(импорт новостей)


Автор: ReactOS 13.4.2008, 23:01
Привет!

У меня след. проблема:

создала в бд таблицу
Код

-- Структура таблицы `news`
-- 

CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `text` varchar(255) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY  (`id`)
);



добавление/удаление/изменение у меня работает :)

вот одно НО!

у меня есть "index.html"

И есть таблица, где должны отображаться последние три новости из этой таблицы:

Код

INSERT INTO `news` VALUES (2, 'Первая Новость', '2008-04-13 23:33:27');
INSERT INTO `news` VALUES (3, 'Вторая Новость', '2008-04-13 23:33:35');
INSERT INTO `news` VALUES (4, 'Первая Новость', '2008-04-13 23:35:27');

ps Самую первую я удалила  :girl_crazy  но я думаю вы это поймете!

т.е. мне нужно, чтобы выбирались последние три новости, допустим у меня уже есть новости с ID от 1 до 150, тем больше ИД, тем более свежая у меня новость!
Как выбирать именно последние три - у меня не получается

Код

<html>
<head>
<title>index.html</title>
</head>
<body>

<table border = "1" align = "center">
<tr>
    <td>Последние Новости Проекта</td>
</tr>
<tr>
    <td>
    <?php

                //Здесь переменный с настройками!
    include_once("settings.php");

    $a = mysql_connect($host, $db_user, $db_pass);

    $b = mysql_select_db($db, $a);

    $id = $_REQUEST['id'];

    $sql = "SELECT text FROM news WHERE ID = \"$id\"";

    $res = mysql_query($sql, $crea_conn) or
    die(mysql_errno($crea_conn).mysql_error($crea_conn));

    ?>
    </td>
</tr>
</table>
</body>
</html>


ps
запросы не умею составлять, прошу не ругать, а научить!
:)

Автор: Feldmarschall 13.4.2008, 23:04
если БД - mysql, то в ней есть очень удобный оператор LIMIT, с какой записи, сколько
выборку, соответственно, надо еще отсортировать в нужном порядке

Автор: ReactOS 13.4.2008, 23:10
Цитата(Feldmarschall @  13.4.2008,  23:04 Найти цитируемый пост)
если БД - mysql

а по-моему сообщению разве не видно очевидного? что именно mysql!

Цитата(Feldmarschall @  13.4.2008,  23:04 Найти цитируемый пост)
то в ней есть очень удобный оператор LIMIT

спасибо за инфу! smile точно, а я и забыла про это...

Цитата(Feldmarschall @  13.4.2008,  23:04 Найти цитируемый пост)
с какой записи, сколько
выборку

ну будет у меня 150 Новостей и сделаю LIMIT 147, 150 , и что буду все время по возрастанию вручную изменять? потом LIMIT 160, 163???

разве нет запроса в mysql, чтобы взять именно последние 3 новости??

Цитата(Feldmarschall @  13.4.2008,  23:04 Найти цитируемый пост)
выборку, соответственно, надо еще отсортировать в нужном порядке

ну по-любому с ID=1 пойдет и дальше по возрастанию! по-другому не сделаешь же...

Автор: Feldmarschall 13.4.2008, 23:16
в mysql есть оператор ORDER BY
который позволет сортировать базу как по возрастанию, так и по убыванию.

Автор: Fortop 14.4.2008, 00:33
Цитата(Rexona @  13.4.2008,  23:01 Найти цитируемый пост)

Код

    $id = $_REQUEST['id'];
    $sql = "SELECT text FROM news WHERE ID = \"$id\"";


Вас еще не ломали? Мы идем к вам smile

Автор: skyboy 14.4.2008, 01:25
Цитата(Rexona @  13.4.2008,  22:10 Найти цитируемый пост)
разве нет запроса в mysql, чтобы взять именно последние 3 новости??

конечно, есть.
и даже описан в документации. там, где http://dev.mysql.com/doc/refman/5.0/en/select.html#id4083187.

Автор: ReactOS 14.4.2008, 07:44
Цитата(Fortop @  14.4.2008,  00:33 Найти цитируемый пост)
Вас еще не ломали? Мы идем к вам

лучше не примере покажи, точнее кодом smile
заодно меня научишь, если конечно не жалко потратить на меня время smile
очень прошу рассказать, про дырки в моем запросе smile

Добавлено через 46 секунд
Цитата(skyboy @  14.4.2008,  01:25 Найти цитируемый пост)
конечно, есть.
и даже описан в документации. там, где про limit. 

спасибо!

Автор: gta4kv 14.4.2008, 08:05
Rexona, 
Код

$id = mysql_real_escape_string( $_REQUEST['id'] );

Автор: mishaSL 14.4.2008, 13:32
Цитата(Rexona @  13.4.2008,  23:01 Найти цитируемый пост)
тем больше ИД, тем более свежая у меня новость!

"свежесть" новости, как в принципе и всего остального, лучше определять по дате (которая у вас кстати присутствует).

Т.е. запрос должен быть примерно такой:
Код

SELECT `text` FROM `news` ORDER BY `date` DESC LIMIT 3

Автор: Canarat 14.4.2008, 15:32
Цитата(gta4kv @  14.4.2008,  08:05 Найти цитируемый пост)
$id = mysql_real_escape_string( $_REQUEST['id'] );

А почему бы не использовать просто приведение к типу int?
Код

$id=(int) $_REQUEST['id'] ;

Автор: gta4kv 14.4.2008, 15:42
Цитата(Canarat @ 14.4.2008,  15:32)
Цитата(gta4kv @  14.4.2008,  08:05 Найти цитируемый пост)
$id = mysql_real_escape_string( $_REQUEST['id'] );

А почему бы не использовать просто приведение к типу int?
Код

$id=(int) $_REQUEST['id'] ;

1. id может быть - "1s9p26"
2. А если подставить не int число то оно в любом случае будет равняться нулю, а в базе может быть и элемент с нулем.

Добавлено через 42 секунды
хотя нет, судя из структуры таблицы не может.

Автор: Feldmarschall 14.4.2008, 15:47
Потому что правило универсальное.

Автор: Canarat 14.4.2008, 16:30
gta4kv, по структуре ни одно из правил не выполняется.

Смысл в универсализации, если эта переменная будет использоваться не только в запросе? В сообщении об ошибке, например? Если должно int - так пусть и будет int. Никаких жертв.

Автор: Feldmarschall 14.4.2008, 16:33
Смысл универсализации в том, что человеку показывают универсальный способ обработки любых данных, поступающих в запрос.

Автор: flashaa 14.4.2008, 22:55
Цитата(gta4kv @  14.4.2008,  15:42 Найти цитируемый пост)
1. id может быть - "1s9p26"
2. А если подставить не int число то оно в любом случае будет равняться нулю, а в базе может быть и элемент с нулем.

По-моему из этой строки "1s9p26" (int) выдаст число 1, хотя может я путаю с intval()
UPD: я прав. Кстати за эту "интелектуальность" не юзаю приведение типов при валидации

Автор: Feldmarschall 15.4.2008, 08:15
flashaa, все верно. intval - это lazy валидация.
Здесь, скорее зависит от структуры приложения. В большинстве случаев достаточно приведения. Но более корректным, конечно будет способ с проверкой - регулярками, ctype_* и так далее

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)