[PHP/mySQL] Download-Bewertung klappt nicht

MetalM

gehört zum Inventar
Download-Bewertung klappt nicht

Hallo Leute!

Also, mein problem ist etwas kompliziert:
Ich biete im Portal eine Download-Sektion an.
Dort können User die Downloads auch bewerten.

Folgende Probleme treten auf:
Wenn ich als untregistrierter User bewerte 8was normal auch gehen sollte) dann kommt eine Fehlermeldung, etwa so:
Es trat ein problem mit der SQL-datenbank auf, der Webmaster wurde informiert.
Die Fehlermeldung wird vom PHP-Skript ausgegeben, nicht von der SQL-Datenbank.

Wenn ich als registrierter User einen Downalod bewerte, passiert erstmal gar nix.
Die bewertung wird zwar in die MySQL-datenbank aufgenommen, mir aber später nicht angezeigt, d.h. Bewertungen:1, Bewertet mit:0.
:(

ich kann Euch ja eine *.php mal hier posten, aber ich weiss ja noch nicht mal welche.
Testet am besten selber: www.thunderbirdforum.de

Hm, was kann ich da machen?

Gruß
Metal M
 
Zuletzt bearbeitet:
Auf Basis dieser Infos ist es schlich unmöglich, auch nur einen Ansatz zu finden. Ein Problem mit der mySQL-Datenbank kann alles Mögliche sein, von einem fehlerhaften Select bis hin zum kompletten Fehlschlag der Verbindung.
"Der Webmaster wurde informiert" deutet daraufhin, dass das Script in der Lage ist, die Fehlermeldungen an eine definierte Mailadresse zu schicken - wenn Du in der Konfiguration keine hinterlegt hast, dann bekommst Du sie natürlich nicht.
Ohne die exakte Meldung werden wir aber nicht weiterkommen.
 
Also, die Fehlermeldung lautet:
"A database error has occurred
The webmaster has been notified of the error"
und sie kommt vom php-Skript.

Wie gesagt, in der Datenbank selber tauchen die Bewertungen ja auf, sie werden auf der Seite dann nur nicht angezeigt, aber die Zahl der Bewertungen wird angezeigt, auch von wem sie stammt.
Also werden zumindest Daten an die MySQL Datenbank gesendet ;)

Danke schonmal!
 
"The webmaster has been notified of the error"
Der Webmaster bist doch Du, oder? Schau nochmal in meinen obigen Beitrag und dann in die Doku zu dem von Dir verwendete Script. Ich bin fast sicher, das Du irgendwo eine Adresse eintragen kannst, an die die echten Fehlermeldungen von mySQL geschickt werden.
 
Also, in der doku steht nix, das Skript ist auch korrekt eingerichtet.
Hier die fehlermeldung dir mir per eMail gesendet wurde:
On /index.php?name=Downloads While executing query "SELECT * FROM cms_downloads_votedata WHERE ratinglid=98 AND ratinguser='outside' AND ratinghostname = 'XX.XXX.255.78' AND TO_DAYS(NOW()) - TO_DAYS(ratingtimestamp) < " the following error occured: 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 '' at line 1 In: /www/htdocs/thbird/modules/Downloads/index.php on line: 634 Guest information: User id: 1 Username: Anonymous Admin:

Die IP habe ich unkenntlich gemacht ;)
 
Genau so eine mySQL-Fehlermeldung hab ich gemeint :)
Umso schlimmer, dass sie auch nicht direkt weiterhilft - da müsste man jetzt die Datenbank einsehen können, um zu prüfen, ob diese Abfrage Aussicht auf Erfolg hätte.
 
Hier hast Du mal die index.php.
Konnte in Line 643 nix übles finden.

mySQl Version: 4.0.23

Danke erstmal ;)

Du hast PN
 

Anhänge

  • index.php.zip
    7,7 KB · Aufrufe: 122
Den korrekten Syntax könntest du evtl. hinbekommen, wenn du das TO_DAYS(NOW()) - TO_DAYS(ratingtimestamp) in Klammern setzt, da das Resultat davon dein AND-Kriterium sein soll. Sollte das "<" auch in dem PHP-Befehl stehen, hat es an dieser Stelle nichts zu suchen.

Suche am besten genau diesen Befehl in deinem Code und poste den betreffenden Bereich, damit man genau sieht, wie der Befehl im Code ausschaut.


salayna
 
Hier die syntax:

PHP:
/* Check if ANONYMOUS user is trying to vote more than once per day. */
    if ($ratinguser==$anonymous){
        $yesterdaytimestamp = (time()-(86400 * $MAIN_CFG[$module_name]['anonwaitdays']));
        $ytsDB = Date("Y-m-d H:i:s", $yesterdaytimestamp);
        $result= $db->sql_query("SELECT * FROM ".$downloadsprefix."_votedata WHERE ratinglid=$ratinglid AND ratinguser='$anonymous' AND ratinghostname = '$ip' AND TO_DAYS(NOW()) - TO_DAYS(ratingtimestamp) < ".$MAIN_CFG[$module_name]['anonwaitdays']);
        $anonvotecount = $db->sql_numrows($result);
        if ($anonvotecount >= 1) {
            $error = "anonflood";
            completevote($error);
            $passtest = "no";
        }
    }
    /* Check if OUTSIDE user is trying to vote more than once per day. */
    if ($ratinguser=="outside") {
        $yesterdaytimestamp = (time()-(86400 * $outsidewaitdays));
        $ytsDB = Date("Y-m-d H:i:s", $yesterdaytimestamp);
        $result= $db->sql_query("SELECT * FROM ".$downloadsprefix."_votedata WHERE ratinglid=$ratinglid AND ratinguser='outside' AND ratinghostname = '$ip' AND TO_DAYS(NOW()) - TO_DAYS(ratingtimestamp) < $outsidewaitdays");
        $outsidevotecount = $db->sql_numrows($result);
        if ($outsidevotecount >= 1) {
            $error = "outsideflood";
            completevote($error);
            $passtest = "no";
        }
    }
    /* Passed Tests */
    if ($passtest == "yes") {
        $comment = Fix_Quotes($comment);
        /* All is well.  Add to Line Item Rate to DB. */
        $db->sql_query("INSERT into ".$downloadsprefix."_votedata values (NULL,'$ratinglid', '$ratinguser', '$rating', '$ip', '$ratingcomments', now())");
        /* All is well.  Calculate Score & Add to Summary (for quick retrieval & sorting) to DB. */
        /* NOTE: If weight is modified, ALL downloads need to be refreshed with new weight. */
        /*     Running a SQL statement with your modded calc for ALL downloads will accomplish this. */
        $voteresult = $db->sql_query("SELECT rating, ratinguser, ratingcomments FROM ".$downloadsprefix."_votedata WHERE ratinglid = $ratinglid");
        $totalvotesDB = $db->sql_numrows($voteresult);
        include ("modules/$module_name/voteinclude.php");
        $db->sql_query("UPDATE ".$downloadsprefix."_downloads SET downloadratingsummary=$finalrating,totalvotes=$totalvotesDB,totalcomments=$truecomments WHERE lid = $ratinglid");
        $error = "none";
        completevote($error);
    }
 
Versuche mal:

$result= $db->sql_query("SELECT * FROM ".$downloadsprefix."_votedata WHERE ratinglid=$ratinglid AND ratinguser='$anonymous' AND ratinghostname = '$ip' AND ((TO_DAYS(NOW()) - TO_DAYS(ratingtimestamp)) < ".$MAIN_CFG[$module_name]['anonwaitdays']."));


salayna

PS: Das ist Zeile 6
 
@salayna
hab ich gemacht, geht leider nicht.
Die Seite bleibt weiss, ich bekomme keinen Inhalt angezeigt :(
 
Darum ging es ja gerade auch nicht.
Es ging darum, den SQL-Syntax zu korrigieren, damit es keine Fehlermeldung mehr gibt. Gibt es diese Meldung denn noch?

Der eigentliche Inhalt, der mit dem Befehl abgefragt werden soll, ist eine andere Sache. Dem kommt man mit ein paar Codeschnipseln nicht auf die Spur. Dafür muß kontrolliert werden, was in den Variablen steht, die in der SQL-Abfrage enthalten sind etc.

Zudem arbeite ich bei solchen Dingen immer mit einem lokalen Server inkl. PHP und MySQL, und taste mich oft an die Probleme heran, habe also auch nicht jeden Syntax im Kopf, sondern probiere oft bis es klappt. :angel
(Das mit dem lokalen Webserver solltest du übrigens auch machen, wenn du es nicht schon so machst, da es für deine Besucherinnen und Besucher nervig sein kann, wenn du an der laufenden Webseite arbeitest.)


salayna
 
Erstmal danke für deine schnelle Hilfe.

Es ist ja so: wenn ich keinen Inhalt auf der seite angezeigt bekomme, kann ich ja auch nicht testen, ob die fehlermeldung noch kommt.
Bin zur zeit auf Maloche und habe da nicht die Tools und Möglichkeiten wie daheim ;)

Normal teste ich diese Dinge auch lokal, aber von der Maloche aus geht das nicht :(
 
Dann mußt du wohl warten, bis du wieder zu Hause bist.

Bei Betrachtung deines Codes fällt mir aber auf, daß die Vergleiche etwas zu hinken scheinen.

Bei $yesterdaytimestamp = (time()-(86400 * $MAIN_CFG[$module_name]['anonwaitdays'])); multiplizierst du einen ganzen Tag in Sekunden mit der Variable $MAIN_CFG[$module_name]['anonwaitdays'], was nur Sinn macht, wenn die Variable eine ganzzahlige Angaben von Tagen ist. Ansonsten wird die $yesterdaytimestamp viel zu groß.

In Zeile sechs wiederum muß ein vermutlich in Sekunden vorgegebener Wert kleiner sein, als die vermutlich ganzzahlige Variable $MAIN_CFG[$module_name]['anonwaitdays'], um den Inhalt der DB zu bekommen. Das kann nicht funktionieren.


salayna
 
Hm, also soll ich die oben gepostete variable wieder einbauen?
Aber woran liegt es dann, das ich die seite nicht mehr angezeigt bekomme?

danke schonmal ;)
 
Woran das liegt, ist aus dem Code nicht ersichtlich. Für mich zumindest nicht.
Da du aber ein Script verwendest, das die Programmfunktionen nicht strikt von der Darstellung der Ausgabe getrennt hält, kann der Fehler überall im Code stecken.

salayna
 
Also, es klappt noch immer nicht.

Es gibt noch eine Date 'voteinclude' auch die habe ich hier mal angehangen.

Hm, ich weiss echt nicht weiter :(

Danke trotzdem!
 

Anhänge

  • voteinclude.zip
    1,1 KB · Aufrufe: 138
Oben