PHP, baza danych, system newsów

Witam, jestem początkującym webmasterem i mam problem. Otóż chcę stworzyć system newsów o ile tak się na to mówi, jednymi słowy takie coś jak jest na stronie głównej dobreprogramy.pl, że jak dodam newsa to on automatycznie doda się do contentu newsów i tego pierwszego(teraz drugiego) przesunie w dół, a ostatniego doda do 2 strony, czyli mieści się na niej 10 newsów. Zrobiłem to prowizorycznie w HTML&CSS jak ma taki news wyglądać, jest to obrazek na pół strony z napisami transparentami(przezroczysty o czarno-jasnym tle napis). Wiecie jak mi pomóc? Nie mam zielonego pojęcia od czego zacząć i jak to zrobić, wiem, że to będzie w bazie danych oraz jakieś wycudaczone skrypty.

Żadnych cudacznych skryptów. W najprostszym przypadku:

Robisz tabelę z newsami (news): id [id] (int, autoincrement), data dodania [added] (timestamp), tytuł [subject] (varchar, 250), zajawka [teaser] (text), zawartość [content] (longtext).

Przykładowe zapytanie generujące tabelę SQL:

CREATE TABLE IF NOT EXISTS `news` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `subject` varchar(250) DEFAULT NULL,
    `teaser` text,
    `content` longtext,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

Teraz na stronie gdzie mają się wyświetlać newsy wywołujesz zapytanie:

SELECT `id`,`added`,`subject`,`teaser` FROM `news` ORDER BY `added` DESC LIMIT 0, 10

w ten sposób pobierzesz dziesięć ostatnich rekordów - 0 to przesunięcie, 10 to liczba rekordów na stronie więc przesunięcie wyliczasz wg. wzoru

(numer strony - 1) * liczba rekordów na stronie

<div id=“content1-10”>

<div id=“content1”>

<span class=“content1-2transparent”>Treść transparentu</span>

<img src=“images/foto.jpg” class=“content1-2grafika”>

</div>

 

to jest mój div, mam ich 10, więc muszę dodać to w ten sposób?

 

<?php

SELECT id,added,subject,teaser FROM news ORDER BY added DESC LIMIT 0, 10

?>

<div id=“content1-10”>

<div id=“content1”>

<span class=“content1-2transparent”>Treść transparentu</span>

<img src=“images/foto.jpg” class=“content1-2grafika”>

</div>

Niestety nie jest to takie proste, potrzebujesz mechanizmu połączenia z bazą danych.

Na ten moment polecany jest PDO:

$connection = new PDO('mysql:host=NAZWA_HOSTA;dbname=NAZWA_BAZY_DANYCH', 'UZYTKOWNIK', 'HASLO');
$query = $connection->query('SELECT `id`,`added`,`subject`,`teaser` FROM `news` ORDER BY `added` DESC LIMIT 0, 10');
while ($news = $query->fetch(PDO::FETCH_OBJ)) {
    echo <<<HTMLDOC
    kod w heredocu
HTMLDOC;
}
$query->closeCursor();
unset($connection);

Chwilka to już wszystko?

W HEREDOCu wstawiasz kod HTML tak jak jest, a następnie osadzasz w nim zmienne z PHP-e, np.

echo <<<HTMLDOC
<h3>{$news->subject}</h3>
HTMLDOC;

GioWDS już mam wszystko gotowe jak na talerzu, znalazłem przyzwoity system newsów i wszystko pięknie działa, teraz jak mam gotowca to mogę się z niego uczyć i ogarniać funkcje,bo jak sam piszę to nic z tego nie wychodzi, teraz tylko myślę nad limitem newsów, bo mogę ich dodawać w nieskończoność a chciałbym maksymalnie 10, czy istnieje jakikolwiek skrypt na to? mam “jakiś tam” ale coś mi tu nie działa 

W dzisiejszych czasach odchodzi się od stosowania funkcji mysql_*, nie ma sensu uczyć się czegoś co za chwilę będzie usunięte z języka.

Musisz przynajmniej podać jaki komunikat błędu występuje u Ciebie.

Postaram się zrobić coś prostego:

config.php

<?php
define('DB_DNS', 'mysql:host=localhost;dbname=baza_danych');
define('DB_USER', 'root');
define('DB_PASSWD', '');

index.php

<?php
$pdo = new PDO(DB_DNS, DB_USER, DB_PASSWD, array(1002 => 'SET NAMES utf8'));
$query = $pdo->query('SELECT `id`,`added`,`subject`,`teaser` FROM `news` ORDER BY `added` DESC LIMIT 0, 10');
while ($news = $query->fetch(PDO::FETCH_OBJ)) {
    echo <<<HTMLDOC
<article>
<header>{$news->subject}</header>
{$news->teaser}
<footer>
<a href="news.php?id={$news->id}">czytaj dalej &rArr;</a>
|
dodany dnia {$news->added}
</footer>
HTMLDOC;
}
$query->closeCursor();
unset($connection);

news.php

<?php
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
 header('HTTP/1.1 404 NOT FOUND');
 return;
}
$pdo = new PDO(DB_DNS, DB_USER, DB_PASSWD, array(1002 => 'SET NAMES utf8'));
$query = $pdo->prepare('SELECT * FROM `news` WHERE `id` = :id');
$query->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
// za niedługo dokończę

Resztę kodu jeszcze dzisiaj Ci dopiszę, na razie muszę lecieć na miasto.

Korzystam z tego tutorialu http://phpocean.com/tutorials/back-end/create-a-simple-news-site-with-php-and-mysql-using-pdo/11

Dość podobne, będzie dobrze - nawet już się nie męczę z kończeniem mojego dłubania w 5 minut :stuck_out_tongue:

Czyli skrypt z tutorialu jest OK, ale co z tym “limitem postów”. MySql jest aktualnie nieużyteczny, masz jakiś pomysł, żeby to działało? Chodzi mi o samą technikę działania, bo jestem kompletnie zielony w tym całym PHP, dodam także, że system ten w prawdzie jest podobny do tego na forum, gdy dodany zostanie post to ten pierwszy schodzi na pozycję nr.2, a najnowszy na pozycję nr.1, zaś ostatni wędruje na stronę poprzednią czyli drugą.

Znaczy sam php do tego mało ma. To już kwestia kwerendy do SQL - podam Ci analogiczny przykład na podstawie mojego pierwszego postu:

SELECT `id`,`added`,`subject`,`teaser` FROM `news` ORDER BY `added` DESC LIMIT 0, 10

Czyli kolejno:

SELECT - wybierz dane w postaci listy pól po przecinku lub wildcard (* - wszystkie)

id,added,subject,teaser - wybrane pola

FROM - z

news - dane z tabeli news

ORDER BY - posortowane według

added DESC - pola added, ale w odwrotnej kolejności (DESC)

LIMIT - ogranicz zasób danych

0 - przesunięcie zestawu danych (0 - od początku)

10 - ilość wyników jaka ma zostać zwrócona

CREATE TABLE IF NOT EXISTS 'info_news'(
'news_id' int(11) NOT NULL AUTO_INCREMENT, 
'news_title' varchar(255) NOT NULL, 
'news_short_description' text NOT NULL, 
'news_full_content' text NOT NULL,
'news_author' varchar(120) NOT NULL,
'news_published_on' int(46) NOT NULL, 
'added' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ('news_id') ) ENGINE=InnoDB DEFAULT CHARSET=UTF-8 AUTO_INCREMENT=1 ;

 

Dodaje własną komendę

 

SELECT `news_id` ,`news_title`, `news_short_description`, `news_author`, `news_published_on`, `added` FROM `info_news` ORDER BY `added` DESC LIMIT 0, 4  

 

wszystko ładnie, system załapał, ale … coś nie widzę zmian. Mam 5 postów, a ustawiłem blokadę na 4 więc dlaczego nadal mam pięć postów? Oczywiście dodaję tą komendę do SQL w tabelce, nie bazie.

 

W pliku functions mam takie coś : 

 

function fetchNews( $conn )
{
 
$request = $conn->prepare(" SELECT news_id, news_title, news_short_description, news_author, news_published_on
FROM info_news,
ORDER BY news_published_on DESC");
return $request->execute() ? $request->fetchAll() : false; 
}
 
 
function getAnArticle( $id_article, $conn )
{
 
$request =  $conn->prepare(" SELECT news_id,  news_title, news_full_content, news_author, news_published_on
FROM info_news
WHERE news_id = ? ");
return $request->execute(array($id_article)) ? $request->fetchAll() : false; 
}
 
 
function getOtherArticles( $differ_id, $conn )
{
$request =  $conn->prepare(" SELECT news_id,  news_title, news_short_description, news_full_content, news_author, news_published_on
FROM info_news
WHERE news_id != ? ");
return $request->execute(array($differ_id)) ? $request->fetchAll() : false; 
}

 

No więc zmieniłem ORDER BY na new_published_on i nici z tego.

SELECT `news_id` ,`news_title`, `news_short_description`, `news_author`, `news_published_on`, `added` FROM `info_news`ORDER BY `news_published_on` DESC LIMIT 0, 4

Zacznij używać tagu code

Dodaj sobie funkcję:

function fetchOnPage(PDO $connection, $page) {
    $items = 4;
    $query = $connection->query(sprintf('SELECT `news_id`, `news_title`, `news_author`,`news_published_on` FROM `info_news` ORDER BY `news_published_on` DESC LIMIT %d, %d', ($page - 1) * $items, $items));
    if ($query) {
        $result = $query->fetchAll();
        $query->closeCursor();
    }
    return isset($result) ? $result : false;
}

Ogólnie nie rozumiem tej manii dodawania prefiksów do nazw pól.

Nadal nic, mogę dodawać nieskończenie wiele postów. Próbowałem na przykładzie z tutorialu oraz na swojej stronce. Chyba zacznę szukać innego przykładu/tutorialu działania tego systemu newsów z limitem potów na stronie, bo śleńczę już kilka dni nad tym “czymś” i cały dzień główkuję i szukam odpowiedzi po necie, a przecież to nie jest nowość w programowaniu i to “coś” ma każda dynamiczna strona internetowa.

A pokaż kod strony która się wywołuje przy wyświetlaniu treści na stronie.

Oto kod z tutorialu ( lepiej ten, bo moja strona jest tak zniekształcona, dlatego chcę najpierw ogarnąć system newsów, potem logowanie i rejestrację, następnie zabiorę się za jej optymalizacje).


za wyświetlanie odpowiada 

index.php

<?php require __DIR__.'/includes/functions.php' ?>
<html>
<head>
<title>Welcome to news channel</title>
    <link rel="stylesheet" type="text/css" href="design/style.css">
</head>
<body>

    <div class="container">

        <div class="welcome">
            <h1>Latest news</h1>
            <p>Welcome to the demo news site. <em>We never stop until you are aware.</em></p>
        </div>

        <div class="news-box">

            <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>

            <div class="news">
                <h2><a href="read-news.php?newsid=2">Second news title here</a></h2>
                <p>This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>

            <div class="news">
                <h2><a href="read-news.php?newsid=3">Thirst news title here</a></h2>
                <p>This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>

            <div class="news">
                <h2><a href="read-news.php?newsid=4">Fourth news title here</a></h2>
                <p>This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>

			            <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			            <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			            <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			           <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			           <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			           <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			           <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
			
			           <div class="news">
                <h2><a href="read-news.php?newsid=1">First news title here</a></h2>
                <p> This news short description will be displayed at this particular place. This news short description will be displayed at this particular place.</p>
                <span>published on Jan, 12th 2015 by zooboole</span>
            </div>
        </div>

        <div class="footer">
            phpocean.com © <?= date("Y") ?> - all rights reserved.
        </div>

    </div>
</body>
</html>

łączenie z bazą danych

dbcontent.php

<?php
        $pdo = null;
        function connect_to_db()
        {
            $dbengine = 'mysql';
            $dbhost = 'localhost';
            $dbuser = 'root';
            $dbpassword = '';
            $dbname = 'news';

            try{
                $pdo = new PDO("".$dbengine.":host=$dbhost; dbname=$dbname", $dbuser,$dbpassword);
                $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
                return $pdo;
            }  
            catch (PDOException $e){
                $e->getMessage();
            }
        }
?>

oraz … sam nie wiem  :-D , chyba łączenie z tablicami z tego co wiem

functions.php

<?php 
    require __DIR__.'/../config/dbconnect.php'; 

    function fetchNews( $conn )
    {

        $request = $conn->prepare(" SELECT news_id, news_title, news_short_description, news_author, news_published_on FROM info_news ORDER BY news_published_on DESC");
        return $request->execute() ? $request->fetchAll() : false; 
    }


    function getAnArticle( $id_article, $conn )
    {

        $request = $conn->prepare(" SELECT news_id, news_title, news_full_content, news_author, news_published_on FROM info_news WHERE news_id = ? ");
        return $request->execute(array($id_article)) ? $request->fetchAll() : false; 
    }


    function getOtherArticles( $differ_id, $conn )
    {
        $request = $conn->prepare(" SELECT news_id, news_title, news_short_description, news_full_content, news_author, news_published_on FROM info_news WHERE news_id != ? ");
        return $request->execute(array($differ_id)) ? $request->fetchAll() : false; 
    }
	
	function fetchOnPage(PDO $connection, $page) {
    $items = 4;
    $query = $connection->query(sprintf('SELECT `news_id`, `news_title`, `news_author`,`news_published_on` FROM `info_news` ORDER BY `news_published_on` DESC LIMIT %d, %d', ($page - 1) * $items, $items));
    if ($query) {
        $result = $query->fetchAll();
        $query->closeCursor();
    }
    return isset($result) ? $result : false;
}
?>

  • css, ale to tylko wygląd strony więc raczej nie ma nic do całego php.

 

Sprawdzałem stronkę na Chrome, Mozilla, Opera, bo czasami Chrom wyprawiał mi różne psikusy, ale tym razem wszędzie działa jednakowo.

A gdzie jest kod wyświetlający na stronie?

Na podanym kodzie index.php jest XYZ newsów w formie HTML, a nie generowanej z PHP-a.

Powinno być coś takiego:

<?php
$newsList = fetchOnPage($pdo, isset($_GET['page']) ? intval($_GET['page']) : 1);
foreach($newsList as $news) {
    echo <<<HTMLDOC
<div class="news">
<h2><a href="read-news.php?newsid={$news['news_id']}">{$news['news_title']}</a></h2>
{$news['news_short_description']}
<span>published on {$news['news_published_on']} by {$news['news_author']}</span>
</div>
HTMLDOC;
}
?>

musisz także dodać pole news_short_description do funkcji fetchOnPage.

:glupek2: No przecie, mam jakiś tam kod, nie doczytałem i go pominąłem, bo przecież po co mi to, heh.

<div class="news-box">

<div class="news">
<?php
// get the database handler
$dbh = connect_to_db(); // function created in dbconnect, remember?
// Fecth news
$news = fetchNews($dbh);
?>

<?php if ( $news && !empty($news) ) :?>

<?php foreach ($news as $key => $article) :?>
<h2><a href="read-news.php?newsid=<?= $article->news_id ?>"><?= stripslashes($article->news_title) ?></a></h2>
<p><?= stripslashes($article->news_short_description) ?></p>
<span>published on <?= date("M, jS Y, H:i", $article->news_published_on) ?> by <?= stripslashes($article->news_author) ?></span>
<?php endforeach?>

<?php endif?>
</div>

</div> 

Tylko gdzie tu wstawić echo? Jak to działa w tym PHP, te wyświetlanie tekstu? W wakacje czeka mnie długa lektura.

Zamien:

fetchNews($dbh);

Na:

fetchOnPage($dbh, isset($_GET['page']) ? intval($_GET['page']) : 1);