Datenbankabfrage für die Startseite (General)

by hintersatz, Saturday, October 29, 2016, 18:53 (2736 days ago)
edited by Auge, Monday, October 31, 2016, 07:51

Hallo,
ich möchte, da ich ein nur für registrierte Benutzer sichtbares Forum betreibe, auf der Startseite
eine Auflistung der neunen Themen der letzten 30 Tage anzeigen lassen, um das Forum für Suchmaschinen, die ja nicht reingucken können, interessanter zu machen,
einfach nur das Thema und das Datum des ersten Posts, ohne Autor und ohne sonstige
Angaben.
Ich habe grade angefangen, mich etwas mir php-Scripting zu beschäftigen, denke aber, das wird 100 Jahre dauern, bis ich das selbst hinkriege...
Liebe Grüße

Avatar

Datenbankabfrage für die Startseite

by Auge ⌂, Monday, October 31, 2016, 09:14 (2734 days ago) @ hintersatz

Hallo

ich möchte, da ich ein nur für registrierte Benutzer sichtbares Forum betreibe, auf der Startseite eine Auflistung der neunen Themen der letzten 30 Tage anzeigen lassen, um das Forum für Suchmaschinen, die ja nicht reingucken können, interessanter zu machen einfach nur das Thema und das Datum des ersten Posts, ohne Autor und ohne sonstige Angaben.

Die Auflistung soll öffentlich zugänglich sein? Die Auflistung soll den Titel und das Datum enthalten, aber vermutlich nicht auf das Posting verlinken? Das ist, technisch gesehen, recht einfach.

Ich habe grade angefangen, mich etwas mir php-Scripting zu beschäftigen, denke aber, das wird 100 Jahre dauern, bis ich das selbst hinkriege...

So ganz ohne Beschäftigung mit dem Thema wirst du auf die Dauer nicht auskommen.

Ich habe mal das Forum durchsucht, weil das Thema hier schon dann und wann aufgeploppt ist. Leider ist eine Anleitung, die es früher in der hiesigen Doklu gab, beim Umzug zu Github verloren gegangen. Eine Diskussion mit einem an der eigenen Beteiligung desinteressierten Forenadmin, die ich wiederfand, ist auch nicht zielführend.

Ich werde im Laufe des Tages (31.10.2016) eine Wikiseite mit einer Anleitung erstellen und mich dann wieder hier melden.

Tschö, Auge

--
Trenne niemals Müll, denn er hat nur eine Silbe!

Datenbankabfrage für die Startseite

by hintersatz, Monday, October 31, 2016, 09:19 (2734 days ago) @ Auge

Die Auflistung soll öffentlich zugänglich sein? Die Auflistung soll den Titel und das Datum enthalten, aber vermutlich nicht auf das Posting verlinken? Das ist, technisch gesehen, recht einfach.

So wäre es gedacht.
Danke und viele Grüße

Avatar

Datenbankabfrage für die Startseite

by Auge ⌂, Friday, November 04, 2016, 12:00 (2730 days ago) @ hintersatz

Hallo

Bevor ich meinen Entwurf in das Wiki einfüge, möchte ich ihn hier vorstellen. Das soll auch als Test für die Verständlichkeit der Erklärung und des Codes dienen. ich bitte dich hiermit um eine Rückmeldung.

Los geht's:

<?php
 
// static database settings (copy'n'paste from config/db_settings.php)
$mlfdb['host'] = 'localhost';
$mlfdb['user'] = 'database_username';
$mlfdb['password'] = 'database_password_123';
$mlfdb['database'] = 'database_name';
// initialise the global variables
$mlfReturn = false;
$mlfOutput = '';
 
/**
 * reads the latest entries from the mlf2 database
 *
 * The number of entries is defined in the query (LIMIT x).
 *
 * @param array $db
 * @param bool $debug (optional)
 * @return bool false
 * @return array
 */
function readLatestForumEntries($db, $debug = false) {
 // initialise the variable to return the output
 $r = array();
 // connecting to the database
 $connid = @mysqli_connect($db['host'], $db['user'], $db['password'], $db['database']);
 // no connection (error)
 if (!$connid) return false;
 // define the query
 @mysqli_set_charset($connid, "utf8");
  $query = "SELECT
  ft.id,  -- the id of the entry itself
  ft.tid,  -- the id of the thread (for threaded view)
  DATE_FORMAT(ft.time + INTERVAL 1 HOUR, '%d.%m.%Y %H:%i:%s') AS posting_time,  -- date format must be adapted to the language settings
  if((ft.user_id > 0), ud.user_name, ft.name) AS name,  -- user name from the forum table or the users table (if available)
  ft.subject
 FROM mlf2_forum_table AS ft
  LEFT JOIN mlf2_userdata_table AS ud
   ON ud.user_id = ft.user_id
  -- accession 0: everybody, 1: only for registered users, 2: moderators and admins only
  -- leave out, if there are no categories in your forum
  WHERE ft.category IN(SELECT id FROM mlf2_category_table WHERE accession = 0)
  ORDER BY ft.time DESC  -- latest entries as first
  LIMIT 6";  -- limit the output to the latest 6 entries
 // debugging output
 if ($debug === true) {
  echo '<h3>the query string</h3>';
  echo '<pre>'. print_r($query, true) .'</pre>';
 }
 $result = mysqli_query($connid, $query);
 // debugging output
 if ($debug === true) {
  echo '<h3>the return value of <code>mysqli_query()</code></h3>';
  echo '<pre>'. print_r($result, true) .'</pre>';
 }
 if ($result === false) return false;
 while ($row = mysqli_fetch_assoc($result)) {
  $r[] = $row;
 }
 mysqli_free_result($result);
 mysqli_close($connid);
 return $r;
}
 
$mlfOutput  = '<section id="mlfLatestEntries">';
$mlfOutput .= '<h2>Latest entries in the forum</h2>';
$mlfReturn = readLatestForumEntries($mlfdb);
//$mlfReturn = readLatestForumEntries($mlfdb, true); // for debugging purposes
// if $mlfReturn is an array, build the list of the entries, otherwise display a "no entries" message
if (is_array($mlfReturn) === true) {
 $mlfOutput .= '<ul>';
 foreach ($mlfReturn as $row) {
  $mlfOutput .= '<li>';
  // URL has to be adapted to threaded-posting-view (nested listing) if needed
  $mlfOutput .= '<a href="http://example.com/path/to/forum/index.php?id='. htmlspecialchars($row['id']) .'">'. htmlspecialchars($row['subject']) .'</a> - '. htmlspecialchars($row['name']) .', '. htmlspecialchars($row['posting_time']);
  $mlfOutput .= '</li>';
 }
 $mlfOutput .= '</ul>';
} else {
 $mlfOutput .= '<p class="mlfErrorMessage">No entries found.</p>';
}
$mlfOutput .= '</section>';
echo $mlfOutput;
 
?>

Vorgehen:

1. Speichere den Code als PHP-Datei.
2. Passe die Tabellennamen und die Datenbankzugangsdaten an ($mlfdb).
3. Passe die Anzahl der zur Darstellung vorgesehenen Postings an (LIMIT x).
4. Passe den Pfad zum Forum bei der Zusammenstellung des Links an, wenn es ein Link werden soll. Ansonsten entferne den Link und die darin enthaltene URL (<a href="..."> und </a>). Die Felder ft.id und ft.tid können dann auch aus der Abfrage raus.
5. Ersetze den Vorgabetext der Überschrift mit einem in der gewünschten Sprache (vermutlich deutsch?).
6. Lade die angepasste Datei auf deinen Webspace hoch.
7. Binde das Skript mit include('pfad/zum/skript.php'); an der gewünschten Stelle in deine Startseite ein und rufe diese auf.

Es sollten nun die x letzten Beiträge angezeigt werden. Das Datumsformat entspricht dem in Deutschland üblichen Format (tt.mm.jjjj) mit führenden Nullen. Wie gesagt, achte auf die Verlinkung, die du wohl nicht haben willst (nicht öffentliches Forum).

Um die Gestaltung mit CSS kümmern wir uns hernach.

Tschö, Auge

--
Trenne niemals Müll, denn er hat nur eine Silbe!

Datenbankabfrage für die Startseite

by hintersatz, Friday, November 04, 2016, 21:49 (2730 days ago) @ Auge
edited by hintersatz, Friday, November 04, 2016, 22:12

Hallo & vielen Dank,
Das sieht für meine Verhältnisse etwas kompliziert aus, das macht aber nichts, ich habe mir mein Orgelforum gerade auf einen xampp Server lokal installiert und so ein gutes Experimentierfeld für die neue Startseite.
Eine Korrektur bitte: ich wollte die x-neuen Themen anzeigen lassen, nicht die x-letzten Postings.
Ich gebe Bescheid, wenn ich mit dem jetzt geposteten Script "offline" bin, vielen Dank nochmals für die prompte Reaktion.
js
P.S.: ich bin ein großer Fan eures Scriptes, meine Forengemeinde übrigens auch, die würden mir glatt kündigen, wenn ich mit etwas anderem käme ;-) , daher also mein natürliches Interesse am Fortbestand des mlf; wenn ihr euch verändern möchtet, würden wir dieses Forum hier kostenfrei mithosten und ich würd's betreuen, nur so als Angebot.
LG

Avatar

Datenbankabfrage für die Startseite

by Micha ⌂, Friday, November 04, 2016, 22:14 (2730 days ago) @ hintersatz

Hallo,

Eine Korrektur bitte: ich wollte die x-neuen Themen anzeigen lassen, nicht die x-letzten Postings.

Ich habe auf einer Seite eine Liste, welche immer die letzten x unterschiedlichen Postings zeigt. Hier das Script dazu Vielleicht könnt Ihr es für Eure Dinge umbiegen.


<?php
 if (realpath($_SERVER['SCRIPT_FILENAME'])==realpath("recentForum.php")) {
  die("Kein Direktaufruf!");
 }
 
$forumfolder = "myforum";
$topic_length = 25;
$topic_limit  = 5;
$forumuri =  "http://".$_SERVER["HTTP_HOST"]."/".$forumfolder."/";
$content = "";
 
function setCurrentLength($str, $maxlen){
    $words = explode(" ",$str);
    $str = "";
    for ($i=0; $i<count($words); $i++){
        if (strlen($str)>$maxlen){
            return trim($str)."&hellip;";  
        }
        else {
            $str .= trim($words[$i])." ";
        }
    }
    return trim($str);
}
 
include_once "../".$forumfolder."/config/db_settings.php";
 
$conForumDB = mysqli_connect($db_settings['host'], $db_settings['user'], $db_settings['password']) OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysqli_error());
mysqli_query($conForumDB,'SET NAMES utf8');
mysqli_select_db($conForumDB,$db_settings['database']) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysqli_error());
 
// Kategorien bestimmen und deren Status abfragen
$Categorys = array();
$sql = "SELECT `id`, `accession` FROM `".$db_settings['category_table']."`";
$result = mysqli_query($conForumDB, $sql) or die("Query failed : " .mysqli_error());
if (mysqli_num_rows($result)){
    while($row = mysqli_fetch_array( $result )) {
        $Categorys[''.$row['id'].''] = $row['accession'];
    }
    mysqli_free_result($result);
}
 
// Letzten X-Beiträge aus der EintragsDB holen
$sql = "select `id`, UNIX_TIMESTAMP(time), `subject`, `name`, `user_id`, `category` from (select `tid`, `time`, `id`, `subject`, `name`, `user_id`, `category` from `".$db_settings['forum_table']."` WHERE `spam` = 0 order by `time` desc) g1 group by `tid` order by `time` desc limit 0, ".$topic_limit."";
$result = mysqli_query($conForumDB, $sql);
if (mysqli_num_rows($result)){
 $content .= "<ul>\n";
    while($row = mysqli_fetch_array( $result )) {
  if ($row['user_id'] != 0 && empty($row['name'])) {
   $sql_name = "select `user_name` from `".$db_settings['userdata_table']."` WHERE `user_id` = ".$row['user_id']."";
   $result_name = mysqli_query($conForumDB, $sql_name);
   $row_name = mysqli_fetch_array( $result_name );
   $row["name"] = $row_name["user_name"];
   mysqli_free_result( $result_name ); 
  }
 
 
        if ($Categorys[ $row['category'] ] != 0){
            $content .=  "\t<li><a title=\"Forum: ".$row["subject"]." (Nur registrierte Benutzer oder Mitglieder)\" href=\"".$forumuri."index.php?id=".$row['id']."\">";
            $content .=  setCurrentLength($row["subject"], $topic_length);
            $content .=  "</a> von ".$row["name"]." am ".date('d.m.Y - H:i', $row["UNIX_TIMESTAMP(time)"])." Uhr <img style=\"margin:0; padding:0; border:none;\" src=\"".$forumuri."themes/default/images/registered.gif\" alt=\"f&uuml;r registrierte Nutzer\" title=\"\" /></li>\n";
        }
        else {
            $content .=  "\t<li><a title=\"Forum: ".$row["subject"]."\" href=\"".$forumuri."index.php?id=".$row['id']."\">";
            $content .=  setCurrentLength($row["subject"], $topic_length);
            $content .=  "</a> von ".$row["name"]." am ".date('d.m.Y - H:i', $row["UNIX_TIMESTAMP(time)"])." Uhr</li>\n";
        } 
 
    }
    $content .=  "</ul>\n";
 
    mysqli_free_result($result);    
}
echo $content;
?>

Gruß Micha

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

Datenbankabfrage für die Startseite

by hintersatz, Monday, November 07, 2016, 03:00 (2727 days ago) @ Auge
edited by Micha, Monday, November 07, 2016, 22:23

Hallo!
Das gepostete Script habe ich wie angegeben verändert:


<?php
 
// static database settings (copy'n'paste from config/db_settings.php) 
$mlfdb['host'] = 'localhost'; 
$mlfdb['user'] = 'forum'; 
$mlfdb['password'] = 'strenggeheim'; 
$mlfdb['database'] = 'forum'; // initialise the global variables 
$mlfReturn = false; 
$mlfOutput = '';
 
/**
 * reads the latest entries from the mlf2 database
 *
 * The number of entries is defined in the query (LIMIT x).
 *
 * @param array $db
 * @param bool $debug (optional)
 * @return bool false
 * @return array
 */
function readLatestForumEntries($db, $debug = false) {
 // initialise the variable to return the output
 $r = array();
 // connecting to the database
 $connid = @mysqli_connect($db['host'], $db['user'], $db['password'], $db['database']);
 // no connection (error)
 if (!$connid) return false;
 // define the query
 @mysqli_set_charset($connid, "utf8");
  $query = "SELECT
  ft.id,  -- the id of the entry itself
  ft.tid,  -- the id of the thread (for threaded view)
  DATE_FORMAT(ft.time + INTERVAL 1 HOUR, '%d.%m.%Y %H:%i:%s') AS posting_time,  -- date format must be adapted to the language settings
  if((ft.user_id > 0), ud.user_name, ft.name) AS name,  -- user name from the forum table or the users table (if available)
  ft.subject
 FROM mlf2_forum_table AS ft
  LEFT JOIN mlf2_userdata_table AS ud
   ON ud.user_id = ft.user_id
  -- accession 0: everybody, 1: only for registered users, 2: moderators and admins only
  -- leave out, if there are no categories in your forum
  WHERE ft.category IN(SELECT id FROM mlf2_category_table WHERE accession = 0)
  ORDER BY ft.time DESC  -- latest entries as first
  LIMIT 10";  /* limit the output to the latest 10 entries */
 /* debugging output */
 if ($debug === true) {
  echo '<h3>the query string</h3>';
  echo '<pre>'. print_r($query, true) .'</pre>';
 }
 $result = mysqli_query($connid, $query);
 // debugging output
 if ($debug === true) {
  echo '<h3>the return value of <code>mysqli_query()</code></h3>';
  echo '<pre>'. print_r($result, true) .'</pre>';
 }
 if ($result === false) return false;
 while ($row = mysqli_fetch_assoc($result)) {
  $r[] = $row;
 }
 mysqli_free_result($result);
 mysqli_close($connid);
 return $r;
}
 
$mlfOutput  = '<section id="mlfLatestEntries">'; $mlfOutput .= '<h2>Latest entries in the forum</h2>'; 
$mlfReturn = readLatestForumEntries($mlfdb); 
//$mlfReturn = readLatestForumEntries($mlfdb, true); // for debugging purposes // if $mlfReturn is an array, build the list of the entries, otherwise display a "no entries" message if (is_array($mlfReturn) === true) {
 $mlfOutput .= '<ul>';
 foreach ($mlfReturn as $row) {
  $mlfOutput .= '<li>';
  // URL has to be adapted to threaded-posting-view (nested listing) if needed
  $mlfOutput .= '<a href="localhost/mlf/index.php?id='. htmlspecialchars($row['id']) .'">'. htmlspecialchars($row['subject']) .'</a> - '. htmlspecialchars($row['name']) .', '. htmlspecialchars($row['posting_time']);
  $mlfOutput .= '</li>';
 }
 $mlfOutput .= '</ul>';
} else {
 $mlfOutput .= '<p class="mlfErrorMessage">No entries found.</p>'; } $mlfOutput .= '</section>'; echo $mlfOutput;
 
?>

-----------------------------------------------------------------------------------

In Zeile 43 musste ich die Kommentierung verändern
In Zeile 75 ( } else { ) bekomme ich die Fehlermeldung:

Parse error: syntax error, unexpected '}' in C:\xampp\htdocs\start.php on line 75

Viele Grüße
Jürgen

Avatar

Datenbankabfrage für die Startseite

by Micha ⌂, Monday, November 07, 2016, 22:26 (2727 days ago) @ hintersatz

Hi,

In Zeile 75 ( } else { ) bekomme ich die Fehlermeldung:

Korrekt, weil dort ein else ohne das zugehörige if steht.

Wenn Du das Ende mal wie folgt modifizierst, solltest Du zumindest keinen Fehler mehr erhalten:

$mlfOutput = '<section id="mlfLatestEntries">'; $mlfOutput .= '<h2>Latest entries in the forum</h2>'; 
$mlfReturn = readLatestForumEntries($mlfdb); 
//$mlfReturn = readLatestForumEntries($mlfdb, true); // for debugging purposes // if $mlfReturn is an array, build the list of the entries, otherwise display a "no entries" message if (is_array($mlfReturn) === true) {
$mlfOutput .= '<ul>';
foreach ($mlfReturn as $row) {
$mlfOutput .= '<li>';
// URL has to be adapted to threaded-posting-view (nested listing) if needed
$mlfOutput .= '<a href="localhost/mlf/index.php?id='. htmlspecialchars($row['id']) .'">'. htmlspecialchars($row['subject']) .'</a> - '. htmlspecialchars($row['name']) .', '. htmlspecialchars($row['posting_time']);
$mlfOutput .= '</li>';
}
$mlfOutput .= '</ul>';
$mlfOutput .= '</section>'; echo $mlfOutput;

Viele grüße
Micha

P.S. Ich habe in Deinem Beitrag mal den PHP-Code hervorgehoben. Es liest sich dann deutlich einfacher.

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

RSS Feed of thread