Komplexe Abfrage in kleiner Datenbank

glader

Gesperrt
Hallo Zusammen

Ich bin ja relativ neu im Geschäft und versuche mir grad selber PHP beizubringen.
Jetzt stehe ich allerdings vor einem großen Problem:

Es geht um ein Formular, wo mehrere Punkterichter Projekte bewerten können.

Im 1. Feld wählt der Richter seinen Namen aus
im 2. Feld denjenigen, den er bewerten will,
im 3. das Projekt das er bewerten will und im letzten Feld trägt er die Punkte ein.

Nach dem Eintrag möchte ich gerne, daß der Richter die aktuelle Top10 angezeigt bekommt und da geht es mit meinem Problem los.

Jeder User hat mehr als ein Projekt ( theoretisch kann er jeden tag ein neues anmelden).
Nicht jeder Richter bewertet jedes Projekt. man kann ja mal eins übersehen oder was auch immer.

Wie bekomme ich jetzt eine Abfrage hin, die mir für jedes einzelne Projekt die Durchschnittsbewertung errechnet und hinterher zu einem Gesamtergebnis summiert?

Da sich alle Daten in einer DB befinden habe ich es erstmal so probiert:

PHP:
$ausg= "SELECT user, projekt
FROM bewertung";

while (list($user,$projekt) = mysql_fetch_row($ausg))
{
    $user_a[$i]=$user;
    $projekt_a[$i]=$projekt;
    $i++;
}

// zählen der Bewertungen pro Projekt
for ( $x="0" ; $x<=$i ; $x++ )
{
    for ( $y="0" ; $y<=$i ; $y++ )
    {
        if ( $user_a[$x]==$user_a[$y] && $projekt_a[$x]==$projekt_a[$y] )
        {
            $counter[$x]++;
            $user_a[$y]=$x; // um Doppelzählungen auszuschließen
        }
    }
}

$end_ausg= "SELECT user, SUM (punkte) AS punkte
FROM bewertung
GROUP BY user
ORDER BY punkte DESC";

while (list($user_b,$punkte) = mysql_fetch_row($end_ausg))
{
    $z++;
    for ( $x="0" ; $x<=$i ; $x++ )
   {
        if ( $user_b==$user_a[$x] )
        {
            $punkte=$punkte/$counter[$x];
        }
    }
    echo "Platz ($z) - $user_b hat $punkte.";
}


ich bekomme allerdings nur eine fehlermeldung für die beiden mysql_fetch_row zeilen zurück:

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result recource ....

ich kann allerdings keinen Fehler finden. Sieht vieleicht jemand von Euch woran es liegt?
Oder noch besser wäre es wenn es einen einfacheren Weg geben würde.

Danke schonmal vorher.
 
Eine Anfrage muss zuerst via [phpf]mysql_query[/phpf] an den MySQL-Server geschickt werden, bevor man Zeilen aus dem Ergebnis abfragen kann.

Wie genau sieht denn die Datenbankstruktur aus (Tabellen, Felder, Relationen…)? Ich hab so das Gefühl, dass es hier durchaus noch Optimierungsmöglichkeiten gibt :)
 
Danke für die schnelle Antwort.

Das war natürlich nur ein Auszug aber ich setz hier nochmal den kompletten Quelltext rein.

PHP:
<?php

// benötigte php Docs

require("config.php");
require("lang.php");


// Verbindungsdaten und Verbindungsstatus festlegen

$verbindung = @mysql_connect($host,$user,$pass);
if (!$verbindung)
{
	echo $CONNECTION_OFF;
	exit;
}
else
{
	echo $CONNECTION_ON;
}

$punkte_input=$_POST['qualie']+$_POST['index'];
// SQL-Abfrage für den Datenbankeintrag

$abfrage = "INSERT bewertung (moderator,user,datum,punkte) VALUES ('$_POST[mod]','$_POST[user]','$_POST[date]','$punkte_input')";


// Übergabe an die Datenbank

$erg = mysql_db_query($database,$abfrage,$verbindung);

$ausg = "SELECT user, datum
FROM bewertung";

while (list($namen,$projekt) = mysql_fetch_row($ausg))
{
    $user_a[$i]=$namen;
    $projekt_a[$i]=$projekt;
    $i++;
}

// zählen der Bewertungen pro Projekt
for ( $x="0" ; $x<=$i ; $x++ )
{
    for ( $y="0" ; $y<=$i ; $y++ )
    {
        if ( $user_a[$x]==$user_a[$y] && $projekt_a[$x]==$projekt_a[$y] )
        {
            $counter[$x]++;
            $user_a[$y]=$x; // um Doppelzählungen auszuschließen
        }
    }
}
$end_ausg= "SELECT user, SUM (punkte) AS punkte
FROM bewertung
GROUP BY user
ORDER BY punkte DESC";

while (list($user_b,$punkte) = mysql_fetch_row($end_ausg))
{
    $z++;
    for ( $x="0" ; $x<=$i ; $x++ )
   {
        if ( $user_b==$user_a[$x] )
        {
            $punkte=$punkte/$counter[$x];
        }
    }
    echo "Platz ($z) - $user_b hat $punkte.";
} 

?>

Und hier die Datenbank.

Code:
CREATE TABLE `bewertung` (
  `ID` mediumint(9) NOT NULL auto_increment,
  `moderator` varchar(50) collate latin1_general_ci NOT NULL,
  `user` varchar(50) collate latin1_general_ci NOT NULL,
  `datum` varchar(50) collate latin1_general_ci NOT NULL,
  `groesse` int(11) default NULL,
  `ubew` int(11) default NULL,
  `punkte` int(11) NOT NULL,
  PRIMARY KEY  (`ID`),
  KEY `moderator` (`moderator`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

Also keine große Struktur und alles in einer Tabelle gehalten. Für den Anfang wäre es ja schon schön überhaupt erstmal diese Fehlermeldung wegzukriegen.
 
Zuletzt bearbeitet:
Hallo!

Spontan würde ich sagen, Du muss dieses ändern:
PHP:
$punkte_input=$_POST['qualie']+$_POST['index']; 
// SQL-Abfrage für den Datenbankeintrag 
 
$abfrage = "INSERT INTO bewertung (moderator,user,datum,punkte) VALUES ('".$_POST['mod']."','".$_POST['user']."','".$_POST['date']."','".$punkte_input."')";
Gruss Dr Dau
 
Dr Dau hat gesagt.:
Hallo!

Spontan würde ich sagen, Du muss dieses ändern:
...

Danke für den Tipp aber das ist ja die Übergabe an die Datenbank die funktioniert ohne Probleme. Ich kriege eine Fehlermeldung für diese beiden Zeilen:

PHP:
while (list($namen,$projekt) = mysql_fetch_row($ausg))

und diese hier

PHP:
while (list($namen,$projekt) = mysql_fetch_row($ausg))
 
Wie Matthias schon gesagt hat.....
PHP:
$ausg = mysql_query("SELECT user, projekt 
FROM bewertung");
 
// und
$end_ausg= mysql_query("SELECT user, SUM (punkte) AS punkte 
FROM bewertung 
GROUP BY user 
ORDER BY punkte DESC");
Ich bin mir aber auch nicht sicher ob die Verbindung aus mysql_db_query() bestehen bleibt.
Wenn nicht, funktioniert der Rest natürlich nicht.

Und ausserdem:
mysql_db_query hat gesagt.:
Anmerkung: Diese Funktion ist seit PHP 4.0.6 veraltet. Verwenden Sie diese Funktion nicht. Stattdessen sollten Sie die Funktionen mysql_select_db() und mysql_query() verwenden.
Ich würde also mysql_db_query() gemäss php.net in mysql_query() anpassen und die Datenbankauswahl nach mysql_connect() mittels mysql_select_db() vornehmen.
 
Ok die Änderungen habe ich vorgenommen. Mit dem Ergebnis, daß ich zwar immer noch die gleichen Fehlermeldungen bekomme aber zusätzlich werden die übergebenen Daten nichtmehr in der Datenbank gespeichert. Dabei hatte zumindest das vorher funktioniert.

Ich habe das jetzt so umgebaut:

PHP:
<?php

// benötigte php Docs

require("config.php");
require("lang.php");


// Verbindungsdaten und Verbindungsstatus festlegen

$verbindung = @mysql_connect($host,$user,$pass);
if (!$verbindung)
{
    echo $CONNECTION_OFF;
    exit;
}
else
{
    echo $CONNECTION_ON;
}

$punkte_input=$_POST['qualie']+$_POST['index'];
// SQL-Abfrage für den Datenbankeintrag

$abfrage = "INSERT bewertung (moderator,user,datum,punkte) VALUES ('$_POST[mod]','$_POST[user]','$_POST[date]','$punkte_input')";


// Übergabe an die Datenbank

$erg = mysql_query($abfrage);
if (!$erg )
{
    echo $QUERY_OFF;
    exit;
}
else
{
    echo $QUERY_ON;
}

#########################################################################

$ausg = "SELECT user, projekt
FROM bewertung";

$erg2 = mysql_query( $ausg);

while (list($namen,$projekt) = mysql_fetch_row($erg2))
{
    $user_a[$i]=$namen;
    $projekt_a[$i]=$projekt;
    $i++;
}

// zählen der Bewertungen pro Projekt
for ( $x="0" ; $x<=$i ; $x++ )
{
    for ( $y="0" ; $y<=$i ; $y++ )
    {
        if ( $user_a[$x]==$user_a[$y] && $projekt_a[$x]==$projekt_a[$y] )
        {
            $counter[$x]++;
            $user_a[$y]=$x; // um Doppelzählungen auszuschließen
        }
    }
}

####################################################################

$end_ausg= "SELECT user, SUM (punkte) AS punkte
FROM bewertung
GROUP BY user
ORDER BY punkte DESC";

$end_erg = mysql_query( $end_ausg);

while (list($user_b,$punkte) = mysql_fetch_row($end_erg))
{
    $z++;
    for ( $x="0" ; $x<=$i ; $x++ )
   {
        if ( $user_b==$user_a[$x] )
        {
            $punkte=$punkte/$counter[$x];
        }
    }
    echo "Platz ($z) - $user_b hat $punkte.";
} 

?>

Und wenn ich mysql_connect() durch mysql_select_db() ersetze wird die Verbindung zur Datenbank nichtmehr hergestellt.
 
Versuche es mal was Dr Dau geschrieben hat.

PHP:
$verbindung = @mysql_connect($host,$user,$pass); 
if (!$verbindung) { 
    echo $CONNECTION_OFF; 
    exit; 
} 
else { 
    echo $CONNECTION_ON; 
} 

// Name der Datenbank
$db_name='foo';
$db_selected = mysql_select_db($db_name, $verbindung);
if (!$db_selected) {

    echo 'Fehler'; 
    
} 
else { 
    echo 'OK'; 
}

Ich denke das klappt dann auch
 
Zuletzt bearbeitet:
Ok also das funktioniert jetzt. Jetzt kommen die Daten auch wieder in der Datenbank an.

Jetzt bin ich wieder da wol ich ganz am Anfang war mit den beiden Fehlermeldungen

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource...

Wie werde ich die jetzt noch los?
 
Schaue mal nach ob du bei der Query alle spaltennamen der tabelle alle korrekt geschrieben hast.
Der Fehler kommt meistens bei einem schreibfehler.
 
Zurück