PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Konkretes Problem beim Einbinden von Java-Script in PHP (https://www.php-resource.de/forum/php-developer-forum/102123-konkretes-problem-beim-einbinden-von-java-script-in-php.html)

Linksaussen_11 31-08-2011 01:06

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>";
  }
  
?>

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


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:

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=

Dabei sollte der letzte Teil ab <td%20class='linksoben'>%20%20<a%20href= 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

AmicaNoctis 31-08-2011 02:13

Hallo,

hast du mal nachgesehen, ob das Ergebnis der Abfrage überhaupt korrekt ist (print_r($data))?

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 $data["substr(max(SaisonNr+1),3)"] 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

Linksaussen_11 31-08-2011 22:35

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:
<a href="javascript:VierFrames('Start_SB.htm',0,'BelDie_anz.htm',2,'Aera_SB.htm',1,'BelDie.htm',3)">
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.


mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in %% on line 78


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

AmicaNoctis 31-08-2011 23:19

Zitat:

Zitat von Linksaussen_11 (Beitrag 656362)
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 $data["Webkennung"] zu verwenden, aber egal.

Zitat:

Zitat von Linksaussen_11 (Beitrag 656362)
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.

Linksaussen_11 01-09-2011 23:34

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

AmicaNoctis 02-09-2011 04:14

Zitat:

Zitat von Linksaussen_11 (Beitrag 656382)
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.

Linksaussen_11 02-09-2011 23:48

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 


AmicaNoctis 03-09-2011 01:42

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.

Linksaussen_11 03-09-2011 02:05

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

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


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

AmicaNoctis 03-09-2011 02:24

Dann zeig mal die Stelle her, wo $data zusammengebaut wird, denn du sagtest ja, dass print_r($data) dann bereits ein falsches Ergebnis liefert.

Linksaussen_11 04-09-2011 01:35

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.

AmicaNoctis 04-09-2011 18:20

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…

Linksaussen_11 04-09-2011 19:38

Liste der Anhänge anzeigen (Anzahl: 1)
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

wahsaga 04-09-2011 19:44

Zitat:

Zitat von Linksaussen_11 (Beitrag 656439)
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.

Zitat:

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.

Linksaussen_11 05-09-2011 18:40

Zitat:

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

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=

, wobei der unterre Tel eigentlich nach vorne muss.
(siehe Post vom 31-08-2011 01:06)

Mit Firebug ist das Ergebnis dieses hier:
<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>


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?

Zitat:

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:38 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG