Konkretes Problem beim Einbinden von Java-Script in PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Konkretes Problem beim Einbinden von Java-Script in PHP

    Hallo Zusammen,

    ich habe folgenden Code gebastelt. Es handelt sich dabei um eine Abfrage, wer die meisten Spiele für einen Verein gemacht. Dabei sollen Name, Vorname, Saisons (Ära), Spiele, Tore und Torquotient ausgegeben werden. Webkennung ist dabei ein Kürzel, was ich in den Java-Script Code einbauen möchte, um einen Link auf eine HTML-Seite des Spielers zu erzeugen. Ich weiß, dass würde man heute nicht mehr so machen.

    PHP-Code:
    <?php
      $sql 
    mysql_query(
      
    "SELECT
        'Text'
        ,Webkennung AS Webkennung_anzeige
        ,Webkennung AS Webkennung_seite
        ,Name
        ,Vorname
        ,min(SaisonNr)
        ,substr(min(SaisonNr+1),3)
        ,max(SaisonNr)
        ,substr(max(SaisonNr+1),3)
        ,count(Einsatz)
        ,sum(Tor)
        ,round(sum(Tor)/count(Einsatz),2) AS Torquotient
      FROM
          "
    .spieler."
         ,"
    .einsaetze."
         ,"
    .spiele."
         ,"
    .saison."
         ,"
    .aera."
      where .spieler.SpielerID=.einsaetze.SpielerID
      and .spiele.SpieleID=.einsaetze.SpieleID
      and .spiele.saisonID=.saison.saisonID
      and .aera.aeraID=.saison.aeraID
      Group by Name,Vorname
      having count(Einsatz) > 100
      ORDER BY count(Einsatz) desc, min(SaisonNr), max(SaisonNr) desc"
    );



      while (
    $data mysql_fetch_assoc($sql))
              
    // daten einer spalte werden in dem Array $data gespeichert
      
    {
         echo 
    "<tr>";
            echo 
    "<td class='linksoben'>".Text."</td>";
            echo 
    "<td class='linksoben'>  <a href=\"javascript:VierFrames(\'Start_SB.htm\',0,\'"
                                         
    .$data["Webkennung_anzeige"].
                                          
    "_anz.htm\',2,\'Aera_SB.htm\',1,\'"
                                         
    .$data["Webkennung_seite"].
                                          
    ".htm\',3)\'>"
                                         
    .$data["Name"].", ".$data["Vorname"]."</a></td>" ;
            echo 
    "<td class='linksoben'>".$data["min(SaisonNr)"]. "/"
                                         
    .$data["substr(min(SaisonNr+1),3)"]. " - "
                                         
    .$data["max(SaisonNr)"]. "/"
                                         
    .$data["substr(max(SaisonNr+1),3)"]."</td>" ;
            echo 
    "<td class='linksoben'>".$data["count(Einsatz)"]."</td>";
            echo 
    "<td class='linksoben'>".$data["sum(Tor)"]."</td>";
            echo 
    "<td class='linksoben'>".$data["Torquotient"]."</td>";
            echo 
    "</tr>";
      }
      
    ?>
    [COLOR="BLUE"]Das Ergebnis sieht so aus:
    Nr. Spieler Ära Einsätze Tore Torquotient
    Text Bel, Dieter 1976/77 - 1991/92 361 51 0.14
    Text Hen, Kay 1997/98 - 2010/11 291 100 0.34[/COLOR]

    Das Problem dabei ist, dass die Webkennung (die HTML-Seite) des Spielers mit den meisten Spielern, ausgegeben wird, aber nicht der passende Name des Spielers. Es wird der mit den zweitmeisten Spielen ausgeben usw. usf. Webkennung 3. Spieler, Name 4. Spieler
    Webkennung 5. Spieler, Name 6. Spieler

    Wenn ich den erzeugten Link kopiere, lautete es so:

    [COLOR="Blue"]javascript:VierFrames(\'Start_SB.htm\',0,\'KocEbe_anz.htm\',2,\'Aera_SB.htm\',1,\'KocEbe.htm\',3)\'> Koch,%20Eberhard</a></td><td%20class='linksoben'>1962/63%20-%201980/81</td><td%20class='linksoben'>408</td><td%20class='linksoben'>11</td><td%20class='linksoben'>0.03</td></tr><tr><td%20class='linksoben'>Text</td><td%20class='linksoben'>%20%20<a%20href= [/COLOR]

    Dabei sollte der letzte Teil ab [COLOR="Blue"]<td%20class='linksoben'>%20%20<a%20href=[/COLOR] eigentlich am Anfang stehen. Hm?

    Wenn ich den Java-Script Teil rausnehme, funktioniert es, dann habe ich aber keine Links. Irgendwo muss da eine Syntaxfehler sein. Habe ich was mit diesen Maskierungen \ falsch gemacht? Könnt ihr da mal draufgucken? ICh versuch's schon seit zwei Abenden immer mal wieder. Ich hoffe, das reicht an Information.

    Viele Grüße un Danke schonmal
    Linksaussen_11

  • #2
    Hallo,

    hast du mal nachgesehen, ob das Ergebnis der Abfrage überhaupt korrekt ist ([FONT="Courier New"]print_r($data)[/FONT])?

    Warum wird die Spalte Webkennung zweimal unter verschiedenen Aliasen abgerufen? Warum hast du den anderen Ausdrücken keine Aliase gegeben, dann hättest du beim Abrufen sinnvollere Spaltennamen und musst nicht sowas wie [FONT="Courier New"]$data["substr(max(SaisonNr+1),3)"][/FONT] schreiben.

    Theta-Style Joins sind übrigens schlecht lesbar. Wenn du dir selbst einen Gefallen tun willst, steig besser auf die ANSI-Join-Syntax um.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo

      (print_r($data)) liefert tatsächlich nur jeden 2. Datensatz.

      Die Spalte Webkennung wird zweimal verwendet, weil ich über Java-Skript
      eine Brotkrumennavigation anwende.
      Das sieht dann so aus und soll auch über den PHP-Code erzeugt werden:
      [COLOR="Blue"]<a href="javascript:VierFrames('Start_SB.htm',0,'BelDie_anz.htm',2,'Aera_SB.htm',1,'BelDie.htm',3)">[/COLOR]
      In Java-Skript muss auch der Fehler liegen, weil es ja ohne geht.
      Die Spalten habe ich nun mit Aliasen versehen. Das funktioniert auch noch.

      Wenn ich aber mit der ANSI-Join-Syntax arbeite, erhalte ich kein Ergebnis.
      Hier ist auch wieder irgendwo ein Fehler drin. Ist ja auch ein bißchen fehleranfälliger als die where-Klausel.

      [COLOR="Blue"]
      mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in %% on line 78 [/COLOR]

      PHP-Code:
      SELECT
          
      'Text'
          
      ,Webkennung AS Webkennung_Brotkrumenanzeige
          
      ,Webkennung AS Webkennung_Seite
          
      ,Name
          
      ,Vorname
          
      ,min(SaisonNr) AS ErsteSaison1Serie
          
      ,substr(min(SaisonNr+1),3) AS ErsteSaison2Serie
          
      ,max(SaisonNr) AS LetzteSaison1Serie
          
      ,substr(max(SaisonNr+1),3) AS LetzteSaison2Serie
          
      ,count(Einsatz) AS Einsatzanzahl
          
      ,sum(Tor) AS Torsumme
          
      ,round(sum(Tor)/count(Einsatz),2) AS Torquotient
        FROM
          
      .spielerinner join
              
      (.spieleinner join
                  
      (.spieleinner join
                      
      (.saisoninner join
                      
      .aeraon .saison.aeraID=.aera.aeraID)
                   .
      saisonon .spiele.SaisonID=.saison.SaisonID)
              .
      einsaetzeon .spiele.SpieleID=.einsaetze.SpieleID)
           .
      einsaetzeon SpielerID=.einsaetze.SpielerID
        Group by Name
      ,Vorname
        having count
      (Einsatz) > 100
        ORDER BY count
      (Einsatzdescmin(SaisonNr), max(SaisonNrdesc 
      Viele Grüße
      Linksaussen_11

      Kommentar


      • #4
        Zitat von Linksaussen_11 Beitrag anzeigen
        Die Spalte Webkennung wird zweimal verwendet, weil ich über Java-Skript
        eine Brotkrumennavigation anwende.
        Trotzdem ist das sinnlos, denn es hindert dich ja nichts daran, für die breadcrumbs zweimal [FONT="Courier New"]$data["Webkennung"][/FONT] zu verwenden, aber egal.

        Zitat von Linksaussen_11 Beitrag anzeigen
        Wenn ich aber mit der ANSI-Join-Syntax arbeite, erhalte ich kein Ergebnis.
        Hier ist auch wieder irgendwo ein Fehler drin. Ist ja auch ein bißchen fehleranfälliger als die where-Klausel.
        Eigentlich sogar weniger, du machst es dir aber durch die überflüssige Klammerung unnötig schwer. Ein fiktives Beispiel, wie es aussehen sollte:

        Code:
        select
        	person.id as person_id,
        	phone.id as phone_id,
        	country.id as country_id,
        	person.first_name,
        	person.last_name,
        	country.iso_code as country,
        	country.phone_code as country_code,
        	phone.area_code,
        	phone.number,
        	phone.extension
        from person
        join person_x_phone on person_x_phone.person_id = person.id
        join phone on phone.id = person_x_phone.phone_id
        join country on country.id = phone.country_id
        where country.code = 'DE'
        	and phone.area_code = 30
        Wie man sehen kann, ist sofort erkennbar, welche Tabellen über welche Fremdschlüssel miteinander verbunden sind und das ganz ohne Klammerchaos. In der Praxis würde man die Tabellen selbst noch aliasen, um Tipparbeit zu sparen und die Übersichtlichkeit zu erhöhen.
        Zuletzt geändert von AmicaNoctis; 31.08.2011, 23:24.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Hallo,

          so der Code tut's jetzt. Der Vollständigkeit halber:
          PHP-Code:
            $sql mysql_query(
            
          "SELECT
              'Text'
              ,Webkennung
              ,Name
              ,Vorname
              ,min(SaisonNr) AS ErsteSaison1Serie
              ,substr(min(SaisonNr+1),3) AS ErsteSaison2Serie
              ,max(SaisonNr) AS LetzteSaison1Serie
              ,substr(max(SaisonNr+1),3) AS LetzteSaison2Serie
              ,count(Einsatz) AS Einsatzanzahl
              ,sum(Tor) AS Torsumme
              ,round(sum(Tor)/count(Einsatz),2) AS Torquotient
            FROM spieler
               inner join einsaetze on einsaetze.SpielerID=spieler.SpielerID
               inner join spiele on spiele.SpieleID=einsaetze.SpieleID
               inner join saison on saison.SaisonID=spiele.SaisonID
               inner join aera on aera.aeraID=saison.aeraID
            Group by Name,Vorname
            having count(Einsatz) > 100
            ORDER BY count(Einsatz) desc, min(SaisonNr), max(SaisonNr) desc"
          ); 
          Aber das eigentliche Problem ist weiterhin vorhanden. Es wird immer nur die Webkennung des 1. Spielers und der Name des 2. Spielers, die Webkennung des 3. Spielers und der Name des 4. Spielers usw. angezeigt.

          Wenn ich das Array mit
          PHP-Code:
          print_r($data); 
          tritt der Fehler auch schon auf. Der Fehler muss irgendwo in diesem unübersichtlichen Java-Skript Teil liegen. Vielleicht geht das auch gar nicht.

          Viele Grüße
          Linksaussen_11

          Kommentar


          • #6
            Zitat von Linksaussen_11 Beitrag anzeigen
            Wenn ich das Array mit
            PHP-Code:
            print_r($data); 
            tritt der Fehler auch schon auf. Der Fehler muss irgendwo in diesem unübersichtlichen Java-Skript Teil liegen.
            Findest du nicht, dass diese beiden Sätze sich widersprechen? Wie soll JS es richtig machen, wenn es schon falsche Daten vom Server bekommt?

            Als erstes würde ich an deiner Stelle in die Datenbank schauen, ob die Datensätze korrekt sind. Wenn ja, liegt es immer noch an deiner Abfrage. Da die Spaltenreferenzen nicht eindeutig referenziert sind, kann ich auch nicht erkennen, zu welcher Tabelle die jeweils gehören und dir damit keine genaueren Tipps geben.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Finde ich nicht.
              Es ist zwar richtig, dass es unlogisch erscheint, aber wenn ich den unübersichtlichen Java-Skript-Teil rausnehme, dann ist das Ergebnis richtig.

              Dadurch sind ja auch die Datensätze, die aus der Datenbank kommen, korrekt.

              Ich poste mal das jetzige SQL mit den Referenzierungen auf die Tabellen.
              Die Tabelle Aera konnte ich sogar rausnehmen. Die war überflüssig.

              PHP-Code:
              SELECT
                  
              'Text'
                  
              ,spieler.Webkennung
                  
              ,spieler.Name
                  
              ,spieler.Vorname
                  
              ,min(saison.SaisonNr) AS ErsteSaison1Serie
                  
              ,substr(min(saison.SaisonNr+1),3) AS ErsteSaison2Serie
                  
              ,max(saison.SaisonNr) AS LetzteSaison1Serie
                  
              ,substr(max(saison.SaisonNr+1),3) AS LetzteSaison2Serie
                  
              ,count(einsaetze.Einsatz) AS Einsatzanzahl
                  
              ,sum(einsaetze.Tor) AS Torsumme
                  
              ,round(sum(einsaetze.Tor)/count(einsaetze.Einsatz),2) AS Torquotient
                FROM spieler
                   inner join einsaetze on einsaetze
              .SpielerID=spieler.SpielerID
                   inner join spiele on spiele
              .SpieleID=einsaetze.SpieleID
                   inner join saison on saison
              .SaisonID=spiele.SaisonID
                Group by spieler
              .Name,spieler.Vorname
                having count
              (einsaetze.Einsatz) > 100
                ORDER BY count
              (einsaetze.Einsatzdescmin(saison.SaisonNr), max(saison.SaisonNrdesc 

              Kommentar


              • #8
                Wenn du dieses Statement jetzt in PHPMyAdmin oder auf der mysql-Konsole ausführst, bekommst du dann ein korrektes oder ein fehlerhaftes Ergebnis?

                Das einzige, was durch das JS verursacht werden könnte, sind Race Conditions beim gleichzeitigen Laden der Frames. Ob das der Fall sein kann, lässt sich aber anhand des gegebenen Codes nicht sagen und bis jetzt halte ich es erstmal für unwahrscheinlich, wenn auch nicht auszuschließen.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Ja,
                  dann erhalte ich ein richtiges Ergebnis gegen die MySQL-Datenbank.
                  Das Ergenis sieht dann so aus und so erwarte ich es auch:

                  [COLOR="Blue"]Nr. Spieler Ära Einsätze Tore Torquotient
                  Text KocEbe K*** E*** 1962 63 1980 81 408 11 0.03
                  Text BelDie B*** D*** 1976 77 1991 92 361 51 0.14
                  Text KelHan K*** H* 1971 72 1984 85 317 16 0.05
                  Text HenKay H*** K* 1997 98 2010 11 291 100[/COLOR]

                  Man beachte den Unterschied zu unten. Dort kamen nur BelDie und HenKay an.

                  Kommentar


                  • #10
                    Dann zeig mal die Stelle her, wo $data zusammengebaut wird, denn du sagtest ja, dass print_r($data) dann bereits ein falsches Ergebnis liefert.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Quasi wie ganz oben.
                      Nach der Zeile, die mit Order by beginnt geht es hier weiter.


                      PHP-Code:
                         while ($data mysql_fetch_assoc($sql))
                                
                      // daten einer spalte werden in dem Array $data gespeichert

                        
                      {
                              echo 
                      "<tr>";
                              echo 
                      "<td class='linksoben'>".Text."</td>";
                              echo 
                      "<td class='linksoben'>  <a href=\"javascript:VierFrames(\'Start_SB.htm\',0,\'"
                                                           
                      .$data["Webkennung"].
                                                            
                      "_anz.htm\',2,\'Aera_SB.htm\',1,\'"
                                                           
                      .$data["Webkennung"].
                                                            
                      ".htm\',3)\'>"
                                                           
                      .$data["Name"].", ".$data["Vorname"]."</a></td>" ;
                              echo 
                      "<td class='linksoben'>".$data["ErsteSaison1Serie"]. "/"
                                                           
                      .$data["ErsteSaison2Serie"]. " - "
                                                           
                      .$data["LetzteSaison1Serie"]. "/"
                                                           
                      .$data["LetzteSaison2Serie"]."</td>" ;
                              echo 
                      "<td class='linksoben'>".$data["Einsatzanzahl"]."</td>";
                              echo 
                      "<td class='linksoben'>".$data["Torsumme"]."</td>";
                              echo 
                      "<td class='linksoben'>".$data["Torquotient"]."</td>";
                              echo 
                      "</tr>";

                        
                      print_r($data);
                         }

                        echo 
                      mysql_error() ;

                      ?> 
                      Ich merk schon, dass wird eine längere Sitzung. Danke nochmal, dass du dich da so einbringst.

                      Kommentar


                      • #12
                        Okay, dann meinte ich das anders, ich dachte, $data enthält alle Rows. Und hier kommen die print_r-Ausgaben in der richtigen Reihenfolge (vor der Tabelle) und die Datensätze in der Tabelle sind falsch oder wie war das jetzt nochmal?

                        Hast du irgendwelche JavaScripts eingebunden, die nach dem Laden die Tabelle ggf. automatisch sortieren oder anderweitig auf dem DOM rummanipulieren? Oder kurz, ist die tabellarische Ausgabe korrekt, wenn du alle Scripts ausschaltest? Ich tippe mal auf ja, aber mal sehen…
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          Ja, $data enthält alle rows, und sie kommen in der print_r-Ausgabe in der richtgen Reihenfolge an... solange das Java-Script nicht dazwischenfunkt.
                          Nehme ich das Java-Script rein, ist auch die Ausgabe von print_r falsch.
                          Dementsprechend sind die Werte in der HTML-Tabelle falsch.

                          Es sind auch keine Java-Script-Elemente drin, die alles zerschießen. DOM musste ich erstmal googeln. Ich schicke die ganze Seite mal als Anhang. Die Datenbank läuft allerdings im Augenblick nur lokal so dass man sich den Rest leider denken muss.

                          Viele Grüße
                          Angehängte Dateien

                          Kommentar


                          • #14
                            Zitat von Linksaussen_11 Beitrag anzeigen
                            Nehme ich das Java-Script rein, ist auch die Ausgabe von print_r falsch.
                            Das kann, ohne dass JavaScript irgendwelche Werte an den Server schickt, die dort ein verändertes Verhalten bewirken, eigentlich gar nicht sein.

                            Das sieht dann so aus und soll auch über den PHP-Code erzeugt werden:
                            <a href="javascript:VierFrames('Start_SB.htm',0,'BelDie_anz.htm',2,'Aera_SB.htm',1,'BelDie.htm',3)">
                            Und, sieht es auch tatsächlich so aus …?

                            Hast du den HTML mal validiert? Falls noch nicht, mach das bitte erst mal.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Und, sieht es auch tatsächlich so aus …?
                              Nein, das ist das Ergebnis:

                              [COLOR="Blue"]javascript:VierFrames(\'Start_SB.htm\',0,\'KocEbe_anz.htm\',2,\'Aera_SB.htm\',1,\'KocEbe.htm\',3)\'> K***,%20E***</a></td><td%20class='linksoben'>1962/63%20-%201980/81</td><td%20class='linksoben'>408</td><td%20class='linksoben'>11</td><td%20class='linksoben'>0.03</td></tr>
                              <tr><td%20class='linksoben'>Text</td><td%20class='linksoben'>%20%20<a%20href= [/COLOR]
                              , wobei der unterre Tel eigentlich nach vorne muss.
                              (siehe Post vom 31-08-2011 01:06)

                              Mit Firebug ist das Ergebnis dieses hier:
                              [COLOR="Blue"]<a javascript:vierframes(\'start_sb.htm\',0,\'beldie_anz.htm\',2,\'aera_sb.htm\',1,\'beldie.htm\',3)\'= "" href="javascript:VierFrames(\'Start_SB.htm\',0,\'KocEbe_anz.htm\',2,\'Aera_SB.htm\',1,\'KocEbe.htm\' ,3)\'>K***, E***</a></td><td class='linksoben'>1962/63 - 1980/81</td><td class='linksoben'>408</td><td class='linksoben'>11</td><td class='linksoben'>0.03</td></tr>
                              <tr><td class='linksoben'>Text</td><td class='linksoben'> <a href=">B***, D***</a>[/COLOR]

                              Hier sieht man auch schon, das was nicht stimmt - und zwar ab dem = Zeichen. Zunächst wird der Java-Script Code für den 2. Spieler, darin dann der Java-Script Code für den 1. Spieler mit dem korrekten Namen und Werten hinterher angezeigt, und ab <tr> wird der Name des 1. Spielers angezeigt. Fett müsste verschwinden, kursiv nach vorne gestellt werden. Vielleicht wird ein geschütztes Zeichen benutzt?

                              Hast du den HTML mal validiert? Falls noch nicht, mach das bitte erst mal.
                              Ich habe ein paar Fehler entdeckt. Im Phase5 Editor wird jetzt nichts mehr angemeckert. Ein anderer Validator meckert den Code Stück für Stück an, so dass am Ende gar nichts mehr übrig bleiben würde.

                              Kommentar

                              Lädt...
                              X