Remember
Hallöchen (:
Ich hab mal wieder eine mittelschwere Krise wegen PHP und ich würde mich riesig freuen, wenn mir da mal kurz jemand einen kleinen Tipp geben könnte
Ich möchte die Lebendgewinnsumme automatisch ändern lassen (mithilfe von addieren) und ich möchte in einer anderen Tabelle das Ergebnis ändern lassen. Das Formular sieht folgendermaßen aus:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
|
<?php
include("checkuser.php");
?>
<html>
<head>
<title>Gut Brynne</title>
<link rel="stylesheet" href="http://brynne.bplaced.net/style.css">
</head>
<h2>Ergebnis eintragen</h2>
<form method="POST" action="ergebniseintragen_send.php">
<table class="border" width="100%">
<tr>
<td width="50%">Turnier-ID</td>
<td width="50%"><select name="id" size="1" maxlength="255">
<?php
$id = $_GET["id"];
// Verbindung zur Datenbank
include("datenbank.php");
// Hier die Abfrage übersetzt: RUFE * (alle Spalten) VON der Tabelle Pferd auf WO in der Spalte Besitzer nichts steht.
$Ergebnis = mysql_query("SELECT * FROM ergebnis WHERE id = '$id'");
// Wenn das Ergebnis 0 ist gib aus
if (@mysql_num_rows($Ergebnis) == 0) {
echo "Es gibt momentan keine turnierreiterlosen Pferde.";
}
else {
// Sonst zeige an ..
while($Data = mysql_fetch_array($Ergebnis)) {
// Der Name wird ausgegeben .. die HTML Elemente sind frei anpassbar- Vor " muss aber immer ein \.
// Der Steckbriefname lautet Pferd. Diesem wird jetzt die ID des Pferdes angehängt, damit die Datei nachher weiß, welche Daten sie abfragen muss.
// Ihr könnt die ganzen anderen Infos auch angeben .. sprich $Data[Jahrgang] oder $Data[Geschlecht]
echo "<option>$Data[id]</option>";
}
}
?>
</select></td></tr>
<tr>
<td width="50%">Pferd</td>
<td width="50%"><select name="pferd" size="1" maxlength="255">
<?php
$id = $_GET["id"];
// Verbindung zur Datenbank
include("datenbank.php");
// Hier die Abfrage übersetzt: RUFE * (alle Spalten) VON der Tabelle Pferd auf WO in der Spalte Besitzer nichts steht.
$Ergebnis = mysql_query("SELECT * FROM ergebnis WHERE id = '$id'");
// Wenn das Ergebnis 0 ist gib aus
if (@mysql_num_rows($Ergebnis) == 0) {
echo "Es gibt momentan keine turnierreiterlosen Pferde.";
}
else {
// Sonst zeige an ..
while($Data = mysql_fetch_array($Ergebnis)) {
// Der Name wird ausgegeben .. die HTML Elemente sind frei anpassbar- Vor " muss aber immer ein \.
// Der Steckbriefname lautet Pferd. Diesem wird jetzt die ID des Pferdes angehängt, damit die Datei nachher weiß, welche Daten sie abfragen muss.
// Ihr könnt die ganzen anderen Infos auch angeben .. sprich $Data[Jahrgang] oder $Data[Geschlecht]
echo "<option>$Data[pferd]</option>";
}
}
?>
</select></td></tr>
<tr>
<td width="50%">Ergebnis (nur Zahl angeben!)</td>
<td width="50%"><input type="int" name="ergebnis" size="26" maxlength="5"></td>
</tr>
<tr>
<td width="50%">Geldpreis (nur Zahl angeben!)</td>
<td width="50%"><input type="int" name="preis" size="26" maxlength="5"></td>
</tr>
</table>
<p> </p>
<div align=center><p><input type="submit" value="Abschicken" name="B1"><input type="reset" value="Zurücksetzen" name="B2"></p></div>
</form>
</html> |
|
und die ergebnissenden.php
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
|
<?php
include('checkuser.php')
?>
<html>
<head>
<title>Gut Brynne</title>
<link rel="stylesheet" href="http://brynne.bplaced.net/style.css">
</head>
<?php
//Datenbankverbindung einfügen!
include('datenbank.php');
//Variablen festlegen
$id = $_POST['id'];
$ergebnis = $_POST["ergebnis"];
$preis = $_POST["preis"];
$pferd = $_POST["pferd"];
//wenn eine der Variablen name, pass oder mail leer ist, dann [if]
if( ($ergebnis=='') ) {
//Ausgabe der Fehlermeldung
echo "<b>Error</b>
Bitte gebe eine Platzierung ein!<br><br>
<a href="javascript:%20history.back(-2)" target="_self">Zurück</a>";
//wenn alles richtig ist:
} else {
$abfrage = "SELECT lebendgewinnsumme FROM pferd WHERE name = '$pferd'";
$ergebnis = mysql_query($abfrage);
$Data = mysql_fetch_array($ergebnis);
$geld = $Data[lebendgewinnsumme];
$summe = $geld + $preis;
$aendern = "(UPDATE `pferd` SET lebendgewinnsumme = '$summe' WHERE name = '$pferd') AND (UPDATE `ergebnis` SET ergebnis = '$ergebnis', preis = '$preis' WHERE id = '$id')";
$update = mysql_query($aendern);
if($update==true) {
echo "<h2>Eintrag erfolgreich</h2>
Das Ergebnis wurde eingetragen.";
} else {
echo "Fehler!";
include('ergebniseintragen.php');
}
}
//PHP schließen
?>
</html> |
|
Nur leider zeigt er mir jetzt jedes mal einen Fehler an, also werd ich wohl irgendwo wieder schmarrn gebaut haben, aber ich finds irgendwie nich. :/
Es wäre wirklich sehr nett & ich würde mich auch total freuen, wenn bitte mal kurz jemand drüberschauen würde und mir dann meine Nase auf den Fehler drücken würde. ;D
LG, Josi
kext
Es wäre schön, wenn du zumindest mal die Fehlermeldung hier posten würdest. Fehler bzw. schlampigen Code sehe ich an mehreren Stellen. Auch ein Link wäre extrem hilfreich, da man sich das doch nur eingeschränkt vorstellen kann.
Remember
Das ist ja die Crux an der Sache. Es gibt keine Fehlermeldung. Er zeigt mir nur "Fehler!" an, weil ich das im Formular ja so angegeben habe, wenn der Eintrag nicht gefunzt hat.
Die Seite ist
http://brynne.bplaced.net/ und da hab ich mal zu Anschauungszwecken einen Testaccount gemacht mit gleich einer unrealen Nennung (nicht existierendes Pferd und bla). Name des Accs. test - PW: test.
kext
Füg mal nach der Zeile »echo "Fehler!";« folgendes ein:
php: |
1:
|
echo mysql_errno().": ".mysql_error(); |
|
Das sollte dir eine wesentlich detailliertere Fehlermeldung liefern und an welcher Stelle der Fehler liegt.
Um andere Fehlerquellen auszuschließen könntest du auch den Code von unsauberen Stellen etwas bereinigen.
Es heißt z.B. »$Data[
"lebendgewinnsumme
"]« und nicht »$Data[lebendgewinnsumme]«.
Außerdem gehören in SQL-Statements alle Tabellen- und Feldnamen in Backticks, also:
code: |
1:
2:
|
(UPDATE `pferd` SET `lebendgewinnsumme` = '$summe' WHERE `name` = '$pferd')
AND (UPDATE `ergebnis` SET `ergebnis` = '$ergebnis', `preis` = '$preis' WHERE id = '$id') |
|
Außerdem werden Variablen nicht direkt in Strings geschrieben, sondern mit den Strings per Punkt verbunden, also:
php: |
1:
2:
|
$aendern = "(UPDATE `pferd` SET `lebendgewinnsumme` = '".$summe."' WHERE `name` = '".$pferd."')
AND (UPDATE `ergebnis` SET `ergebnis` = '".$ergebnis."', `preis` = '".$preis."' WHERE id = '".$id."')"; |
|
Außerdem werden Variablen, die aus Benutzereingaben stammen (GET und POST) grundsätzlich maskiert, um
SQL-Injections zu verhindern, also:
php: |
1:
2:
3:
4:
|
$aendern = "(UPDATE `pferd` SET `lebendgewinnsumme` = '".mysql_real_escape_string($summe)."'
WHERE `name` = '".mysql_real_escape_string($pferd)."')
AND (UPDATE `ergebnis` SET `ergebnis` = '".mysql_real_escape_string($ergebnis)."', `preis` = '".mysql_real_escape_string($preis)."'
WHERE id = '".mysql_real_escape_string($id)."')"; |
|
Dementsprechend auch die anderen Stellen im Code.
Remember
Dankeschön für deine liebe Auseinanderfieselung (:
Der Code sieht jetzt folgendermaßen aus:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
|
<?php
include('checkuser.php')
?>
<html>
<head>
<title>Gut Brynne</title>
<link rel="stylesheet" href="http://brynne.bplaced.net/style.css">
</head>
<?php
//Datenbankverbindung einfügen!
include('datenbank.php');
//Variablen festlegen
$id = $_POST["id"];
$ergebnis = $_POST["ergebnis"];
$preis = $_POST["preis"];
$pferd = $_POST["pferd"];
//wenn eine der Variablen name, pass oder mail leer ist, dann [if]
if( ($ergebnis=='') ) {
//Ausgabe der Fehlermeldung
echo "<b>Error</b>
Bitte gebe eine Platzierung ein!<br><br>
<a href="javascript:%20history.back(-2)" target="_self">Zurück</a>";
echo mysql_error().": ".mysql_error();
//wenn alles richtig ist:
} else {
$abfrage = "SELECT lebendgewinnsumme FROM pferd WHERE name = '$pferd'";
$ergebnis = mysql_query($abfrage);
$Data = mysql_fetch_array($ergebnis);
$geld = $Data["lebendgewinnsumme"];
$summe = $geld + $preis;
$aendern = "(UPDATE `pferd` SET `lebendgewinnsumme` = '".mysql_real_escape_string($summe)."' WHERE `name` = '".mysql_real_escape_string($pferd)."') AND (UPDATE `ergebnis` SET `ergebnis` = '".mysql_real_escape_string($ergebnis)."', `preis` = '".mysql_real_escape_string($preis)."' WHERE `id` = '".mysql_real_escape_string($id)."')";
$update = mysql_query($aendern);
if($update==true) {
echo "<h2>Eintrag erfolgreich</h2>
Das Ergebnis wurde eingetragen.";
} else {
echo "Fehler!";
include('ergebniseintragen.php');
echo mysql_error().": ".mysql_error();
}
}
//PHP schließen
?>
</html> |
|
und ich kriege diese Fehlermeldung:
Warning: mysql_real_escape_string() expects parameter 1 to be string, resource given in /users/brynne/www/texte/reiter/ergebniseintragen_send.php on line 39
Das wäre dann diese Zeile:
php: |
1:
|
$aendern = "(UPDATE `pferd` SET `lebendgewinnsumme` = '".mysql_real_escape_string($summe)."' WHERE `name` = '".mysql_real_escape_string($pferd)."') AND (UPDATE `ergebnis` SET `ergebnis` = '".mysql_real_escape_string($ergebnis)."', `preis` = '".mysql_real_escape_string($preis)."' WHERE `id` = '".mysql_real_escape_string($id)."')"; |
|
Und vielleicht bin ich echt blöd oder ich bin heut einfach zu vernebelt und fertig, aber ich find da einfach nix :/
kext
Der Fehler tritt scheinbar schon früher auf, denn $summe ist ja augenscheinlich kein String, was es sein sollte, sondern ein wie auch immer geartetes Objekt (mit var_dump() könnte man da mehr herausfinden).
Das liegt möglicherweise daran, dass schon die vorherige Abfrage scheitert.
Du kannst es ja zum Testen einfach mal so machen (ab Zeile 32):
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
$abfrage = "SELECT `lebendgewinnsumme` FROM `pferd` WHERE `name` = '".mysql_real_escape_string($pferd)."'";
$ergebnis = mysql_query($abfrage);
$Data = mysql_fetch_array($ergebnis);
$geld = $Data["lebendgewinnsumme"];
$summe = $geld + $preis;
echo "<pre>";
var_dump($Data);
var_dump($geld);
var_dump($summe);
echo "</pre>"; |
|
Remember
Uff, damit kann ich jetzt gar nix mehr anfangen. Rausgekommen ist das hier
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
array(2) {
[0]=>
string(1) "0"
["lebendgewinnsumme"]=>
string(1) "0"
}
string(1) "0"
int(500)
|
|
Das heißt jetzt was? xD
Leila
zeigt dir, welcher Variablentyp es jeweils ist, wie lang es ist und was drinsteht
Remember
Okay. Und was kann ich dann damit bewirken oder so?
Ich hatte nämlich mittlerweile aufgegeben, möchte es aber jetzt wieder probieren.
Der Code seiht mittlerweile so aus:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
|
<?php
include('checkuser.php')
?>
<html>
<head>
<title>Gut Brynne</title>
<link rel="stylesheet" href="http://brynne.bplaced.net/style.css">
</head>
<?php
//Datenbankverbindung einfügen!
include('datenbank.php');
//Variablen festlegen
$id = $_POST["id"];
$ergebnis = $_POST["ergebnis"];
$preis = $_POST["preis"];
$pferd = $_POST["pferd"];
$reiter = $_POST["reiter"];
//wenn eine der Variablen name, pass oder mail leer ist, dann [if]
if( ($ergebnis=='') ) {
//Ausgabe der Fehlermeldung
echo "<b>Error</b>
Bitte gebe eine Platzierung ein!<br><br>
<a href="javascript:%20history.back(-2)" target="_self">Zurück</a>";
//wenn alles richtig ist:
} else {
$abfrage = "SELECT lebendgewinnsumme FROM pferd WHERE name='$pferd'";
$ergebnis = mysql_query($abfrage);
$Data = mysql_fetch_array($ergebnis);
$geld = $Data[lebendgewinnsumme];
$summe = $geld + $preis;
echo "<pre>";
var_dump($Data);
var_dump($geld);
var_dump($summe);
echo "</pre>";
$abfrage2 = "SELECT konto FROM mitglieder WHERE name='$reiter'";
$ergebnis2 = mysql_query($abfrage2);
$Data = mysql_fetch_array($ergebnis2);
$kontostand = $Data[konto];
$konto = $kontostand + $preis;
echo "<pre>";
var_dump($Data);
var_dump($kontostand);
var_dump($konto);
echo "</pre>";
$aendern = "(UPDATE `ergebnis` SET `ergebnis` = '".mysql_real_escape_string($ergebnis)."', `preis` = '".mysql_real_escape_string($preis)."' WHERE `id` = '".mysql_real_escape_string($id)."') AND (UPDATE `pferd` SET `lebendgewinnsumme` = '".mysql_real_escape_string($summe)."' WHERE `name` = '".mysql_real_escape_string($pferd)."') AND (UPDATE `mitglieder` SET `konto` = '".mysql_real_escape_string($konto)."' WHERE `name` = '".mysql_real_escape_string($reiter)."')";
$update = mysql_query($aendern);
if($update==true) {
echo "<h2>Eintrag erfolgreich</h2>
Das Ergebnis wurde eingetragen und die Gewinne wurden verrechnet.";
} else {
echo "Fehler!";
echo mysql_error().": ".mysql_error();
include('ergebniseintragen.php');
}
}
//PHP schließen
?>
</html> |
|
Und die Fehlermeldung, die ich bekomme, wenn ich versuche ein Ergebnis einzutragen sieht folgendermaßen aus (inklusive diesem vardump gedöns)
Zitat: |
array(2) {
[0]=>
string(1) "0"
["lebendgewinnsumme"]=>
string(1) "0"
}
string(1) "0"
int(400)
array(2) {
[0]=>
string(1) "0"
["konto"]=>
string(1) "0"
}
string(1) "0"
int(400)
Warning: mysql_real_escape_string() expects parameter 1 to be string, resource given in /users/brynne/www/texte/reiter/ergebniseintragen_send.php on line 59
Fehler!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 'UPDATE `ergebnis` SET `ergebnis` = '', `preis` = '400' WHERE `id` = '401') AND (' at line 1: 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 'UPDATE `ergebnis` SET `ergebnis` = '', `preis` = '400' WHERE `id` = '401') AND (' at line 1 |
Würde mich freuen, wenn es schlussendlich klappen würde (:
kext
Du kannst nicht einfach mehrere UPDATE-Befehle mit AND verbinden. Das geht mit einem Semikolon.
php: |
1:
2:
3:
4:
5:
6:
7:
|
$aendern = "UPDATE `ergebnis` SET `ergebnis` = '".mysql_real_escape_string($ergebnis)."',
`preis` = '".mysql_real_escape_string($preis)."'
WHERE `id` = '".mysql_real_escape_string($id)."';
UPDATE `pferd` SET `lebendgewinnsumme` = '".mysql_real_escape_string($summe)."'
WHERE `name` = '".mysql_real_escape_string($pferd)."';
UPDATE `mitglieder` SET `konto` = '".mysql_real_escape_string($konto)."'
WHERE `name` = '".mysql_real_escape_string($reiter)."')"; |
|
Probier mal diesen Code aus. Da hier auch jedes
mysql_real_escape_string in seiner eigenen Zeile steht, können wir auch herausfinden, welches Probleme macht.
Oli
Hi,
das Trennen per Semikolon geht AFAIK aus Sicherheitsgründen (bei PHP) nicht. Man muss/sollte für jeden Query mysql_query neu benutzen.
LG
kext
Zitat: |
Original von Oli
Hi,
das Trennen per Semikolon geht AFAIK aus Sicherheitsgründen (bei PHP) nicht. Man muss/sollte für jeden Query mysql_query neu benutzen.
LG |
Du hast recht, mittels mysql_query geht es in der Tat nicht. Dadurch werden atomare Queries wie hier natürlich deutlich erschwert. Schließlich soll im Falle eines Fehlers keine einzige der drei Queries ausgeführt werden, um Dateninkonsistenz zu verhindern. Eine andere Lösung, als die drei Queries einfach ins Blaue zu schießen, habe ich leider gerade auch nicht zur Hand.
Man könnte natürlich die Datenbank einfach umstrukturieren und die Lebendgewinnsumme zur Laufzeit aus allen Ergebnissen mittels Aggregatfunktionen berechnen. Redundanz in Datenbanken ist ja ohnehin böse.
Remember
Also, ich habs jetzt einfach mal mit deiner Version gemacht, kext, und da kommt dann diese Fehlermeldung raus:
Zitat: |
array(2) {
[0]=>
string(1) "0"
["lebendgewinnsumme"]=>
string(1) "0"
}
string(1) "0"
int(245)
array(2) {
[0]=>
string(1) "0"
["konto"]=>
string(1) "0"
}
string(1) "0"
int(245)
Warning: mysql_real_escape_string() expects parameter 1 to be string, resource given in /users/brynne/www/texte/reiter/ergebniseintragen_send.php on line 59
Fehler!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 'UPDATE `pferd` SET `lebendgewinnsumme` = '245' WHERE `name` = 'Cherokee\\\'s Ca' at line 4: 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 'UPDATE `pferd` SET `lebendgewinnsumme` = '245' WHERE `name` = 'Cherokee\\\'s Ca' at line 4 |
Hmm, denkt ihr, dass es einfacher wäre, wenn ich die Lebendgewinnsumme so ausgeben lassen würde, dass es nicht bei der Tabelle "Pferd" steht, sondern alle Ergebnisse, wo das Pferd halt den ausgegebenen Namen hat, zusammengezählt werden? Aber das is auch kompliziert, oder?
Mit der Sicherheit ... mei, ich denke, dass keiner absolut großes Interesse daran haben wird einen kleinen dummen VRH zu hacken. Ist ja nicht wirklich interessant

Deshalb wärs auch nicht allzu schlimm, wenn die Sicherheit nicht 100%ig garantiert wäre. Denke ich. Ich möcht es einfach nur schaffen, dass die Lebendgewinnsumme, Ergebnis, Platz und das Benutzerkonto gleichzeitig aktualisiert werden. Aber sie sträuben sich ja leider noch xD
Oli
Zitat: |
Original von kext
Dadurch werden atomare Queries wie hier natürlich deutlich erschwert. Schließlich soll im Falle eines Fehlers keine einzige der drei Queries ausgeführt werden, um Dateninkonsistenz zu verhindern. Eine andere Lösung, als die drei Queries einfach ins Blaue zu schießen, habe ich leider gerade auch nicht zur Hand. |
Erschwert, aber nicht unmöglich gemacht. Man kann eine Transaktion durchführen, ähnlich hier (ungetestet):
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
$fehler=0; //Variable zur Fehlerüberprüfung
mysql_query("BEGIN"); //Transaktion starten
mysql_query("UPDATE ...") or $fehler++; //bei Fehler wird $fehler um 1 erhöht ...
mysql_query("UPDATE ...") or $fehler++;
mysql_query("UPDATE ...") or $fehler++;
if($fehler > 0){ //im Falle eines Fehlers ($fehler beinhaltet eine Zahl größer 0)
mysql_query("ROLLBACK"); //Änderungen verwerfen
} else { // ansonsten..
mysql_query("COMMIT"); //Änderungen bestätigen
} |
|
EDIT: Ich vergaß zu erwähnen, dass man hierfür das InnoDB-Format verwenden muss.
@Remember
Du versuchst $ergebnis in die Datenbank zu schreiben, dieses ist jedoch ein MySQL-Rückgabewert:
php: |
1:
|
$ergebnis = mysql_query($abfrage); |
|
Was genau versuchst du, in die Tabellenspalte "ergebnis" zu schreiben?
LG
Remember
Was ist denn das InnoDB-Format, wenn ich mal so schlau fragen darf?
Aah. Na klar! Ich hab gar nicht darauf geachtet, dass ich ergebnis 2x hab

Ich möchte den erreichten platz eintragen lassen. Das müsste ja dann einfach funktionieren, wenn ich das ergebnis, das der platz ist, umnenne, oder?
kext
InnoDB ist ein Format, in dem MySQL seine Daten ablegt. Wenn du in phpMyAdmin zum Beispiel eine Tabelle erstellst kannst du unten bei
Tabellenformat unter anderem auch InnoDB auswählen. Voreingestellt ist MyISAM.
Und zu $ergebnis: Du kannst eins davon einfach umbenennen.
Zitat: |
Original von Remember
Hmm, denkt ihr, dass es einfacher wäre, wenn ich die Lebendgewinnsumme so ausgeben lassen würde, dass es nicht bei der Tabelle "Pferd" steht, sondern alle Ergebnisse, wo das Pferd halt den ausgegebenen Namen hat, zusammengezählt werden? Aber das is auch kompliziert, oder? |
Das wäre in der Tat die beste Lösung. So wie du es im Moment machst, könnten z.B. zwei Ergebnisse mit den Werten 300 und 500 vorhanden sein, als Summe ist aber 950 eingetragen. Wenn du die Summe gar nicht erst speicherst, sondern jedesmal aus den Ergebnissen berechnest, können solche Widersprüche nicht entstehen.
Remember
Zitat: |
Original von kext
Das wäre in der Tat die beste Lösung. So wie du es im Moment machst, könnten z.B. zwei Ergebnisse mit den Werten 300 und 500 vorhanden sein, als Summe ist aber 950 eingetragen. Wenn du die Summe gar nicht erst speicherst, sondern jedesmal aus den Ergebnissen berechnest, können solche Widersprüche nicht entstehen. |
Hmm. Ich dachte, dass er es so machen würde, dass er die aktuelle Lebendgewinnsumme ausgibt, dann das Preisgeld aufaddiert und dann updatet. Da hab ich anscheinend gerade einen Denkfehler, weil ich komm grad nicht drauf wie du das auf 300+500=950 kommst
Wie könnte ich das denn ausgeben lassen? Also wie ich ein Ergebnis bekomme, wäre mir klar, aber ich möchte ja, dass dann alle Preisgelder von diesem Pferd zusammengezählt werden & dann erst ausgegeben werden.
Oli
Hi,
ich denke, kext meinte, dass du das Ergebnis gar nicht speicherst, sondern jedes Mal mit MySQL errechnen lässt, in etwa so:
code: |
1:
|
SELECT SUM(lebendgewinnsumme) FROM `pferd` WHERE ... |
|
Das würde das Speichern eines Ergebnisses überflüssig machen, weil MySQL selbst die Summe bildet und dir diese zurückgibt.
kext
Das ist es ja gerade. 300 + 500 ist ja eben nicht 950, aber es könnt so in der Datenbank stehen (meistens wird da wohl 300 + 500 = 800 stehen^^). So etwas nennt man
Redundanz, man speichert einen Wert (hier 800) mehrfach ab.
Das ist in Datenbanken unerwünscht, weil man darauf achten muss, dass die Daten konsistent bleiben und dort eben nicht 300 + 500 = 950 steht. Wenn wir einfach die 800 aus der Datenbank ersatzlos streichen, müssen wir bei jedem Aufruf der Seite aus 300 und 500 den Wert berechnen, können aber sicher sein, dass er auch stimmt.
Du hast ja eine Tabelle »ergebnisse«, in der das Preisgeld für jedes Turnier jedes Pferdes drinsteht. Beim Pferd brauchst du die Lebendgewinnsumme deshalb gar nicht zu speichern, weil sie indirekt auch in der Ergebnistabelle steht. Du musst sie nur jedes mal berechnen. Dafür kannst du eine Query benutzen, die so ähnlich ist, wie diese hier:
code: |
1:
|
SELECT `pferdid`, SUM(`preis`) AS `lebendgewinnsumme` FROM `ergebnisse` WHERE `pferdid` = '3' GROUP BY `pferdid` |
|
Im Feld »lebendgewinnsumme« steht dann die Lebendgewinnsumme vom Pferd mit der ID 3.
Remember
Okay, Lebendgewinnsumme wird jetzt perfekt angezeigt.
Danke danke dankeschön <3
Nur leider zeigt er jetzt die einzelnen Turniere nicht mehr an. Also gar nicht mehr. Der entsprechende Codeteil wäre:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
<div class="head" style="float:left; width:650px; margin-left:20px; margin-bottom:0px;"><h3>Erfolge (bis einschliesslich 5. Platz)</h3></div>
<div class=stute align=center</a>Bisherige Lebendgewinnsumme:
<?php
$abfrage="SELECT `pferd`, SUM(`preis`) AS `lebendgewinnsumme` FROM `ergebnis` WHERE `pferd` = '".addslashes($Data[name])."' GROUP BY `pferd`";
$ergebnis = mysql_query($abfrage) or die("$abfrage<hr />" .mysql_error());
while($Data = mysql_fetch_array($ergebnis)){
echo"<b>$Data[lebendgewinnsumme]</b>v€";
}
?></div><br>
<table width=100% style="border-collapse:no-collapse; border:0px solid red;">
<tr> <td class="hengst" colspan=2><div align=center><b>Ergebnis</b></div></td> <td class="hengst"><div align=center><b>Prüfung</b></div></td> <td class="hengst"><div align=center><b>Austragungsort</b></div></td> <td class="hengst"><div align=center><b>Reiter</b></div></td></tr>
<?php
$abfrage="SELECT * FROM `ergebnis` WHERE pferd = '".addslashes($Data[name])."' AND (ergebnis = '1' OR ergebnis = '2' OR ergebnis = '3' OR ergebnis = '4' OR ergebnis = '5') order by ergebnis ASC";
$ergebnis = mysql_query($abfrage) or die("$abfrage<hr />" .mysql_error());
while($Data = mysql_fetch_array($ergebnis)){
echo"<tr align=center> <td class="stute"><b>$Data[ergebnis].</b></td> <td class="stute">$Data[preis]v€</td> <td class="stute">$Data[pruefung]</td> <td class="stute"><a href="$Data[hofaddy]" target="blank">$Data[hofname]</a></td> <td class="stute">$Data[reiter]</td> </tr>";
}
?></table></div></div></div><br><br><br> |
|
Ich hatte doch eigentlich den einen PHP-Teil geschlossen. Normalerweise müsste das doch passen, oder?