Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Komischer Fehler bei 2 Skripten

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Cujo
PostRank 5
PostRank 5
Beiträge: 231
Registriert: 13.07.2008, 23:20

Beitrag von Cujo » 27.09.2008, 08:50

Hallo,

ich habe hier eine Seite:

www.raetselstunde.de/quizfrage-des-tages.html

auf der ich 2 Skripte zum Einbinden anbiete. Jedes Skript für sich allein funktioniert einwandfrei. Nur wenn ich die beiden zusammen auf einer Seite einbinde, kommt es zu folgendem Fehler:

Beim allerersten Aufruf, d. h. wenn die Seite zum ersten Mal geladen wird und ich auf eine Antwort klicke, fehlt im erscheinenden Alert die Lösung und es fehlen die Antworten. Wenn ich einen Reload der Seite mache funktioniert es so wie es soll. Da es ein bisschen schwierig zu erklären ist, hier mal ein Screenshot:

Bild

Und hier sind die Codes:

Quizfrage des Tages:

Code: Alles auswählen

<?php
  @mysql_connect&#40;"Server", "Benutzer", "Passwort"&#41; or
      die &#40;"Fehler beim Connect"&#41;;
      
    @mysql_select_db&#40;"Datenbank"&#41; or
      die &#40;"Datenbank nicht vorhanden"&#41;;
  function resetDate&#40;&#41;
  &#123;
     $query = "Update
                quizfrage
               set
                 datum='0000-00-00'";
                
     mysql_query&#40;$query&#41; or
       die &#40;"MySQL-Fehler&#58; " . mysql_error&#40;&#41;&#41;;
  &#125;
  
  function getQuestion&#40;&$question, &$antwortr, &$antwortf1, &$antwortf2, &$antwortf3&#41;
  &#123;
      $result = false;
      
      // Frage des Tages schon mal ermittelt?
      $query = "Select
                  id,
                  question,
                  antwortr,
                  antwortf1,
                  antwortf2,
                  antwortf3
                from
                  quizfrage
                where
                  datum=curdate&#40;&#41;";
                  
       $result = mysql_query&#40;$query&#41; or
         die &#40;"MySQL-Fehler&#58; " . mysql_error&#40;&#41;&#41;;
        
        
       if &#40;mysql_num_rows&#40;$result&#41;&#41;
       &#123;
           $row = mysql_fetch_array&#40;$result&#41;;
           $question  = $row&#91;'question'&#93;;
           $antwortr = $row&#91;'antwortr'&#93;;
           $antwortf1 = $row&#91;'antwortf1'&#93;;
           $antwortf2 = $row&#91;'antwortf2'&#93;;
           $antwortf3 = $row&#91;'antwortf3'&#93;;          
           $result = true;
       &#125;
       else
       &#123;
          // Es wurde noch keine Frage des Tages ermittelt
          $query = "Select
                  id,
                  question,
                  antwortr,
                  antwortf1,
                  antwortf2,
                  antwortf3
                from
                  quizfrage
                where
                  datum='0000-00-00'
                order by rand&#40;&#41;";
                
          $result = mysql_query&#40;$query&#41; or
             die &#40;"MySQL-Fehler&#58; " . mysql_error&#40;&#41;&#41;;
            
          if &#40;mysql_num_rows&#40;$result&#41;&#41;
          &#123;
           $row = mysql_fetch_array&#40;$result&#41;;
           $id  = $row&#91;'id'&#93;;
           $question  = $row&#91;'question'&#93;;
           $antwortr  = $row&#91;'antwortr'&#93;;
           $antwortf1 = $row&#91;'antwortf1'&#93;;
           $antwortf2 = $row&#91;'antwortf2'&#93;;
           $antwortf3 = $row&#91;'antwortf3'&#93;;          
           $result = true;
  
             // Die Frage haben wir, jetzt Datum aktualisieren  
             $query = "Update
                         quizfrage
                       set
                         datum=curdate&#40;&#41;
                       where
                         id = $id";
                        
             mysql_query&#40;$query&#41; or
                die &#40;"MySQL-Fehler&#58; " . mysql_error&#40;&#41;&#41;;
            
             unset &#40;$id&#41;;
                
             $result = true;
          &#125;
          else
          &#123;
             // Alle Fragen durch, Datum resetten
             resetDate&#40;&#41;;
            
             $result = getQuestion&#40;$question, $antwortr,$antwortf1,$antwortf2,$antwortf3&#41;;
          &#125;
       &#125;
      
       return $result;
  &#125;
  
  $result = getQuestion&#40;$question, $antwortok, $antwortf1, $antwortf2, $antwortf3&#41;;
  
if&#40;!isset&#40;$_POST&#91;'senden'&#93;&#41;&#41;&#123;
  $antworten_qft = array &#40;$antwortok,$antwortf1,$antwortf2,$antwortf3&#41;;
  shuffle &#40;$antworten_qft&#41;;
  $_SESSION&#91;'antworten_qft&#91;0&#93;'&#93;=$antworten_qft&#91;0&#93;;
  $_SESSION&#91;'antworten_qft&#91;1&#93;'&#93;=$antworten_qft&#91;1&#93;;
  $_SESSION&#91;'antworten_qft&#91;2&#93;'&#93;=$antworten_qft&#91;2&#93;;
  $_SESSION&#91;'antworten_qft&#91;3&#93;'&#93;=$antworten_qft&#91;3&#93;;
  $_SESSION&#91;'question'&#93;=$question;
  $_SESSION&#91;'antwortok'&#93;=$antwortok;
&#125;
else
&#123;
  $antworten_qft = array &#40;$_SESSION&#91;'antworten_qft&#91;0&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;1&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;2&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;3&#93;'&#93;&#41;;
  $antwortok=$_SESSION&#91;'antwortok'&#93;;
  $question=$_SESSION&#91;'question'&#93;;
&#125;
unset &#40;$antwortf1,$antwortf2,$antwortf3&#41;;
  if &#40;$result === true&#41; &#123;
    echo "<form method='post' action='quizfrage.html'>";
    echo "<div style='text-align&#58;center'>";
    echo "$question";
    echo "<div style='margin-left&#58;auto; margin-right&#58;auto; text-align&#58;left; width&#58;200px'>";
    echo "<input type='radio' name='antwort' value='$antworten_qft&#91;0&#93;' /> $antworten_qft&#91;0&#93;<br />";
    echo "<input type='radio' name='antwort' value='$antworten_qft&#91;1&#93;' /> $antworten_qft&#91;1&#93;<br />";
    echo "<input type='radio' name='antwort' value='$antworten_qft&#91;2&#93;' /> $antworten_qft&#91;2&#93;<br />";
    echo "<input type='radio' name='antwort' value='$antworten_qft&#91;3&#93;' /> $antworten_qft&#91;3&#93;<br />";
    echo "<input type='submit' name='senden' value='Prüfen' />";
    echo "<br />";
    echo "</div>";
    echo "Quizfrage des Tages - powered by <a target='_blank' href='http&#58;//www.raetselstunde.de'>www.raetselstunde.de</a>";
    echo "</div>";
    echo "</form>";
  &#125;
  else
    echo "Mist, da ist was schiefgelaufen.";
if&#40;isset&#40;$_POST&#91;'antwort'&#93;&#41;&#41;
&#123;
  $eingabe=$_POST&#91;antwort&#93;;
    if &#40;$eingabe === $antwortok&#41; echo '<script type="text/javascript"> alert&#40;"Sehr gut, das war die richtige Antwort."&#41;; </script>'; else echo '<script type="text/javascript"> alert&#40;"Leider falsch. ' . $antwortok . ' wäre richtig gewesen."&#41;; </script>';
&#125;
?>
Zufalls-Quizfrage:

Code: Alles auswählen

<?php
@mysql_connect&#40;"Server", "Benutzer", "Passwort"&#41; or
      die &#40;"Fehler beim Connect"&#41;;
      
    @mysql_select_db&#40;"Datenbank"&#41; or
      die &#40;"Datenbank nicht vorhanden"&#41;;
  
  function getQuestionz&#40;&$questionz,&$antwortzr,&$antwortzf1,&$antwortzf2,&$antwortzf3&#41;
  &#123;
    // Zufallsfrage ermitteln
      $queryz =  "Select
                  question,
                  antwortr,
                  antwortf1,
                  antwortf2,
                  antwortf3
                from
                    quizfrage
                order by rand&#40;&#41;";
                  
       $resultz = mysql_query&#40;$queryz&#41; or
         die &#40;"MySQL-Fehler&#58; " . mysql_error&#40;&#41;&#41;;        
        
           $rowz = mysql_fetch_array&#40;$resultz&#41;;
           $questionz  = $rowz&#91;'question'&#93;;
           $antwortzr  = $rowz&#91;'antwortr'&#93;;
           $antwortzf1 = $rowz&#91;'antwortf1'&#93;;
           $antwortzf2 = $rowz&#91;'antwortf2'&#93;;
           $antwortzf3 = $rowz&#91;'antwortf3'&#93;;    
           $resultz = true;
          
       return $resultz;
  &#125;
  
  $resultz = getQuestionz&#40;$questionz,$antwortzr,$antwortzf1,$antwortzf2,$antwortzf3&#41;;
  
  $antwortenz = array &#40;$antwortzr,$antwortzf1,$antwortzf2,$antwortzf3&#41;;
  shuffle&#40;$antwortenz&#41;;
  unset &#40;$antwortzf1,$antwortzf2,$antwortzf3&#41;;

  if &#40;$resultz === true&#41; &#123;
    echo "<form method='post' action='quizfrage-zufall.html'>";
    echo "<div style='margin-left&#58;auto; margin-right&#58;auto;width&#58;400px'>";
    echo "$questionz";
    echo "<div style='margin-left&#58;auto; margin-right&#58;auto; text-align&#58;left; width&#58;200px'>";
    echo "<input type='radio' name='antwortz' value='$antwortenz&#91;0&#93;' /> $antwortenz&#91;0&#93;<br />";
    echo "<input type='radio' name='antwortz' value='$antwortenz&#91;1&#93;' /> $antwortenz&#91;1&#93;<br />";
    echo "<input type='radio' name='antwortz' value='$antwortenz&#91;2&#93;' /> $antwortenz&#91;2&#93;<br />";
    echo "<input type='radio' name='antwortz' value='$antwortenz&#91;3&#93;' /> $antwortenz&#91;3&#93;<br />";
    echo "<input type='submit' name='sendenz' value='Prüfen' />";
    echo "<br />";
    echo "</div>";
    echo "Zufalls-Quizfrage - powered by <a target='_blank' href='http&#58;//www.raetselstunde.de'>www.raetselstunde.de</a>";
    echo "</div>";
    echo "</form>";
  &#125;
  else
    echo "Mist, da ist was schiefgelaufen.";

if&#40;isset&#40;$_POST&#91;'antwortz'&#93;&#41;&#41;
&#123;
  $antwortalt=$_SESSION&#91;'antwortalt'&#93;;
  $eingabez=$_POST&#91;antwortz&#93;;
  
  if &#40;$eingabez === $antwortalt&#41; echo '<script type="text/javascript"> alert&#40;"Sehr gut, das war die richtige Antwort."&#41;; </script>'; else echo '<script type="text/javascript"> alert&#40;"Leider falsch. ' . $antwortalt . ' wäre richtig gewesen."&#41;; </script>';
&#125;
$_SESSION&#91;'antwortalt'&#93;=$antwortzr;
?> 
Hat jemand eine Idee, wo der Fehler liegen könnte?
Quizfragen für Apps und Websites
www.quizfragen.de

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 27.09.2008, 15:13

Der Code ist etwas unübersichtlich und zudem hast du wohl über weite Strecken denselben Code zweimal verwendet, anstatt diese Teile in einer einzelnen Funktion zu lagern. Das ist per se fehlerträchtig, da mehr Code mehr Fehlermöglichkeiten bedeutet, und erleichtert die Fehlersuche zudem nicht unbedingt.
Du könntest den Code sicher um gut die Hälfte bis zwei Drittel eindampfen, wenn du den ganzen doppelten Kram rauswerfen würdest.

Aufgefallen ist mir, dass du zwar $_SESSION nutzt, aber der Aufruf von session_start() fehlt. Vielleicht hast du aber auch session.auto_start gesetzt.

Ich rate dir, an strategischen Stellen die betreffenen Variablen mittels var_dump() auszuspucken, in diesem Falle unter anderem das Feld $antworten und seine Quelle, denn da steht ja offenbar nix drin. So siehst du, wo eine Variable nicht oder nicht mehr den Wert enthält, den sie eigentlich enthalten sollte. Nutze var_dump() ruhig dutzendweise.

Vom Fehler unabhängig:

Sowas

echo "$question";

ist möglicherweise unklug, es sei denn, du willst explizit HTML in den Fragen (und Antworten) erlauben. Falls dem nicht so ist: Variablen vor der Ausgabe grundsätzlich durch htmlspecialchars() jagen und nur in durchdachten Ausnahmefällen darauf verzichten. Insbesondere unter gar keinen Umständen Variablen, deren Inhalt von draußen (vom Besucher) kommt, ungesichert ausgeben!
Davon abgesehen ist es nicht nötig, Variablen in Anführungszeichen zu setzen, das ist eine der schlampigen Unsitten, die PHP zulässt.

Ergo:

echo htmlspecialchars($question);

An allen anderen Stellen mit Variablenausgabe analog.

Cujo
PostRank 5
PostRank 5
Beiträge: 231
Registriert: 13.07.2008, 23:20

Beitrag von Cujo » 27.09.2008, 20:40

Mork vom Ork hat geschrieben:Aufgefallen ist mir, dass du zwar $_SESSION nutzt, aber der Aufruf von session_start() fehlt. Vielleicht hast du aber auch session.auto_start gesetzt.
Es hat jedenfalls was mit session_start() zu tun. Ursprünglich hatte ich session_start() in beiden php-Dateien drin. Dann kam allerdings eine Warnung, dass vorher schon eine Ausgabe erfolgt. Deshalb habe ich session_start() in den Dateien quizfrage.html und quizfrage-zufall.html ganz an den Anfang, noch vor den Doctype, gesetzt. Deshalb hat der Befehl auch im php-Code gefehlt. Die beiden html-Dateien haben jeweils ein include drin für die jeweilige php-Datei.

Nach deinem Tip habe ich in die php.ini mal session.auto-start = 1 eingetragen und in den html-Dateien das session_start() rausgenommen.

Die gute Nachricht ist, es funktioniert jetzt einwandfrei auf meiner Seite. Die schlechte Nachricht ist, die beiden Skripte stehen noch auf einer anderen Domain auf einer Seite. Dort tritt weiterhin der gleiche Fehler auf. Wer die andere Domain haben will --> PN.

Hat noch jemand eine Idee, was ich tun könnte, damit es überall funktioniert?
Quizfragen für Apps und Websites
www.quizfragen.de

wolli
PostRank 9
PostRank 9
Beiträge: 1395
Registriert: 01.01.2006, 18:48

Beitrag von wolli » 28.09.2008, 10:05

wenn du den Fehler nicht findest
includiere doch einfach das Script von der Domain wo es läuft auf die Domain
wo es nicht läuft in einem iframe zum Beispiel

Cujo
PostRank 5
PostRank 5
Beiträge: 231
Registriert: 13.07.2008, 23:20

Beitrag von Cujo » 28.09.2008, 10:17

Geht leider nicht, auf die andere Homepage habe ich leider keinen Zugriff. Ausserdem möchte ich dem Webmaster auch nicht unbedingt auf die Nase binden, dass meine Skripte bei ihm nicht 100%ig funktionieren. Zumindest solange nicht, wie ich noch die Hoffnung habe, dass ich es hinkriege :D
Quizfragen für Apps und Websites
www.quizfragen.de

Cujo
PostRank 5
PostRank 5
Beiträge: 231
Registriert: 13.07.2008, 23:20

Beitrag von Cujo » 30.09.2008, 21:02

Ich habe jetzt mal eine Testseite auf einem anderen Server erstellt. Es tritt der Fehler auf, das, wenn man auf Prüfen drückt, beim erstenmal die Lösung fehlt und/oder dass danach die 4 Antworten fehlen. Hier ist der Link:

https://cujo.bplaced.net/quizfrage-des-tages.html

Könnt ihr es euch bitte nochmal angucken? Es wäre mir sehr wichtig, dass ich den Fehler finde.
Quizfragen für Apps und Websites
www.quizfragen.de

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 30.09.2008, 21:53

Cujo hat geschrieben:Könnt ihr es euch bitte nochmal angucken? Es wäre mir sehr wichtig, dass ich den Fehler finde.
Also du hast definitiv ein Problem mit dem Einrichten der Session. Ist kein Cookie beim Aufruf A gesetzt, erscheinen beim folgenden Aufruf B, d.h. beim Abschicken der Antwort, keine Lösungen.

Benutze doch bitte mal folgenden if-Block statt des entsprechenden vorhandenen und prüfe, ob sowohl bei A als auch bei B $_SESSION mit den Antworten gefüllt ist.

Code: Alles auswählen

if&#40;!isset&#40;$_POST&#91;'senden'&#93;&#41;&#41;&#123;
  $antworten_qft = array &#40;$antwortok,$antwortf1,$antwortf2,$antwortf3&#41;;
  shuffle &#40;$antworten_qft&#41;;
  $_SESSION&#91;'antworten_qft&#91;0&#93;'&#93;=$antworten_qft&#91;0&#93;;
  $_SESSION&#91;'antworten_qft&#91;1&#93;'&#93;=$antworten_qft&#91;1&#93;;
  $_SESSION&#91;'antworten_qft&#91;2&#93;'&#93;=$antworten_qft&#91;2&#93;;
  $_SESSION&#91;'antworten_qft&#91;3&#93;'&#93;=$antworten_qft&#91;3&#93;;
  $_SESSION&#91;'question'&#93;=$question;
  $_SESSION&#91;'antwortok'&#93;=$antwortok;

var_dump&#40;$_SESSION&#41;;

&#125;
else
&#123;

var_dump&#40;$_SESSION&#41;;

  $antworten_qft = array &#40;$_SESSION&#91;'antworten_qft&#91;0&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;1&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;2&#93;'&#93;,$_SESSION&#91;'antworten_qft&#91;3&#93;'&#93;&#41;;
  $antwortok=$_SESSION&#91;'antwortok'&#93;;
  $question=$_SESSION&#91;'question'&#93;;
&#125;

Anschließend, da du sagst, der Fehler trete nur auf, wenn beide Skripte zusammen in einer Seite stehen, kommentiere die beiden Zeilen mit $_SESSION aus dem Zufalls-Skript aus und schaue, was dann passiert. Es sieht ja so aus, als wenn das Zufalls-Skript die Session-Daten überschreibt.

Dann wirfst du bitte mal einen Blick in das Fehlerprotokoll deines Webservers und beseitigst alles, worüber PHP sich beschwert. Da müsste mindestens einer auftauchen.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag