Für den PHP-Profi "Knacknuss"

Alles, was PHP betrifft, kann hier besprochen werden.

Für den PHP-Profi "Knacknuss"

Postby www.internet-umfrage.ch » 07. April 2005 08:31

Guten Tag

Seit Tagen kommen ich an meinem Ranking-Script nicht weiter.

Ausgangslage:

- Das Ranking-Script soll im Hauptverzeichnis liegen
- Das Script soll einen rekursiven Durchsucher machen in der nächsten
Ebene der Unterverzeichnisse wo swf-Dateien liegen.Innerhalb jedes dieser Unterverzeichnisse liegt ein weiteres Unterverzeichnis "comments" (zu jeder swf in comments = 1 Datei mit gleichem Namen, jedoch .txt anstatt .swf)
- Die Votings in den .txt-Dateien haben nur eine einzige Zeile: Bsp: 6|24
(= 6 Stimmen und Total 24 Punkte ), was kalkuliert einen durchschn.
Wert von 4.00 ergibt.
- Beim Durchsuchen nach dem Vorhandensein sollen diese Werte
und der passende Link zu der swf-Datei in ein Array gespeichert werden.
- Am Ende der Durchsuchung soll das Array nach dem höchsten Wert
sortiert werden, und es sollen nur die ersten 10 besten ausgegeben
werden.

Uff .... ich kann ja etwas PHP, aber seit Tagen komme ich nicht weiter. Wer könnte mir bitte mal den Code anschauen, ev korrigieren, das wäre super nett, ich verlier langsam meine Nerven vor lauter Googeln, Versuchen und Testen ohne Erfolg.

Anbei der Code, bei welchem das "Formular-Feld" noch weg sollte, und das Script bei Aufruf automatisch starten sollte:

Code: Select all
<? echo "

<form action=\"$PHP_SELF\" method=\"post\">
<input type=\"text\" size=\"10\" maxlength=\"246\" name=\"xdateitypx\">
<input type=\"submit\" value=\"Bewertungen suchen\">
</form>";

$dir = ".";
$lastModification = lastmodification('.');
echo $lastModification;
function lastmodification($verzeichniss){
$xdateitypx = $HTTP_POST_VARS["xdateitypx"];
global $xdateitypx;
global $var1;
$dir = @opendir($verzeichniss);
while ($datei = @readdir($dir)){
$test = $verzeichniss."/".$datei."";
$DomainName="http://www.blablabla.ch";
 if(is_dir($test)){
 if($datei != "." && $datei != ".."){
                   echo "";
                  lastmodification($test);
                  }
             }
             elseif(stristr($datei,$xdateitypx)&&stristr($test,"votes") ){

           
            $fp = @fopen("$test", "r");
            $ligne = @fgets($fp,4096);
            $tt_votes = strrchr($ligne, "|");
            $tt_votes = str_replace("|", "", $tt_votes);
            $tt_votes = trim($tt_votes);
            $ligne = strrev($ligne);
            $nb_votes = strrchr($ligne, "|");
            $nb_votes = strrev($nb_votes);
            $nb_votes = str_replace("|", "", $nb_votes);
            $nb_votes = trim($nb_votes);
            @fclose($fp);
            $tt_votes = @round($tt_votes / $nb_votes,2);//errechnet Wert

   $array = array();
   array_push($array,"$tt_votes  $test");
    }
     clearstatcache();
       }
          };
$x = 0;
while($x<10){$x = ($x + 1);
echo $array[$x];};
?>



Leider passiert nichts, ich Verzweifle, was ist falsch, was muss ich ändern?

Für Hilfe bin ich sehr dankbar.
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:

Nachtrag: Als Dank 10 Tage Banner 468x60

Postby www.internet-umfrage.ch » 07. April 2005 23:28

Wer mir helfen kann soll auch etwas bekommen ... :D :
10 Tage lang Dein Banner im Format gif oder jpeg 468x60 (kein Sex oder unesthetisches) auf der Seite www.playonline.ch in welche am Schluss das Script kommen soll.

:P Danke im Voraus für Hilfe
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:

Postby jakimo72 » 08. April 2005 07:47

Code: Select all
<?php

function lastmodification($verzeichniss, $xdateitypx)
{   
  $array = array();   
  $dir = @opendir($verzeichniss);
  if($dir === false)
    echo "Fehler beim anzeigen des Verzeichnisses";
   
  while ($datei = @readdir($dir))
  {
  $test = $verzeichniss."/".$datei."";
 
  if(is_dir($test)){
    if($datei != "." && $datei != "..")
    {
       $verzarray = lastmodification($test, $xdateitypx);
       $array = array_merge($array, $verzarray);
       
    }
  }
  elseif(stristr($datei,$xdateitypx) )
  {
      $pi = pathinfo($test);
      /*Basename soll wirklich nur den Basisnamen enthalten*/
      /*TODO: funktioniert nicht mit datei 'test.swf.swf.swf'*/
      $pi["basename"] = str_replace($xdateitypx,'',$pi["basename"]);
      /* Zusammensetzen des Files mit den Bewertungen */
      $votefile = $pi["dirname"]."/comments/".$pi["basename"].".txt";
     
      if(!file_exists($votefile))
      {
        echo "Votefile $votefile existiert nicht.<br>";
        break;
      }
     
     $fp = fopen($votefile, "r");
     
     $ligne = fgets($fp,4096);
     $bewert = explode("|",$ligne); //Aufteilen in Teilstrings
     $tt_votes = round(end($bewert)/$bewert[0],2);
      $array[$test] = $tt_votes;
     
    }
    clearstatcache();
  }
  return $array;
};



echo "

<form action=\"$PHP_SELF\" method=\"post\">
<input type=\"text\" size=\"10\" maxlength=\"246\" name=\"xdateitypx\">
<input type=\"submit\" value=\"Bewertungen suchen\">
</form>";

if(empty($_POST["xdateitypx"]))
{
  echo "Bitte Dateierweiterung inclusive dem Punkt angeben: z.B.   \".swf\"  ";
  return;   
}

$dir = ".";
$array = lastmodification('.',$_POST["xdateitypx"]);

arsort ($array); // Sortieren des Arrays nach Bewertung
reset ($array);
$counter = 0;
while((list ($key, $value) = each ($array)) && $counter<10)
{
  $counter++;   
  echo "$counter. <a href=\"$key\">".$key."</a> mit durchschnittlich ".$value." Stimmen<br>";
}


?>

Ich mag keine globalen Variablen, daher der zusätzliche
Parameter.

Dein Hauptfehler war es, dass die Funktion keinen Rückgabewert hatte...
Als Rückgabewert habe ich ein assoziatives Array genommen, das ist einfach zu sortieren.

Dein Parsen des Bewertungsstrings funktionierte zwar, aber ich glaube ich kann es eleganter ;-)
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Nochmals

Postby www.internet-umfrage.ch » 08. April 2005 09:53

Hallo
Danke für Deine Hilfe. Das ist leider nicht was ich brauch. Es kommen auch Fehler. Habe fälschlicherweise "comments" anstatt "votes" geschreiben, mein Fehler!
Dazu benötige ich nicht eine Abfrage, sondern eine direkt ausgeführte Ranking-Liste der 10 besten Spiele und daneben gleich ein Link der zum jeweiligen Spiel führt.

Ich glaub wir vergessen mein chaotisches Script und ich erkläre nur den Sachverhalt. Sorry.



Code: Select all
1.
Das "ranking.php" - Script, um welches es hier geht, liegt im Verzeichnis
"swf":
- ranking.php

2.
In diesem Verzeichnis "swf" liegen weitere Unterverzeichnisse (= die einzelnen Spiel-Gattungen, aber auch andere die nicht benötigt werden):
Bsp. - Unterverzeichnis "abenteuer"
Bsp. - Unterverzeichnis "neuheiten"
etc ...

3.
In diesen Unterverzeichnissen (Bsp."abenteuer") liegen die Spiele:
Bsp. - arcane1.swf
Bsp. - arcane2.swf
Bsp. - irgendeinspiel.swf
etc...

und dazu jeweils ein Unterverzeichnis "votes" mit den Bewertungen zu
den einzelnen Spielen (Es kann jedoch sein, dass da noch keine Bewertung existiert! oder, dass die Bewertung 0 ist [Problem: Division by Zero!] :
Bsp. - arcane1.txt
Bsp. - arcane2.txt
Bsp. - irgendeinspiel.txt
etc...


Nun meine Problem-Stellung: Das Script sollte also ...

1. Nur die Unterverzeichnisse innerhalb der Spiel-Gattungen suchen, welche als Verzeichnis "votes" heissen

2.Aus diesen Verzeichnissen "votes" :
- sämtliche Bewertungen (Beispiel arcane1.txt) die Bewertungen berechnen (Die Votings in den .txt-Dateien haben nur eine einzige Zeile: Bsp: 6|24  ... was einen durchschnittlichen Wert für das Spiel von 4.00 ergeben soll

3.Das Script soll nun sämtliche Bewertungen aus allen Spielgattungen und dazu den Link zum Spiel in ein Array nehmen, danach sortieren mit der besten Bewertung = oben.

4. Das Script soll nun nur die 10 besten Bewertungen ausgeben, und  daneben den Link zum Spiel

    jedoch: der Link-Name soll der Name des Spiels ohne die Dateiendung .swf sein gekürzt auf 20 Zeichen und dahiter drei Punkte ...
    bei einer gemachten Kürzung des Link-Namens

    Bsp: der Ausgabe jedoch nun als ID benötigt:

 5.00 dergrossekampfmitdem... <a href="abenteuer/spiel.php?id=dergrossekampfmitdemloewen"><br>
 4.95 arcane01 <a href="abenteuer/spiel.php?id=arcane01"><br>
 4.94 arcane02 <a href="abenteuer/spiel.php?id=arcane05"<br>
 4.00 irgendeinspiel <a href="irgendwas/spiel.php?id=irgendeinspiel">

Hast Du oder jemand eine Script-Lösung dazu? Für Hilfe bin ich sehr dankbar!
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:

Postby Wiedmann » 08. April 2005 10:20

nur 2 Anmerkungen:
- Downloadscripts die auch ein Ranking anbieten gibt es ja zuhauf und sind in den gäningen Scriptarchiven zu finden.
- ist die Lösung mit den Textdateien ziemlich suboptimal und eigentlich eine Aufgabe für ein DMBS (z.B. MySQL oder SQLite)
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Danke

Postby www.internet-umfrage.ch » 08. April 2005 13:00

Wow, danke für die tolle Antwort, echt grosser Dank :
Wiedmann wrote:nur 2 Anmerkungen:
- Downloadscripts die auch ein Ranking anbieten gibt es ja zuhauf und sind in den gäningen Scriptarchiven zu finden.
- ist die Lösung mit den Textdateien ziemlich suboptimal und eigentlich eine Aufgabe für ein DMBS (z.B. MySQL oder SQLite)


In der Zwischenzeit hat man mir in einem andern Forum wirklich weiterhelfen können: (Auch wenn nicht perfekt, es klappt)

Wer Lust hat ... zu bereinigen eines Layen-Scripts , im Voraus schon danke!

Hier das Laien-Script:



Code: Select all

<?php
echo"<div align="center"><br>Top-10 Spiele<br>(Gemäss Spiel-Votes)<br><br>";
function lastmodification($verzeichniss, $xdateitypx)
{   
  $array = array();   
  $dir = @opendir($verzeichniss);
  if($dir === false)
    echo "Fehler beim anzeigen des Verzeichnisses";
   
  while ($datei = @readdir($dir))
  {
  $test = $verzeichniss."/".$datei."";
 
  if(is_dir($test)){
    if($datei != "." && $datei != "..")
    {
       $verzarray = lastmodification($test, $xdateitypx);
       $array = array_merge($array, $verzarray);         
    }
  }
  elseif(stristr($datei,$xdateitypx) )
  {
      $pi = pathinfo($test);
      /*Basename soll wirklich nur den Basisnamen enthalten*/
      /*TODO: funktioniert nicht mit datei 'test.swf.swf.swf'*/
      $pi["basename"] = str_replace($xdateitypx,'',$pi["basename"]);
      /* Zusammensetzen des Files mit den Bewertungen */
      $votefile = $pi["dirname"]."/votes/".$pi["basename"].".txt";
     
      if(!file_exists($votefile))
      {
 //       echo "Votefile $votefile existiert nicht.<br>";
        break;
      }
     
     $fp = fopen($votefile, "r");
     
     $ligne = fgets($fp,4096);
     $bewert = explode("|",$ligne); //Aufteilen in Teilstrings
     $tt_votes = round(end($bewert)/$bewert[0],2);
     $array[$test] = $tt_votes;
     
    }
    clearstatcache();
  }
  return $array;
};


$xdateitypx = ".swf";

$dir = ".";
$array = lastmodification('.',$xdateitypx);

arsort ($array); // Sortieren des Arrays nach Bewertung
reset ($array);
$counter = 0;
while((list ($key, $value) = each ($array)) && $counter<10)
{
  $counter++;
  $key2 = str_replace(".swf","",$key);
  $key3 = $key2;
  $key3 = str_replace("./abenteuer/","",$key3);
  $key3 = str_replace("./denkspiele/","",$key3);
  $key3 = str_replace("./ballerspiele/","",$key3);
  $key3 = str_replace("./diverses/","",$key3);
  $key3 = str_replace("./erotikspiele/","",$key3);
  $key3 = str_replace("./fighting/","",$key3);
  $key3 = str_replace("./geschick-reaktion/","",$key3);
  $key3 = str_replace("./jump-n-run/","",$key3);
  $key3 = str_replace("./karten-casino/","",$key3);
  $key3 = str_replace("./klassiker/","",$key3);
  $key3 = str_replace("./neuheiten/","",$key3);
  $key3 = str_replace("./sport-simulationen/","",$key3);
  $key3 = str_replace("./weltraumspiele/","",$key3);
  $key3 = strtoupper($key3);
  $keylen = substr($key3, 0, 15);
  $key4 = strtolower($key3);//name klein
  $key5 = str_replace("$key4.swf","",$key);
  $key5 = $key5."spiel.php?id=".$key3;
  echo "<table align="center" border="1" width="80%" margin="0"><tr><td>";
  echo " $counter. <a href="$key5">".$keylen."..."."</a>(Ø-Punkte:  ".$value.")</td></tr></table>";
 }
?>



Txs
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:

Postby Stefan » 08. April 2005 14:32

Servus,

am besten wäre es natürlich, wenn jakimo sich nochmal so richtig in Zeug legen würde. Oder?
Hast Du schonmal daran gedacht, das der Mensch seine Zeit investiert hat, um Dir weiterzuhelfen und jetzt evtl. leichte Frustration verspüren könnte?
Immerhin, vielleicht hat er ja schon daran gedacht Deine geänderten bzw. völlig neuen Anforderungen auch umzusetzten, während Du natürlich schon von jemand anderem was bekommen hast. Frag doch den Kerl, ob er sein script nicht für Dich ein bisschen optimieren könnte. Nötig wäre es allemal.

Hey, ich will Dich nicht blöd anmachen, sondern Dir mitteilen, daß Deine Vorgehensweise einfach "schlecht" war. Denk darüber nach.

ciao, Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Sorry

Postby www.internet-umfrage.ch » 08. April 2005 16:07

Hallo Stef

Du hast natürlich absolut recht ! Sorry, ich bin einfach sehr ungeduldig und sah kein Ende und nur Probleme in der Version von Jakimo.
SORRY Jakimo !! :(
Ich bin sehr dankbar als Laie für die Hilfe die Leute wie Jakimo während Ihrer freien Zeit für uns opfern.

Jakimo, bitte gib mir hier Dein Banner durch, Du hast wirklich anspruch darauf! Sorry nochmals.

Noch eine kleine korrektur am Rande der Geschichte ...

Code: Select all
     if(!file_exists($votefile))
      {
 //       echo "Votefile $votefile existiert nicht.<br>";
        break;
      }


Hier musste ich noch das break durch next ersetzen, dann klappte es.

Also nichts für Ungut, dies ist ein tolles Forum mit spitze Leuten !!

CU
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:

Postby jakimo72 » 08. April 2005 17:12

Ich wusste nicht wie unerfahren Du bist,
aber mein Script sollte Dir nur helfen,
und Dir nicht alle Arbeit abnehmen!
Ich habe auch versucht zumindest die Struktur
deines Scriptes zu erhalten (daher noch die vorhandene Abfrage...)

Insbesondere habe ich Ausnahmeregeln
nicht implementiert
(Division durch Null, fehlende Votes-Datei,
Fehlende Votes, falsche Verzeichnisse usw. )

Ansonsten funktionierte mein Skript ja doch ganz
gut...
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

danke

Postby www.internet-umfrage.ch » 08. April 2005 18:46

Hi Jakimo,

Sorry nochmals, und vorallem riesen Dank!

Ja, Dein Script funktionniert wunderbar, ich habe am Anfang einfach nicht verstanden, dass ich noch Umbauen muss, vorallem bin ich wirklich ein Ass in Php ... ;-), und musste mir darum noch reichlich Hilfe dazu anfordern. ... Sorry, hätte ich auch hier machen können.

Das Dein Script gut ist, beweist es hier Siehe hier bei Top-10 (oder auch in den einzelnen Spielgattungen zu sehen als Top-10 für die einzelnen Gattungen)

Txs a lot again!

Mein Angebot für den Banner steht noch!

CU
User avatar
www.internet-umfrage.ch
 
Posts: 23
Joined: 08. November 2004 14:55
Location: Ein Besuch lohnt sich:


Return to PHP

Who is online

Users browsing this forum: No registered users and 10 guests