Bewertungsfunktion erweitern

Was könnte man an der Filmverwaltung verbessern? Fragen und Anregungen von Entwickler an Entwickler.

Moderator: Lifestyle

Shen
Beiträge: 20
Registriert: Mi 02. Dez 2009 14:43
Kontaktdaten:

Bewertungsfunktion erweitern

Beitrag von Shen » Mo 07. Dez 2009 20:53

Hallo,
ich würde gerne die Bewertungsfunktion um einige Felder erweitern.

Ich habe die Tabelle _FILME_USERS dupliziert und das Duplikat _FILME_USERS_01 genannt.

Ich wollte erst einmal klein anfangen und eine zweite Bewertungskategorie in die Filmübersicht einfügen, die die Daten aus _FILME_USERS_01 holt.
Leider bin ich aufgrund meiner eingeschränkten Programmierkenntnisse schon hier stecken geblieben.

Ich habe folgenden Codeabschnitt aus Menu280_FilmAnzeigen.php kopiert:

Code: Alles auswählen

        $sql2 = "SELECT AVG(Bewertung) AS Bewertung FROM $myDB->FILME fi " .
                "INNER JOIN $myDB->FILME_USERS fu ON fu.FILME_FilmID=FilmID " .
                "WHERE Bewertung!=0 AND FilmID=$myVar->FilmID";
        $rs2 = $myDB->go($sql2);
        $row2 = $myDB->getRow($rs2);
        if ( $row2['Bewertung'] != '' )
        {
            echo '<dt class="description_Filmanzeigen">Bewertung:</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['Bewertung'], 2 ) . ' von 10 Punkte</dd>';
        }
...darunter eingefügt und wie folgt angepasst:

Code: Alles auswählen

        $sql2 = "SELECT AVG(Bewertung) AS Bewertung FROM $myDB->FILME fi " .
                "INNER JOIN $myDB->FILME_USERS_01 fu ON fu.FILME_FilmID=FilmID " .
                "WHERE Bewertung!=0 AND FilmID=$myVar->FilmID";
        $rs2 = $myDB->go($sql2);
        $row2 = $myDB->getRow($rs2);
        if ( $row2['Bewertung'] != '' )
        {
            echo '<dt class="description_Filmanzeigen">Bewertung:  Informationsgehalt</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['Bewertung'], 2 ) . ' von 10 Punkte</dd>';
        }
Leider erhalte ich dann folgende Fehlermeldung:
SELECT AVG(Bewertung) AS Bewertung FROM verw_FILME fi INNER JOIN fu ON fu.FILME_FilmID=FilmID WHERE Bewertung!=0 AND FilmID=2

Table 'film.fu' doesn't exist

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ../film/classes/class.db.php on line 138
Kann mich jemand auf den richtigen Weg leiten? Anscheinend wird so die neu angelegte Tabelle nicht erkannt.

Shen
Beiträge: 20
Registriert: Mi 02. Dez 2009 14:43
Kontaktdaten:

Re: Bewertungsfunktion erweitern

Beitrag von Shen » Mi 09. Dez 2009 15:41

Okay, das war der falsche Ansatz. Ich habe zu kompliziert gedacht.

Ich habe nun die Tabelle _FILME_USERS um vier Spalten (BewertungA, BewertungB, BewertungC, BewertungD) am Ende erweitert (Einstellungen wie Bewertung) und die PHP-Datei entsprechend angepasst. Das funktioniert.

Dann mal schauen, wie ich mehrere Bewertungen gleichzeitig eintragen kann :wink:
Zuletzt geändert von Shen am Mi 09. Dez 2009 21:27, insgesamt 2-mal geändert.

Shen
Beiträge: 20
Registriert: Mi 02. Dez 2009 14:43
Kontaktdaten:

Re: Bewertungsfunktion erweitern

Beitrag von Shen » Mi 09. Dez 2009 17:56

Soo, die restlichen Anpassungen konnte ich sehr einfach in der index2.php vornehmen und jetzt habe ich 5 Bewertungskategorien :D

Shen
Beiträge: 20
Registriert: Mi 02. Dez 2009 14:43
Kontaktdaten:

Re: Bewertungsfunktion erweitern

Beitrag von Shen » Mi 09. Dez 2009 18:20

Und damit nicht nur ich davon profitiere hier ein kleines HowTo

Ziel: Fünf Bewertungskategorien anstatt der bisherigen einen.
Ich verwende die Filmverwaltung Stand: 2007-10-30 und das AllInOneDesign 2.05 Addon.

Datenbankanpassung:
Die Tabelle _FILME_USERS muss um um vier weitere Spalten am Ende der Tabelle erweitert werden:
BewertungA, BewertungB, BewertungC, BewertungD
Die Einstellungen entsprechen denen der vorhandenen Spalte 'Bewertung' (Typ: int(2), Attribute: UNSIGNED, Null? Nein, Standard: Benuzerdefiniert: 0)

Anpassung der Datei /includes/Menu280_FilmAnzeigen.php
In dieser Datei wird die Filmansicht bearbeitet. Hier müssen die zusätzlichen Anzeigefelder für die Bewertung eingebunden werden.

Der folgende Codeabschnitt:

Code: Alles auswählen

        $sql2 = "SELECT AVG(Bewertung) AS Bewertung FROM $myDB->FILME fi " .
                "INNER JOIN $myDB->FILME_USERS fu ON fu.FILME_FilmID=FilmID " .
                "WHERE Bewertung!=0 AND FilmID=$myVar->FilmID";
        $rs2 = $myDB->go($sql2);
        $row2 = $myDB->getRow($rs2);
        if ( $row2['Bewertung'] != '' )
        {
            echo '<dt class="description_Filmanzeigen">Bewertung: Gesamt</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['Bewertung'], 2 ) . ' von 10 Punkte</dd>';
        }

wird bei insgesamt fünf Bewertungsanzeigen ersetzt durch:

Code: Alles auswählen


        $sql2 = "SELECT
                       AVG(Bewertung) AS Bewertung,
                       AVG(BewertungA) AS BewertungA,
                       AVG(BewertungB) AS BewertungB,
                       AVG(BewertungC) AS BewertungC,
                       AVG(BewertungD) AS BewertungD
                       FROM $myDB->FILME fi " .
                "INNER JOIN $myDB->FILME_USERS fu ON fu.FILME_FilmID=FilmID " .
                "WHERE Bewertung!=0 AND FilmID=$myVar->FilmID";
        $rs2 = $myDB->go($sql2);
        $row2 = $myDB->getRow($rs2);
        if ( $row2['Bewertung'] != '' )
        {
            echo '<br /><dt class="description_Filmanzeigen">Bewertung:&nbsp;&nbsp;&nbsp;&nbsp;</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">&nbsp;</dd>';
            echo '<dt class="description_Filmanzeigen">Gesamtwertung</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['Bewertung'], 2 ) . ' von 10 Punkte</dd>';
            echo '<dt class="description_Filmanzeigen">Informationsgehalt</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['BewertungA'], 2 ) . ' von 10 Punkte</dd>';
            echo '<dt class="description_Filmanzeigen">Wissenschaftlichkeit</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['BewertungB'], 2 ) . ' von 10 Punkte</dd>';
            echo '<dt class="description_Filmanzeigen">Anspruch / Verst&auml;ndnis</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['BewertungC'], 2 ) . ' von 10 Punkte</dd>';
            echo '<dt class="description_Filmanzeigen">Unterhaltungswert</dt>';
            echo '<dd class="description_Filmanzeigen_rechts">' . round( $row2['BewertungD'], 2 ) . ' von 10 Punkte</dd><br />';
        }
Die von mir gewählten Bewertungskategorien sind natürlich austauschbar.

Anpassung der Datei /index2.php
In dieser Datei müssen drei Codeabschnitte ersetzt werden

Abschnitt 1
Der folgende Codeabschnitt:

Code: Alles auswählen

  if ( $myVar->MenuID == 291 && isset($_POST['FilmGesehen']) )
  {
      // nachfragen, ob eintrag schon existiert
      $sql = "SELECT COUNT(*) AS Anz FROM $myDB->FILME_USERS WHERE FILME_FilmID = $myVar->FilmID AND USERS_UserID = {$_SESSION['UserID']}";
      $rs = $myDB->go($sql);
      $row = $myDB->getRow($rs);
      
      if ( array_key_exists( 'Bewertung', $_REQUEST ) )
          $Bewertung = (int) $_REQUEST['Bewertung'];
      else
          $Bewertung = 0;
      $comment = $myDB->escape_string( htmlentities( $_POST['Kommentar'] ) );

      if ( $row['Anz'] == 0 )
      {
          $sql = "INSERT INTO $myDB->FILME_USERS ( USERS_UserID, FILME_FilmID, Kommentar, istNeu, zeigeNamen, Zeitpunkt, Bewertung ) VALUES ( {$_SESSION['UserID']}, $myVar->FilmID, $comment, 1, {$_POST['zeigeNamen']}, NOW(), $Bewertung )";
          $myVar->erfolg[] = "Bewertung war erfolgreich.";
      }
      else
      {
          $sql = "UPDATE $myDB->FILME_USERS SET Kommentar=$comment, istNeu=1, zeigeNamen={$_POST['zeigeNamen']}, Bewertung=$Bewertung WHERE FILME_FilmID=$myVar->FilmID AND USERS_UserID={$_SESSION['UserID']}";
          $myVar->erfolg[] = "&Auml;nderung war erfolgreich.";
      }
muss durch folgenden ersetzt werden:

Code: Alles auswählen

  if ( $myVar->MenuID == 291 && isset($_POST['FilmGesehen']) )
  {
      // nachfragen, ob eintrag schon existiert
      $sql = "SELECT COUNT(*) AS Anz FROM $myDB->FILME_USERS WHERE FILME_FilmID = $myVar->FilmID AND USERS_UserID = {$_SESSION['UserID']}";
      $rs = $myDB->go($sql);
      $row = $myDB->getRow($rs);
      
      if ( array_key_exists( 'Bewertung', $_REQUEST ) )
          $Bewertung = (int) $_REQUEST['Bewertung'];
      else
          $Bewertung = 0;
      if ( array_key_exists( 'BewertungA', $_REQUEST ) )
          $BewertungA = (int) $_REQUEST['BewertungA'];
      else
          $BewertungA = 0;
      if ( array_key_exists( 'BewertungB', $_REQUEST ) )
          $BewertungB = (int) $_REQUEST['BewertungB'];
      else
          $BewertungB = 0;
      if ( array_key_exists( 'BewertungC', $_REQUEST ) )
          $BewertungC = (int) $_REQUEST['BewertungC'];
      else
          $BewertungC = 0;
      if ( array_key_exists( 'BewertungD', $_REQUEST ) )
          $BewertungD = (int) $_REQUEST['BewertungD'];
      else
          $BewertungD = 0;


      $comment = $myDB->escape_string( htmlentities( $_POST['Kommentar'] ) );

      if ( $row['Anz'] == 0 )
      {
          $sql = "INSERT INTO $myDB->FILME_USERS ( USERS_UserID, FILME_FilmID, Kommentar, istNeu, zeigeNamen, Zeitpunkt, Bewertung, BewertungA, BewertungB, BewertungC, BewertungD ) VALUES ( {$_SESSION['UserID']}, $myVar->FilmID, $comment, 1, {$_POST['zeigeNamen']}, NOW(), $Bewertung, $BewertungA, $BewertungB, $BewertungC, $BewertungD )";
          $myVar->erfolg[] = "Bewertung war erfolgreich.";
      }
      else
      {
          $sql = "UPDATE $myDB->FILME_USERS SET Kommentar=$comment, istNeu=1, zeigeNamen={$_POST['zeigeNamen']}, Bewertung=$Bewertung, BewertungA=$BewertungA, BewertungB=$BewertungB, BewertungC=$BewertungC, BewertungD=$BewertungD WHERE FILME_FilmID=$myVar->FilmID AND USERS_UserID={$_SESSION['UserID']}";
          $myVar->erfolg[] = "&Auml;nderung war erfolgreich.";
      }
Abschnitt 2
Der folgende Code-Abschnitt:

Code: Alles auswählen

$sql2 = "SELECT Bewertung Kommentar, zeigeNamen FROM $myDB->FILME fi INNER JOIN $myDB->FILME_USERS fu ON FILME_FilmID=FilmID WHERE fi.FilmID=$myVar->FilmID AND fu.USERS_UserID={$_SESSION['UserID']}";
muss durch diesen ersetzt werden:

Code: Alles auswählen

      $sql2 = "SELECT Bewertung, BewertungA, BewertungB, BewertungC, BewertungD, Kommentar, zeigeNamen FROM $myDB->FILME fi INNER JOIN $myDB->FILME_USERS fu ON FILME_FilmID=FilmID WHERE fi.FilmID=$myVar->FilmID AND fu.USERS_UserID={$_SESSION['UserID']}";
Abschnitt 3

Der folgende Code-Abschnitt

Code: Alles auswählen

      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "optionale Bewertung: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"Bewertung\" value=\"$i\" ";
          if ( $row2['Bewertung'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo $myVar->getRequest("",TRUE);
      echo "</td>";
      echo "</tr>";
Muss durch diesen ersetzt werden:

Code: Alles auswählen

      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "Gesamtwertung: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"Bewertung\" value=\"$i\" ";
          if ( $row2['Bewertung'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "Informationsgehalt: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"BewertungA\" value=\"$i\" ";
          if ( $row2['BewertungA'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "Wissenschaftlichkeit: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"BewertungB\" value=\"$i\" ";
          if ( $row2['BewertungB'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "Anspruch / Verst&auml;ndnis: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"BewertungC\" value=\"$i\" ";
          if ( $row2['BewertungC'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"vertical-align:top;\">";
      echo "Unterhaltungswert: (1 = miserabel bis 10 = sehr gut)";
      echo "</td>";
      echo "</tr>";
      echo "<tr>";
      echo "<td colspan=\"2\" style=\"padding:0px 0px 20px 0px; vertical-align:top;\">";
      for ( $i=1; $i<=10; ++$i )
      {
          echo "<input class=\"checkbox\" style=\"margin-left: 0.5em\" type=\"radio\" name=\"BewertungD\" value=\"$i\" ";
          if ( $row2['BewertungD'] == $i )
              echo "checked=\"checked\" ";
          echo "/> <span style=\"font-size: 0.82em; font-family: Tahoma;\">$i</span>";
      }
      echo "</td>";
      echo "</tr>";
      echo $myVar->getRequest("",TRUE);
Nun habt ihr fünf Bewertungskategorien, die ihr je nach Belieben betiteln könnt. Natürlich könnt ihr auch die Anzahl der Bewertungskategorien anpassen. Dann müsstet ihr jedoch auch die entsprechenden Code-Abschnitte entsprechend ändern.

Benutzeravatar
Lifestyle
Beiträge: 406
Registriert: Mo 17. Sep 2007 19:24
Wohnort: Helpsen
Kontaktdaten:

Re: Bewertungsfunktion erweitern

Beitrag von Lifestyle » Sa 12. Dez 2009 13:42

hi,

schön, dass sich wieder mal wer an dem Projekt beteiligt,...

hast du auch daran gedacht, dass du noch einen Durchschnittswert berechnen musst um die Sortierung der Filme nach Bewertung nicht zu verfälschen ??

Bedeutet Gesmatbewertung sollte errechnet und werden und nicht auswählbar sein, sonst ganz nett
MFG
L!f3

Bugs melden unter: http://bugs.lifeshammer.de (Auch Wünsche)
Anmeldung zum Bugtracker: http://bugs.lifeshammer.de/signup_page.php

Shen
Beiträge: 20
Registriert: Mi 02. Dez 2009 14:43
Kontaktdaten:

Re: Bewertungsfunktion erweitern

Beitrag von Shen » Sa 12. Dez 2009 16:23

Lifestyle hat geschrieben:hi,
Bedeutet Gesmatbewertung sollte errechnet und werden und nicht auswählbar sein, sonst ganz nett
Das wäre sicherlich auch eine Möglichkeit. Aber für meine Zwecke nicht von Bedeutung, da der Durchschnitt der Einzelbewertungen nicht unbedingt mit der Gesamtbewertung zusammen hängen.
Auch ein Film ohne z.B. Unterhaltungswert kann 10 von 10 Gesamtpunkte haben, wenn es zum Beispiel eine inhaltlich sehr gute Doku ist, bei der es auf den Inhalt und nicht die Unterhaltung ankommt.

Falls Interesse an einem zweiten HowTo mit automatischem Gesamtwert besteht, kann ich das bei Bedarf noch erstellen.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast