Inhalt einer Variable "verschwindet"
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
bericht
code
dank
datei
ergebnis
fehler
fusion
header
http
inhalt
liga
not
null
problem
spieltag
trainer
uhrzeit
url
zeile
-
Hallo,
ich habe hier ein Problem:
$abfrage = "SELECT Trainer FROM tabelle_".$liga." WHERE Verein = '".$Gastm."'"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { $Gasttrainer = "$row->Trainer"; } $datum = date("d.m.Y"); $uhrzeit = date("H:i"); if ($liga == "de1") { $ligainhalt = "Bundesliga"; } elseif ($liga == "gb1") { $ligainhalt = "Premier League"; }elseif ($liga == "dfb") { $ligainhalt = "DFB-Pokal"; }elseif ($liga == "fa") { $ligainhalt = "FA-Cup"; } $inhalt = '<html> <head> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <center> <? require_once "../maincore.php"; require_once THEMES."templates/header.php"; echo "<i>Eingetragen von '.$userdata["user_name"].' am '.$datum.' um '.$uhrzeit.' Uhr.</i><br><br>"; echo "<b>'.$ligainhalt.'</b><br>"; echo "<b>Spieltag '.$Spieltag.'</b><br>"; echo "'.$Heimm.' ('.$Heimtrainer.') <b>'.$_POST['toreheim'].'</b> - <b>'.$_POST['toregast'].'</b> ('.$Gasttrainer.') '.$Gastm.' <br><br>"; echo "<h4>Tore</h4>"; ?> <div class="links">'; foreach ($_POST['spielerheim'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= '</div> <div class="rechts">'; foreach ($_POST['spielergast'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= ' </div><div class="clear"></div><? echo "<h4>Bericht:</h4><br>"; ?> <div id="text">'.$_POST['bericht'].'</div><? require_once THEMES."templates/footer.php"; ?> </center> </body> </html>'; $datei = fopen("/home/webpages/lima-city/fifa-society/html/berichte/".$liga.".".$ID.".php","w+"); fwrite($datei, $inhalt);
Bei dem oberen Teil, bei dem etwas in die Datenbank geschrieben wird funktioniert die Variable $liga noch, allerdings ist sie abif ($liga == "de1") { [...]
nicht mehr richtig besetzt sondern hat immer den Inhalt "de1" und somit werden auch $ligainhalt sowie die Datei falsch benannt.
Weiß jemand evtl. woran es liegt? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hi,
erstmal vorweg:
in deinem code sind zwei dicke xss-lücken. wenn du die $_POST variablen direkt ausgibst kann man ganz einfach zb bösartigen javascriptcode auf deiner seite ausführen lassen...
im oberen teil wird ja etwas aus der datenbank ausgelesen anstatt geschrieben...
und in dem oben angefragtem sql-statement ist der wert von $liga wirklich nicht der gleiche wie bei oder nach der if-abfrage ?? das wäre in der tat verwunderlich...
Beitrag zuletzt geändert: 16.10.2012 22:20:40 von hcms -
hcms schrieb:
hi,
erstmal vorweg:
in deinem code sind zwei dicke xss-lücken. wenn du die $_POST variablen direkt ausgibst kann man ganz einfach zb bösartigen javascriptcode auf deiner seite ausführen lassen...
im oberen teil wird ja etwas aus der datenbank ausgelesen anstatt geschrieben...
und in dem oben angefragtem sql-statement ist der wert von $liga wirklich nicht der gleiche wie bei oder nach der if-abfrage ?? das wäre in der tat verwunderlich...
Danke für deine Hinweise, war eigentlich auch gemeint, dass sie aus der Datenbank ausgelesen werden
Oben ist der Wert von $liga noch "gb1" während es unten anschließend "de1" ist. -
Hey fifa-society,
dann poste doch mal "oben" .. In diesem Code wird er - soweit ich das erkennen kann - nirgends überschrieben. Es muss also bereits vorher passieren.
Mit freundlichen Grüßen -
Er wird auch an keiner Stelle mehr überschrieben
Mit "oben" habe ich in diesem Fall hier gemeint:
$abfrage = "SELECT Trainer FROM tabelle_".$liga." WHERE Verein = '".$Gastm."'"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { $Gasttrainer = "$row->Trainer"; }
$liga ist hier noch "gb1", später dann aus irgendeinem Grund "de1". -
hmm seltsam.
aber wennOben ist der Wert von $liga noch "gb1"
dann träfe ja keine der if bedingungen zu und ann wäre $ligainhalt ja gar nicht referenziert ??
hast du dir denn mal tatsächlich den statement-string ausgeben lassen ? -
sorry - oh ja - häh ?
also manchmal...
wenn ich den schnipsel mit den if bedingungen zur ausgabe bringe und vorher $liga="gb1" mache ist es danach noch genauso...
wäre vielleicht interessant zu wissen ob bei dir der fehler genau vor oder nach der zeile
entstehtif ($liga == "de1") {
-
Genau das wüsste ich eben auch gerne Habe alles schon mehrmals ohne Ergebnis durchsucht.
Der Fehler müsste ja rein theoretisch zwischen
$abfrage = "SELECT Trainer FROM tabelle_".$liga." WHERE Verein = '".$Gastm."'";
und
if ($liga == "de1") {
liegen. -
Also, entweder ist das nicht der komplette Code, oder Du hast einen massiven Fehler gemacht, wenn $liga und $Gastm nicht definiert sind wenn sie in den Query eingefügt werden. Kurz gesagt der Inhalt von $abfrage ist gleich "SELECT Trainer FROM tabelle_ WHERE Verein = ' ' " was in Deinem Fall mit Sicherheit ein leeres Ergebniss liefern dürfte.
Dazu kommt auch noch, wie schon von anderen erwähnt, das Du User-Eingaben un gefiltert verarbeitet und dass ist einfach mal das dümmste was man machen kann. Grundregel: Vertraue keiner User-Eingabe! Nicht einmal Deinen eigenen!
Jetzt noch mal ein wenig zu dem Code an sich:
Verwende switch() für die ganzen elseif's!
Der Code wird dadurch einfach übersichtlicher und ist auch einfacher erweiterbar.
Wenn Du fopen() verwendest, immer auch fclose() verwenden!
Damit vermeidest Du ggf. später auftretende Probleme und andere Coder werden dadurch nicht verwirrt.
Benutze MySQLi oder PDO statt standard mysql!
Beide Klassen bieten einfache Methoden/Functionen die einem das Escapen ersparen und haben nebenbei auch noch ein paar Extras.
Verwende niemals require_once() wenn Du Templates laden willst!
Standard include() reicht da völlig aus! include_once()/require_once() ist mehr für Klassen gedacht die nur einmal in einem Project geladen werden müssen.
Variablen werden immer klein geschrieben!
Zwar weniger wichtig wenn Du nur allein codest, aber Du solltest Dir angewöhnen Variablen klein zu schreiben. Also $gastm statt $Gastm und so weiter. Einzig Klassen werden großgeschreiben und Konstanten werden komplett in caps geschrieben (gibt nen paar Ausnahmen)
Ich könnte denke mal noch ne ganze Stunde "Tipps" geben, aber dafür habe ich nicht wirklich Zeit. Falls das nicht der komplette Code ist, dann bitte erst den ganzen Code posten (eventuelle Passwörter und so weiter entfernen!) und erst dann kann man Dir wirklich helfen. Falls das aber der komplette Code war, dann siehe oben! -
fifa-society schrieb:
du sagst es. du hast hier allerdings viel mehr probleme als bisher aufgezählt worden sind.
... ich habe hier ein Problem: ...
nur paar dinge:
1. frage: verwendest du 'error_reporting(E_ALL | E_STRICT);'? wenn nicht, dann machst du blindflug!
2. code-einrückung (miserable lesbarkeit)
3. wechseln zwischen php und html (spaghetti-code)
4. die verwendung von 'echo'/'print' ist auch spaghetti!
5. verwendung der kurzschreibweise '<?' (start php code) geht nicht auf jedem server!
ein zwei details:
du machst die abfrage, dann gehst du das ergebnis durch, ohne zu wissen, ob due eins hast! (das machen hir bei lima allerdings alle ;) folgende konstrukt erspart dir 'blindflug' ;)
$abfrage = '...'; $ergebnis = ($r = mysql_query($abfrage)) ? $r: exit("<h3>mysql error</h3><p>abfrage:</p><pre>$abfrage<p>error:</p>" . mysql_error()); // hier kommst nur an, wenn du fehlerfrei bist ;)
weiters:
du machst eine while-schleife, die keinen sinn für mich macht.
hier helfen kann man nur wenn man das 'create' von 'tabelle_<$liga>' kennt.
ich vermute, dass so die abfrage, wie die verarbeitung des ergebnisses konzeptlos ist.
und dann noch:
was ist in den dateien '../maincore.php', 'THEMES."templates/header.php"'? gibt es dort textausgaben (echo/print)? wenn ja, must du auch sie hier zeigen.
warum?: es ist schon schlimm genug, dass du php und html mischst (allerdings auch noch falsch)
aber dass du mit php html erzeugst, wo du dann drinnen wieder php einbinden musst, das habe ich noch nicht gefrühstückt.
es ist sinnlos hier weiter zu bohren. mache die 3 dateien sichtbar so dass wir hier alle
ansehen können, zeige uns das create von der tabelle und dann sehen wir es weiter ... -
Danke für eure Antworten.
strange: Es ist nicht der ganze PHP Code der Datei, allerdings der für dieses Problem relevante. $liga ist definiert und wird auch in der MySQL Abfrage richtig verwendet.
Die User können in meinem Fall allerdings keine beliebigen Eingaben tätigen, dann dürfte das Problem damit doch erledigt sein, oder sehe ich das falsch?
Noch danke für deine restlichen Tipps.
czibere:
1. Ja.
2. Sieht normalerweise anders aus, weiß auch nicht wieso es im Forum so "komisch" aussieht :-/
3. Müsste ich mir mal abgewöhnen , ebenfalls 4.
5. OK, danke für die Info.
Zu deinem ersten Detail:
Es kommt immer ein Ergebnis
header.php:
http://pastxt.com/P/37NEJ82VE4
maincore.php:
http://pastxt.com/P/5V784S81NS -
fifa-society schrieb:
ja unbedingt! die user sind meistens kein problem, wohl aber die bösen buben un mägde ;))
... Die User können in meinem Fall allerdings keine beliebigen Eingaben tätigen, dann dürfte das Problem damit doch erledigt sein, oder sehe ich das falsch?
czibere:
seltsam seltsam! ich mache das hier
...
2. Sieht normalerweise anders aus, weiß auch nicht wieso es im Forum so "komisch" aussieht :-/
...
dann isses nummeriert UND coloriert ;)[code=php] blaaa blaaa [/ code]
allerdings:
verwende rigoros nur tabs o. nur spases (2 reichen). nach endgültigem speichern, lasse keine trailing spaces in deinem progs (gute proger-editoren haben eine funktion dafür)! stelle möglichst alles auf UTF-8 um! auch dein mysqld (die ganzen alten zeichensätze sind ein schmarren ;)!!
Zu deinem ersten Detail:
ich hoffte, das ding begreiflich machen zu können. leider doch nicht! ich habe nicht gemeint, dass du dein query falsch gemacht hast. ich meinte, man soll (moralische pflicht!!!!) alles nach besten möglichkeiten gestalten. speziell: in php gibt es kein mysql_* befehl ohne rückgabe! jede rückgabe SOLL geprüft werden un man soll adequat auf das ergebnis reagieren. sinn? ja! und zwar die sicherheit!!!!
Es kommt immer ein Ergebnis
header.php:
http://pastxt.com/P/37NEJ82VE4
maincore.php:
http://pastxt.com/P/5V784S81NS
danke. genau das was ich befürchtet habe ;) überall echo und spaghetti ist das ding sowieso.
==== edit ====
nachdem es jetzt klar ist, dass PHP-Fusion verwendest, muss ich erstmal fragen, was du eigentlich machst? das, was du an code zeigst ist auf alle fälle mehr als sonderbar in dieser konstellation.
==== last edit ====
PHP-Fusion und lima-php
Beitrag zuletzt geändert: 19.10.2012 11:13:16 von czibere -
Ich verwende ausschließlich Tabs
Zu deinem letzten Edit: Ich hatte zumindest noch keine Probleme mit PHP Fusion.
Eine Lösung zu dem Problem habe ich allerdings noch immer nicht gefunden :-/ -
fifa-society schrieb:
das ist jäckchen wie höschen. ich empfahl nur konsequenz (ich verwende NUR 2 spaces. na und? ;)
Ich verwende ausschließlich Tabs
Zu deinem letzten Edit: Ich hatte zumindest noch keine Probleme mit PHP Fusion.
das kommt davon, dass wir das gute ding unterschiedlich geprüft (gebraucht [ich nur 5min., wie oben gesagt]) haben. du wirst noch deine probleme kriegen, wenn du mit dem ding weiter kommst. aber natürlich steht dir nichts im wege, dir einen dedizierten server zuzulegen! dann hast du endlich all die probleme von allen providern, nur das dir das nötige wissen fehlt. aber dort kannst natürlich 'eval' verwenden *grinz*. (etwas taschengeld kostet so ein server natürlich auch ;)
Eine Lösung zu dem Problem habe ich allerdings noch immer nicht gefunden :-/
du bist uns auch nicht entgegengekommen in dem sinne, den ganzen code hier zu zeigen. ich habe außerdem um ein create gebeten. (auch nicht gekommen.)
welche hilfe erwartest jetzt? soll ich dich auf der treppe hochhelfen? -
Wenn du schon Fusion verwendest, warum lädst du dann nicht erst die maincore?
Dann könntest du auf die Funktionen von Fusion zugreifen und hättest es dann schon mal mit der DB anfrage einfacher. Und zudem hast du so wie dein Code nun aufgebaut ist ein Problem mit den Datenbankverbindungen, da in der maincore.php wieder eine geöffnet wird.
Mit $inhalt gibst du einen doppelten HTML und Head Bereich aus. Um das zu vermeiden stellt dir Fusion ein paar Funktionen zur Verfügung wie add_to_head($text)
Hier hast du einen gravierenden Fehler, verwunderlich, dass dir überhaupt etwas angezeigt wird:
$inhalt = '<html> <head> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <center> <? require_once "../maincore.php"; require_once THEMES."templates/header.php"; echo "<i>Eingetragen von '.$userdata["user_name"].' am '.$datum.' um '.$uhrzeit.' Uhr.</i><br><br>"; echo "<b>'.$ligainhalt.'</b><br>"; echo "<b>Spieltag '.$Spieltag.'</b><br>"; echo "'.$Heimm.' ('.$Heimtrainer.') <b>'.$_POST['toreheim'].'</b> - <b>'.$_POST['toregast'].'</b> ('.$Gasttrainer.') '.$Gastm.' <br><br>"; echo "<h4>Tore</h4>"; ?> <div class="links">';
Welche Fusion Version nutzt du?
Und schreib es als Infusion, dann kann man mit dem ganzen als Aussenstehender mehr mit dem Code anfangen. Denn das was dann in der infusion.php stehen muss ist ebenso relavant, wie das was du hier gepostet hast.
Falls du Fusion ab 7.02 nutzt, dann schau doch auch mal in den Fehlerbericht im Adminbereich von PHP-Fusion.
-
all-in1 schrieb:
... Hier hast du einen gravierenden Fehler, verwunderlich, dass dir überhaupt etwas angezeigt wird ...
zu erinnerung sein 'eingebetteter' html-code mit 'eingebettetem' php (allein zu beschreiben ist schon ein irrsinn) mit zeilennummern wegen bessere verfolgung:<html> <head> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <center> <? require_once "../maincore.php"; require_once THEMES."templates/header.php"; echo "<i>Eingetragen von '.$userdata["user_name"].' am '.$datum.' um '.$uhrzeit.' Uhr.</i><br><br>"; echo "<b>'.$ligainhalt.'</b><br>"; echo "<b>Spieltag '.$Spieltag.'</b><br>"; echo "'.$Heimm.' ('.$Heimtrainer.') <b>'.$_POST['toreheim'].'</b> - <b>'.$_POST['toregast'].'</b> ('.$Gasttrainer.') '.$Gastm.' <br><br>"; echo "<h4>Tore</h4>"; ?> <div class="links">'; foreach ($_POST['spielerheim'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= '</div> <div class="rechts">'; foreach ($_POST['spielergast'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= ' </div><div class="clear"></div><? echo "<h4>Bericht:</h4><br>"; ?> <div id="text">'.$_POST['bericht'].'</div><? require_once THEMES."templates/footer.php"; ?> </center> </body> </html>
1. seine strukturierung ist (generell) zerzaust;
2. sein html ist ungültig;
3 '<?' (kurzschreibweise) sollte nicht mehr verwendet werden;
4. man sehe sich die zeilen ab der 16ten an!!?? (php block nicht gekennzeichnet)
... und und und. daher - wenn schon so, dann - eher doch auf die art:<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <?php require_once "../maincore.php"; require_once THEMES."templates/header.php"; echo "<i>Eingetragen von '.$userdata["user_name"].' am '.$datum.' um '.$uhrzeit.' Uhr.</i><br><br>"; echo "<b>'.$ligainhalt.'</b><br>"; echo "<b>Spieltag '.$Spieltag.'</b><br>"; echo "'.$Heimm.' ('.$Heimtrainer.') <b>'.$_POST['toreheim'].'</b> - <b>'.$_POST['toregast'].'</b> ('.$Gasttrainer.') '.$Gastm.' <br><br>"; echo "<h4>Tore</h4>"; ?> <div class="links">'; <?php // das - und das ende von dem - fehlt bei dem TE! foreach ($_POST['spielerheim'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= '</div> <div class="rechts">'; foreach ($_POST['spielergast'] as $value) { $inhalt .= ''.$value.'<br>'; } $inhalt .= ' ?> </div><div class="clear"></div> <?php echo "<h4>Bericht:</h4><br>"; ?> <div id="text">'.$_POST['bericht'].'</div> <?php require_once THEMES."templates/footer.php"; ?> </body> </html>
was ich mir auf gar keinen fall antun würde. in PHP-Fusion hat er eine funktion 'Add Custom Page'. darin besteht die möglichkeit php code einzugeben. leider mit dem kleinen nebeneffekt, namens 'eval'.
all-in1 schrieb:
maincore ladet er definitiv (auch wenn er nichts davon nutzt)
Wenn du schon Fusion verwendest, warum lädst du dann nicht erst die maincore?
all-in1 schrieb:
gelinde ausgedrückt. aber weil er ja sich ziemlich zugeknöpt hält, kann man ihm kaum wirklich helfen.
verwunderlich, dass dir überhaupt etwas angezeigt wird -
czibere schrieb:
welche hilfe erwartest jetzt? soll ich dich auf der treppe hochhelfen?
Freundlichkeit ist nicht so deine Stärke, oder? Auch wenn ich Hilfe suche muss ich mich nicht von jedem einen sinnlosen Spruch gefallen lassen.
Zu dem create: Sinnlos, da das Problem nichts mit MySQL zu tun hat.
@all-in1: Die maincore wird zu Beginn der Datei geladen, hier zu sehen:
http://pastxt.com/P/Z6273EA98H
Mit Infusionen habe ich mich noch nicht sonderlich befasst, ich habe bisher meinen ganzen Code in einer extra Datei erstellt und anschließend in PHP Fusion eingebunden.
Danke für deinen Hinweis mit dem Fehlerlog, das sind die Einträge, die mit der Datei zusammenhängen:
Undefined variable: ID Zeile: 324
Undefined variable: Heimm Zeile: 302
Undefined variable: Spieltag Zeile: 301
Undefined variable: Gastm Zeile: 272
Undefined variable: Gastm Zeile: 260
Undefined variable: Heimm Zeile: 257
Invalid argument supplied for foreach() Zeile: 209
Undefined index: spielerheim Zeile: 209
Undefined variable: ID Zeile: 222
Undefined variable: Gastm Zeile: 152
Undefined variable: Gastm Zeile: 145
Undefined variable: Heimm Zeile: 122
Wobei ich hier vor einem Rätsel stehe, da eben genau diese Variablen problemlos funktionieren. -
Undefined heisst ja nicht, dass es nicht funktionieren muss, sondern nur kann. In deinem Fall kommen dann unerwartete Ergebnisse zum Vorschein.
In zeile 209 fängt es an. Da spielerheim nicht definiert bzw. leer ist, kommt es in der foreach Schleife zum Fehler. Daraus resultieren dann alle weiteren Fehler.
Das Create ist insofern wichtig, dass wir dein Script bei uns ausprobieren könnten und so schneller den Fehler finden könnten.
Deshalb wäre anzuraten, daraus eine Infusion zu schreiben. Hättest dann auch den Vorteil, dass du ein Panel da gleich mit einbauen kannst, um das ganze etwas übersichtlicher zu gestalten.
Zudem solltest du erstmal ab Zeile 290 deinen Code überarbeiten, denn da sind die Fehler so gravierend, dass der Code eigentlich gar nicht erst ausgeführt werden dürfte. -
all-in1 schrieb:
Undefined heisst ja nicht, dass es nicht funktionieren muss, sondern nur kann. In deinem Fall kommen dann unerwartete Ergebnisse zum Vorschein.
In zeile 209 fängt es an. Da spielerheim nicht definiert bzw. leer ist, kommt es in der foreach Schleife zum Fehler. Daraus resultieren dann alle weiteren Fehler.
Das Create ist insofern wichtig, dass wir dein Script bei uns ausprobieren könnten und so schneller den Fehler finden könnten.
Deshalb wäre anzuraten, daraus eine Infusion zu schreiben. Hättest dann auch den Vorteil, dass du ein Panel da gleich mit einbauen kannst, um das ganze etwas übersichtlicher zu gestalten.
Zudem solltest du erstmal ab Zeile 290 deinen Code überarbeiten, denn da sind die Fehler so gravierend, dass der Code eigentlich gar nicht erst ausgeführt werden dürfte.
Hier die create der Tabelle tabelle_de1, die genauso aufgebaut ist wie tabelle_gb1:
CREATE TABLE IF NOT EXISTS `tabelle_de1` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `Verein` varchar(30) NOT NULL, `Trainer` varchar(30) NOT NULL, `ICQ` varchar(30) NOT NULL, `Spiele` int(10) NOT NULL, `Siege` int(10) NOT NULL, `Unentschieden` int(10) NOT NULL, `Niederlagen` int(10) NOT NULL, `Tore` int(10) NOT NULL, `Gegentore` int(10) NOT NULL, `Punkte` int(10) NOT NULL, `Liga` varchar(30) NOT NULL DEFAULT 'de1', `Sterne` int(2) NOT NULL, PRIMARY KEY (`ID`) )
Um den Fehler in Zeile 209 zu umgehen könnte ich um die foreach-Schleife doch eigentlich noch folgende Bedingung machen:
if (isset($_POST['spielerheim'])) { }
, oder? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage