Seite 1 von 2

Portal Random Poll

Verfasst: 02.05.2008 17:34
von Demolition_FABI
Ich habe sowas nirgends gefunden und hab jetzt einfach mal versucht, selber einen Mod draus zu machen, schaut's euch mal an und sagt mir, ob ma des so machen kann (also des kann ma auf jeden Fall, weil es funktioniert :D ) aber halt, ob es so von der Form etc. in Ordnung ist und ob man es evtl. noch optimieren könnte (bin nich so der Profi in PHP, kann nur das was ich schon hab, ein bisschen abändern, bis es funktioniert^^)

Ich habe leider auch keine Ahnung, wie man Mods hochladen kann, oder ähnliches, aber ich glaube, es wäre am besten, wenn ma das bei den Snippets hinzufügen würde, oder?
##############################################################
## MOD Title: Replace recent poll on Intro + Portal Mod with a random poll
## MOD Author: Demolition_FABI < http://www.htfs.de/kontakt.php > http://www.htfs.de/
## MOD Description: The recent poll on the portal.php is replaced with a random poll from the forum-IDs,
## you have selected in the ACP.
##
## MOD Version: 1.0.1
##
## Installation Level: Easy
## Installation Time: 1 Minute
## Files To Edit: 1
## portal_poll.php
##
## Included Files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD's not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
##############################################################
## MOD History:
##
## 2008-05-01 - Version 1.0.0
## - First release
## 2008-05-01 - Version 1.0.1
## - removed some useless things
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################

#
#-----[ OPEN ]------------------------------------------
#
portal_poll.php

#
#-----[ FIND ]------------------------------------------
#
$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
t.topic_time DESC
LIMIT
0,1';

#
#-----[ REPLACE WITH ]------------------------------------------
#
$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
RAND()
LIMIT
0,1';

#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM

Verfasst: 02.05.2008 18:06
von Boecki91
Für Snipplets kannst du auch einfach ein Team-Mitglied aus dem Mod bereich per PM anschreiben.

Die schauen sich das dann an und achten hauptsächlich auf die "Idoten-Sicherheit" :wink:

So nun aber zum Code:
Es fehlen die Einrückungen, ohne die findet man die Codestellen nicht/nur schwer (Stichwort: Idotensicher :D )

Zur Schleife:

Die ist Blöde aufgebaut, erst eine If Abfrage und dann eine nachgestellte while-Schleife, und vor allem was soll die machen?

Code: Alles auswählen

$postrow = array();
if ($row = $db->sql_fetchrow($result))
{
do
{
$postrow[] = '';
}
while ($row = $db->sql_fetchrow($result));

$total_polls = count($postrow);
} 
Wie Wäre es so::

Code: Alles auswählen

$total_polls = 0;
while ($db->sql_fetchrow($result));
{
    $total_polls++
}
Ist jetzt nicht getestet, aber dürfte den Sinn und Zweck deines Schleifenmonsters nahe kommen.

Aber warum du den 1. After add Block brauchst verstehe ich nicht, zumal mySQL eine Zufallsfunktion eingebaut hat, wie es mit anderen DB-Systemen steht weiß ich nicht (Aber da kannst du dich als Mod-Entwickler schau machen :wink: )

Aber wie Nutzt man diese Zufallsfunktion:
Suche:

Code: Alles auswählen

$sql = 'SELECT
t.*,
vd.*
FROM
' . TOPICS_TABLE . ' AS t,
' . VOTE_DESC_TABLE . ' AS vd
WHERE
t.forum_id IN (' . $forum_sql . ') AND
t.topic_status <> 1 AND
t.topic_status <> 2 AND
t.topic_vote = 1 AND
t.topic_id = vd.topic_id
ORDER BY
t.topic_time DESC
LIMIT
0,1'; 
Und Ersetze

Code: Alles auswählen

t.topic_time DESC
mit

Code: Alles auswählen

RAND()
Somit sparrst du dir den gesamten 1. Block, und hast auch keine Probleme wenn Umfrage "5-10" gelöscht wurden.


Edit: Ich sollte vielleicht sagen das das dennoch eine super Arbeit war, sich selbst hinzusetzen und eine Lösung zu entwickeln, anstatt hier nach Hilfe zu schreien :grin: , mein Beitrag sollte Hinweise geben wie man das ganze möglichst einfacher und schneller gestallten kann, also möglichst sachliche Kritik, keinesfalls soll deine Arbeit als Nutzlos dargestellt werden.

Verfasst: 02.05.2008 19:08
von Demolition_FABI
Hmm, ja guut, das ist ja fast langweilig, so einfach^^ :P
Na, aber wie gesagt, ich habe nicht so viel Ahnung von Php, ich hab die ganzen Schleifen aus irgendwelchen anderen Dateien genommen, aber so ist es wohl um einiges einfacher und funktioniert auch wunderbar (habs probiert :) )
Also ich habs oben aktualisiert, wobei des dann wohl für nen Mod fastn bissl wenig ist, aber so könnte ich es dann als Snippet "einschicken", oder?

Auf jeden Fall, vielen Dank für die super Ratschläge und die schnelle Antwort! ;)

Verfasst: 02.05.2008 22:02
von Boecki91
Jetzt müsstest du nur noch die originalen Zeilen-Einrückungen rein bringen (Vielleicht anstatt den Zitat-Klammern Code Klammern verwenden, die sind dafür gemacht worden):D

Du hast recht für einen Mod ist das zu wenig, eventuell wird das als Snipplet aufgenommen einfach mal jemanden aus dem Team anschreiben, Jan und Tobi sind regelmäßig da

Verfasst: 04.05.2008 15:16
von Demolition_FABI
Hm, sorry, aber was ist die originale Zeilen-Einrückungen?

Jetzt hätte ich noch ne Idee und wollt doch erst mal hier fragen, weil wenn das wieder so einfach ist, dann brauch ich mir nich wieder so viel Arbeit umsonst machen^^:

Würde es irgendwie einfach gehen, dass nur Umfragen angezeigt werden, an denen man schon teilgenommen hat?

Verfasst: 04.05.2008 15:42
von Boecki91
Leider habe ich kein phhpBB2 mehr installiert, vor allem keinen Portal Mod.

Vom Prinzip her müsstest du in einer der Umfragen-Tabellen so etwas finden wie die voter_id oder user_id drin ist, diese Id ist nur da drin wenn man schon an der Umfrage Teilgenommen hat.

Eventuell kannst du die portal_poll.php als dowload bereitstellen und sagen welche Spalten alles in den Umfrage-Tabellen sind.


KB:datei

Verfasst: 04.05.2008 15:59
von Demolition_FABI
Hm, ja also das Problem ist, die Umfrage wird ja aus der phpbb_vote_desc geladen mit

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
WHERE 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';
aber wer bei einer Umfrage schon teilgenommen hat, wird in der phpbb_vote_voters Tabelle mit den Spalten vote_id und vote_user_id gespeichert. (Die phpbb_vote_desc-Tabelle hat nur die Spalten vote_id, topic_id, vote_text, vote_start und vote_length)

Die Function in der portal_poll.php sieht so aus:

Code: Alles auswählen

function phpbb_fetch_poll($forum_sql) 
{ 
global $db; 

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
WHERE 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND()
LIMIT
0,1';

if (!$query = $db->sql_query($sql)) 
{ 
message_die(GENERAL_ERROR, 'Could not query poll information', '', __LINE__, __FILE__, $sql); 
}

$result = $db->sql_fetchrow($query); 

if ($result) 
{ 
$sql = 'SELECT 
* 
FROM 
' . VOTE_RESULTS_TABLE . ' 
WHERE 
vote_id = ' . $result['vote_id'] . ' 
ORDER BY 
vote_option_id'; 

if (!$query = $db->sql_query($sql)) 
{ 
message_die(GENERAL_ERROR, 'Could not query vote result information', '', __LINE__, __FILE__, $sql); 
} 

while ($row = $db->sql_fetchrow($query)) 
{ 
$result['options'][] = $row; 
} 
} 

return $result; 
}
Nochmal vielen Dank für deine schnelle und super Hilfe ;)

Verfasst: 04.05.2008 16:17
von Boecki91
Ich habe mal wieder blind rum geschrieben:

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.* 
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd 
' . VOTE_VOTERS_TABLE . ' AS vv 
WHERE 
vv.vote_id = vd.vote_id AND
vv.vote_user_id = ' . $userdata['user_id'] . ' AND
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';
Schau mal was da jetzt bei rauskommt, nicht nur du bist gespannt :D

Verfasst: 04.05.2008 16:41
von Demolition_FABI
Hmm, also in der constants.php steht:

Code: Alles auswählen

define('VOTE_USERS_TABLE', $table_prefix.'vote_voters');
- Also nicht VOTE_VOTERS_TABLE, sondern VOTE_USERS_TABLE
- nach "' . VOTE_DESC_TABLE . ' AS vd" muss ein Komma denk ich
- und oben fehlt das "vv.*" oder? (also was auch immer das macht^^)

Also es müsste wenn dann so heißen:

Code: Alles auswählen

$sql = 'SELECT 
t.*, 
vd.*, 
vv.*
FROM 
' . TOPICS_TABLE . ' AS t, 
' . VOTE_DESC_TABLE . ' AS vd, 
' . VOTE_USERS_TABLE . ' AS vv 
WHERE 
vv.vote_id = vd.vote_id AND 
vv.vote_user_id = ' . $userdata['user_id'] . ' AND 
t.forum_id IN (' . $forum_sql . ') AND 
t.topic_status <> 1 AND 
t.topic_status <> 2 AND 
t.topic_vote = 1 AND 
t.topic_id = vd.topic_id 
ORDER BY 
RAND() 
LIMIT 
0,1';

Kommt aber trotzdem die Fehlermeldung:
Could not query poll information

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND t.forum_id IN (29) AND t.topic_status <> 1 AND t.topic_st

SELECT t.*, vd.*, vv.* FROM phpbb_topics AS t, phpbb_vote_desc AS vd, phpbb_vote_voters AS vv WHERE vv.vote_id = vd.vote_id AND vv.vote_user_id = AND t.forum_id IN (29) AND t.topic_status <> 1 AND t.topic_status <> 2 AND t.topic_vote = 1 AND t.topic_id = vd.topic_id ORDER BY RAND() LIMIT 0,1
Wenn ich das "vv.vote_user_id = ' . $userdata['user_id'] . ' AND " weglösche, dann funktionierts wieder ohne Fehlermeldung, aber natürlich nicht mit dem gewünschten Effekt...
Hast du vielleicht noch ne Idee auf Lager ;) ?

Verfasst: 04.05.2008 17:54
von Boecki91
jo das habe ich :D


Der, die, das Array (interresante Frage oder?) "userdata" ist in der Funktion nicht bekannt, du müsst es erst bekannt machen, was der nachfolgende Cod ersetzt kannst du dir bestimmt denken

Code: Alles auswählen

global $db, $userdata;
das vv.* kannst du weglassen, damit das "schöner" wird solltest du anstatt vv dann auch vu verwenden, ich musste die Konstante "raten".