[GELÖST] Newssystem mit PHP und MYSQL

Hallo,

ich arbeite gerade an einem Newssystem, bei der ich über einer Datenbank Newseinträge erstellen möchte.
Später auch sortieren nach News und Veranstaltungen.

Mein Problem ist, dass immer nur der neuste Eintrag angezeigt wird.

news.php http://bpaste.net/show/LB5xt7lA5kprTEXjmTpJ/

news-html.php http://bpaste.net/show/0tNktTDBBSbtFPlbmBJ7/

Man kann anschließend auf einem Button klicken wodurch der gesamte Text angezeigt wird.

Auf weitere Verbesserungsvorschläge würde ich mich freuen =).

MfG,
Danny77.

Und du möchtest … alle Einträge angezeigt bekommen? Dann musst du jede Datenreihe zwischenspeichern, und nicht, wie du es jetzt tust, mit der jeweils aktuelleren die vorherige überschreiben. Oder du gibst alles direkt aus.

Verbesserungsvorschläge: mysql-API möglichst bald nicht mehr verwenden, weil veraltet und wird bald entfernt. Alternativen: siehe White-Tiger’s Beitrag.

Mfg

MySQL ist sicher nicht veraltet und wird auch nicht von PHP entfernt^^ [size=85](naja gut… MariaDB is ne bessere MySQL Datenbank als die von MySQL selbst xD Aber das is was anderes)[/size]
Was du meinst Mgier ist die alte PHP Schnittstelle… da diese durch mysqli ersetzt wurde und ansonsten, wie auch früher schon, PDO genutzt werden kann.

Hallo Mgier & White-Tiger,

danke für die schnellen Antworten.

Wäre es dann für mich vorteilhaft MariaDB zu nehmen?
Jetzt komme ich eigentlich schon recht gut mit Mysql zu fahren, deshalb wäre eine Umstellung mühevoll.

Dabei speichere ich alle Daten in ein Array ?
Wie mache ich es dann bei der Ausgabe, damit genau so viele Beiträge sind wie in der Datenbank eingetragen wurden (dazu müssen meine div container doch auch vervielfältigt werden)?
Ich habe es bereits probiert ein php Abfrage um mein Code zu legen, allerdings scheint es so als dürfte kein html und css darinstehen.

Von der Sicherheit oder Funktionalität her meines momentanen Codes, wie würde es ein Profi machen ? Gibt es hierfür auch noch Verbesserungsvorschläge.

MfG,
Danny77.

[quote=“White-Tiger”]MySQL ist sicher nicht veraltet und wird auch nicht von PHP entfernt^^ [size=85](naja gut… MariaDB is ne bessere MySQL Datenbank als die von MySQL selbst xD Aber das is was anderes)[/size]
Was du meinst Mgier ist die alte PHP Schnittstelle… da diese durch mysqli ersetzt wurde und ansonsten, wie auch früher schon, PDO genutzt werden kann.[/quote]

Argh, natürlich. Da ist mir die Formulierung missglückt. Das wäre dezent unangenehm, würde MySQL entfernt werden :wink:

[quote]Dabei speichere ich alle Daten in ein Array ?
Wie mache ich es dann bei der Ausgabe, damit genau so viele Beiträge sind wie in der Datenbank eingetragen wurden (dazu müssen meine div container doch auch vervielfältigt werden)?
[/quote]

In diesem Falle müsstest du bei der Ausgabe eben wieder ein Schleife durchlaufen. Das sollte nicht das Problem sein, du musst dir aber im Klaren darüber sein, wie deine Datenstruktur aussieht.

[quote]
Ich habe es bereits probiert ein php Abfrage um mein Code zu legen, allerdings scheint es so als dürfte kein html und css darinstehen.[/quote]

Was?

Im Prinzip musst du sicherstellen, dass der eintragende Benutzer nur das Eintragen kann, was er auch verwenden darf. Darf er z.B. Html-Code verwenden, könnte er dadurch die Seite ziemlich verunstalten oder gar Javascript einschleusen (Stichwort: XSS). Darf er keinen Html-Code verwenden, wäre die Verwendung von Html-Tags an dieser Stelle zu unterbinden.

Ein Sicherheitsproblem ergibt sich vor allem wo Daten von Usern in die Datenbank eingetragen werden. Wenn du da nicht aufpasst können sehr böse Menschen sehr viel Schaden anrichten. Stichwort: SQL-Injection

Mfg

Hallo Mgier,
danke für die Antwort.

Ich habe es bereits versucht eine Schleife bei der Ausgabe zu verwenden, dort zeigte es mir bei jedem HTML Tag aber einen Fehler an, weshalb ich vermutete dass dort keiner stehen darf.

der Code welcher in die Schleife soll:

[code]

News


<?php echo $head ?>

geschrieben von: <?php echo $autor ?>am: <?php echo date('d-m-Y', $datum) ?>

<?php echo $inhalt ?>

[/code]

Vielleicht hab ich auch die falsche Bedingung gewählt ?

Bei meinem Newssystem kann keiner der Benutzer was eintragen.
Muss ich mir also wegen der aufgeführten Methoden (XSS und SQL-Injection) keine Sorgen machen ?

[quote=“danny77”][…]
Wäre es dann für mich vorteilhaft MariaDB zu nehmen?
Jetzt komme ich eigentlich schon recht gut mit Mysql zu fahren, deshalb wäre eine Umstellung mühevoll.
[…][/quote]^^ MariaDB ist eher was, was du eh nicht beeinflussen kannst :stuck_out_tongue: Das ist die Datenbank Software die auf dem Server läuft… Und MariaDB ist auch eine MySQL Datenbank… [size=85](Problem mit MySQL ist, das es nicht nur die Software selbst ist, sondern auch der DB Standard… daher MySQL!=MySQL :stuck_out_tongue: Das eine kann die Software sein, das andere der Typ :stuck_out_tongue:)[/size] Selbst wenn hier MariaDB liefe, würde man es in PHP auch wie MySQL nutzen… weil es quasi MySQL ist.

Mgiers anliegen ging halt eher um PHP’s Schnittstelle…
Und aktuelle wären:
mysqli
PDO
die alte die du verwendest könnte in einem Jahr schon nicht mehr gehen z.B.^^

[quote=“White-Tiger”][quote=“danny77”][…]
Wäre es dann für mich vorteilhaft MariaDB zu nehmen?
Jetzt komme ich eigentlich schon recht gut mit Mysql zu fahren, deshalb wäre eine Umstellung mühevoll.
[…][/quote]^^ MariaDB ist eher was, was du eh nicht beeinflussen kannst :stuck_out_tongue: Das ist die Datenbank Software die auf dem Server läuft… Und MariaDB ist auch eine MySQL Datenbank… [size=85](Problem mit MySQL ist, das es nicht nur die Software selbst ist, sondern auch der DB Standard… daher MySQL!=MySQL :stuck_out_tongue: Das eine kann die Software sein, das andere der Typ :stuck_out_tongue:)[/size] Selbst wenn hier MariaDB liefe, würde man es in PHP auch wie MySQL nutzen… weil es quasi MySQL ist.

Mgiers anliegen ging halt eher um PHP’s Schnittstelle…
Und aktuelle wären:
mysqli
PDO
die alte die du verwendest könnte in einem Jahr schon nicht mehr gehen z.B.^^[/quote]

Hallo White-Tiger,

dann habe ich umsonst diese “Schnittstelle” gelernt -.-.
Heißt das dann auch, dass die Programme welche ich mit MySQL gemacht habe nicht mehr funktionieren?
Welche alternative würdet ihr mir dann raten ?


Edit:
Jetzt habe ich noch ein Problem, die Ausgabe der Arrays funktioniert nicht wie es sollte.
http://bpaste.net/show/b8qrFTRk6sxJMvIEpoy7/


EditEdit:
Lösung des Problems zuvor:
Man muss bei der Ausgabe des Arrays am Ende noch [0] anhängen.
Bsp.
.$head[$ie][0].
Oder besser kein Multidimensionales Array…

MfG,
Danny77.

Hallo,
sorry erstmal für Doppelposting.

Nun habe ich mal wieder ein weiteres Problem welches ich nicht gelöst bekomme. Ich habe den gesamten Code jetzt auf MySQLi verändert.

Problem:
Jetzt sollte man die Daten aus der Datenbank sortieren können (Alle(), News(), Veranstaltungen()) . Bei mir funktioniert das durch klicken eines Buttons wodurch man auf eine andere HTML Seite verlinkt wird. Ich erstelle eine Bedingung falls diese Seite aktiv ist, sollen die Werte angezeigt werden welche in der dafür vorgesehene Schleife zu finden sind.

Allerdings funktioniert das ganze nur unter “Alle” (news-html), somit nur dort wo alle Beiträge ausgegeben werden.

Wenn ich “News” oder “Veranstaltung” aufrufe ist alles leer (auch die Variablen mit der Anzahl der Beiträge sind leer).
Fehlermeldungen gibt es keine.
Gebe ich $event aus, zeigt es mir an, dass Daten vorhanden sind, deshalb sollten die Daten ordentlich in der Variable gespeichert werden.
Die foreach schleife müsste auch in Ordnung sein, weil sonst dürfte es bei “Alle” nicht funktionieren.

Hier der Code:
http://bpaste.net/show/OpnLJteEeK2pRrmVsWD2/

:wink: ,
Danny77.

„Fehlermeldungen gibt es keine.“ sagst du, dabei sehe ich nirgends, dass du auch auf MySQL Fehler überprüfst.

Davon mal abgesehen machst du 3 Queries, von denen du aber doch nur einen zur Zeit brauchst?
In deinem Fall würde man wahrscheinlich eher etwas in der Art machen:

if($site=='news-html'){ $alle = $db->query("SELECT * FROM news ORDER BY 'id' DESC"); // ... } elseif($site=='news-html-kat-news'){ $news = $db->query("SELECT * FROM news WHERE kategorie='news' ORDER BY 'id' DESC"); // ... } elseif($site=='news-html-kat-event'){ $event = $db->query("SELECT * FROM news WHERE kategorie='veranstaltung' ORDER BY 'id' DESC"); // ... }
Die if-elseif Konstruktion gibt ja schon an, dass nur eine der drei Möglichketien ausgeführt wird.
D.h. wenn $allearray gefüllt wird (wobei die Art wie du es machst nicht funktionieren kann, du „überschreibst“ den Wert von $allearray mit jedem Schleifendurchlauf mit einem neuen Array) dann sind $newsarray und $eventarray definitiv nicht gesetzt. In deiner aktuellen Konstruktion ist immer nur eines der Drei Variablen gesetzt.

Wenn du nicht weißt wann was womit gefüllt ist, gebe die Variablen doch einfach mal zu Debug zwecken mit var_dump() zu unterschiedlichen Zeitpunkten im Code aus.

Edit: hääh.

$allearray= array( $idreihe[$i] = $row['id'], $head[$i] = $row['head'], $autor[$i] = $row['autor'], $datum[$i] = $row['cdate'], $inhalt[$i] = $row['text'], $kategorie[$i] = $row['kategorie'], );
Das ergibt überhaupt keinen Sinn.
Dieser Code hat den selben Effekt, als wenn das “array” Konstrukt gar nicht erst dabei ist. Es ist also äquivalent zu folgendem:

$idreihe[$i] = $row['id']; $head[$i] = $row['head']; $autor[$i] = $row['autor']; $datum[$i] = $row['cdate']; $inhalt[$i] = $row['text']; $kategorie[$i] = $row['kategorie'];

Woher weißt du, dass dort die korrekte $idreihe genutzt wird? Du hast ja nur eine Variable $idreihe in allen Fällen. Und die Information, um welche Liste es sich genau handelt (news-html, kat-news, kat-events) fehlt komplett, wegen deinem ungeschicktem Array Konstrukt.
Falls du denkst, dass das $anzahlbeiall in irgendeiner art und weise das $anzahlbeiall von ganz oben referenziert, liegst du falsch.

Falls das ein Kommentar im HTML sein soll, die schreibt man so:

Ich glaube du solltest deine Codestruktur noch mal grundlegend überdenken.

Gruß Balmung

Hallo Balmung,
danke für die Rückmeldung.

Wenn ich mehrere Datensätze in der Datenbank habe, brauch ich doch ein Array um alle Daten einzutragen. Würde ich das ohne array machen würde es mir doch immer nur den letzten Eintrag ausgeben. Oder meintest du, dass ich das array falsch gemacht habe ?

Die würde ich brauchen um die Anzahl der Einträge auslesen zu können, weil ich gerne auf jeder html-Seite die Anzahl der Beiträge von News, Veranstaltung angeben möchte. Wären die Querys in der Schleife habe ich ja kein Zugriff mehr auf den Inhalt der Querys, welche nicht auf der aktiven Seite sich befinden. Oder gibt es eine bessere Möglichkeit ?

Sollte ich den Variablen im Array dann auch einen anderen Namen geben ? Wenn sich diese Überschreiben wäre das eigentlich kein Problem, weil es sollen doch nur die Datensätze ausgegeben werden, welche aus der Datenbank ausgelesen werden.
Ich habe die Bezeichnung aber trotzdem mal geändert.

Die Variablen $eventarray und $newsarray scheinen immer noch nicht gefüllt zu werden. Gebe ich diese auf der news-html aus, werden mir diese angezeigt, gehe ich auf news-html-kat-news werden diese doch nicht ausgegeben.
Vermutlich immer noch ein Fehler bei der foreach Schleife (ausgabe) ?

Habs nun so verändert:

if($site=='news-html-kat-news'){ $news = $db->query("SELECT * FROM news WHERE kategorie='news' ORDER BY 'id' DESC"); $anzahlbeinews = $news->num_rows; $i=0; foreach($news as $row) { $i++; $newsarray= array( $idreihe[$i] = $row['id'], $head[$i] = $row['head'], $autor[$i] = $row['autor'], $datum[$i] = $row['nedatum'], $inhalt[$i] = $row['text'], $kategorie[$i] = $row['kategorie'], ); var_dump($news); $db->error; } }

[code]foreach((array)$ie as $anzahlbeinews){
$ie++;
echo’

’;
echo’

’.$head[$ie].’

’;
echo’’;
echo’geschrieben von: ‘.$autor[$ie].‘am: ‘.$datum[$ie].‘Kategorie: ‘.$kategorie[$ie].’
’;
echo’

’.$inhalt[$ie].’

’;

}[/code]

Edit:

Ich denke ich habe meinen Fehler gefunden… Facepalm…
Im Quellcode habe ich stehen.

if($site=='news-html') { require_once('news.php'); }
Somit kann das erst gar nicht funktionieren :(.
Tut mir Leid Balmung, dich wegen so einen Fehler genervt zu haben.

Nun geht alles wie gewollt.
http://bpaste.net/show/bemhZktfNnt4ZOQZ6lde/

:wink: ,
Danny77.

Klar, du machst es aber grundlegend falsch.

(in welcher „Schleife“? :wink: )
Naja, es ist halt nicht ganz ersichtlich, was genau du machen willst. Offensichtlich willst du mit den Queries ja alle Datensätze auslesen, und nicht nur die Anzahl ermitteln. Das macht man normal mit einem “SELECT COUNT(*) FROM …”

(ich hab grad keine Zeit, ich gehe auf den Rest deines Beitrages später ein)

[quote=“Balmung”][]
(in welcher „Schleife“? :wink: )
[][/quote]
Von dem wie es sich hier anhört, scheint man der penetranten if-schleife zum opfer zu fallen xD

Hallo,
danke für die Rückmeldung =).

Ja sorry ich meinte die IF-Bedingung nicht Schleife.

Könntest du mir bitte erläutern was ich falsch gemacht habe beim Array.

Achso wenn das mit Count auch funktioniert dann wäre das optimal, danke.
Könntest du mir eventuell auch erklären, warum es besser ist dass ich die Querys in der Bedingung abfrage als außerhalb ? Wegen der Belastung/Ausnutzung ?

:wink: ,
Danny77.

Das problem ist, dass dein $newsarray immer nur ein Element enthält, und nicht alle Elemente, wie du es gerne hättest.

Um deinen Code mal etwas umzuschreiben:

if($site=='news-html-kat-news'){ $news = $db->query("SELECT * FROM news WHERE kategorie='news' ORDER BY 'id' DESC"); $newsarray = array(); // neues leeres array initialisieren. foreach($news as $row) { $newsarray[] = $row; } }
Es ist deutlich kürzer und es gibt auch keine unnötige Zählvariable.
Alle informationen die du brauchst, sind direkt oder indirekt über $newsarray zu ermitteln.
mit count() kannst du auch leicht die Anzahl Elemente ermitteln. z.B.:

$anzahl = count($newsarray);Wobei das nur dann Sinn ergibt, wenn in $newsarray alle Datensätze vorhanden sind, was besonders bei Seitenweiser Ausgabe nicht der Fall ist (in dem Fall ist aber auch num_rows nicht effektiv).

Mit COUNT kann man in etwas so zählen (natürlich ungetestet):

$result = $db->query("SELECT COUNT(*) AS count FROM tabelle WHERE bla='blubb'"); $row = $result->fetch_assoc(); $row_count = $row['count'];

Möchtest du das $newsarray dann unten irgendwo ausgeben.
Hier als Beispiel mitten im HTML Code.

[code]

Anzahl News: <?php echo count($newsarray); ?>
<?php foreach($newsarray as $row) { ?>
<?php echo $row['autor']; ?>
<?php echo $row['id']; ?>
<?php } ?>
[/code]

Hallo Balmung,

vielen vielen Dank =).

Funktioniert :p .

http://bpaste.net/show/7t4YTZ3k6a3JcSLJ8Fgq/

:wink: ,
Danny77.

[quote=„danny77“]Hallo Balmung,

vielen vielen Dank =).

Funktioniert :p .

http://bpaste.net/show/7t4YTZ3k6a3JcSLJ8Fgq/

:wink: ,
Danny77.[/quote]

Was bringt eigentlich das $ie++ ?

nix xD Aber immerhin kann man zählen^^
++$ie wäre auch performanter… [size=85](würde man es brauchen… wobei count() eigl. auch gehen sollte)[/size]

[quote=“White-Tiger”]nix xD Aber immerhin kann man zählen^^
++$ie wäre auch performanter… [size=85](würde man es brauchen… wobei count() eigl. auch gehen sollte)[/size][/quote]

Ja aber dann würde man doch kein foreach verwenden

das $ie ist lediglicht ein überbleibsel vom alten Code, das einfach nur vergessen wurde zu entfernen.