php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Konkretes Problem beim Einbinden von Java-Script in PHP


 
Linksaussen_11
31-08-2011, 01:06 
 
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
$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


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
.spieler. inner join
(.spiele. inner join
(.spiele. inner join
(.saison. inner join
.aera. on .saison.aeraID=.aera.aeraID)
.saison. on .spiele.SaisonID=.saison.SaisonID)
.einsaetze. on .spiele.SpieleID=.einsaetze.SpieleID)
.einsaetze. on SpielerID=.einsaetze.SpielerID
Group by Name,Vorname
having count(Einsatz) > 100
ORDER BY count(Einsatz) desc, min(SaisonNr), max(SaisonNr) desc

Viele Grüße
Linksaussen_11

 
AmicaNoctis
31-08-2011, 23:19 
 
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.

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:


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:

$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 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 
 
Wenn ich das Array mit 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.


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.Einsatz) desc, min(saison.SaisonNr), max(saison.SaisonNr) desc

 
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.


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 
 
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 
 
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.

 
Linksaussen_11
05-09-2011, 18:40 
 
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?

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.

 
ApoY2k
05-09-2011, 18:50 
 
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.
Das solltest du dir vielleicht zu Herzen nehmen? Invalider HTML Code kann dein Javascript auch ziemlich ins Schwitzen bringen.

Erst wenn The W3C Markup Validation Service (http://validator.w3.org/) keine Fehler mehr ausspuckt, ist es guter Code mit dem man arbeiten kann.

 
Linksaussen_11
06-09-2011, 00:17 
 
So ganz valide bekomme ich den Code nicht.
einzig noch übrig gebliebener Fehlertyp ist der:

Line 84, Column 73: character data is not allowed here
.$data["LetzteSaison2Serie"]."</td>";

Dabei ist mir aufgefallen, dass der Codeschnipsel
.$data["LetzteSaison1Serie"]. "/"
als korrekt angesehen wird, dieser Codeschnipsel aber nicht.
.$data["LetzteSaison2Serie"]."</td>";

Es muss an dem </td> tag liegen. Ich hab's wahrscheinlich nicht richtig maskiert, oder so.

 
AmicaNoctis
06-09-2011, 00:22 
 
Du darfst nicht die ungeparsten PHP-Dateien validieren, sondern das, was am Ende im Browser ankommt ;)

 
Linksaussen_11
06-09-2011, 01:52 
 
Hallo,

das Syntax problem ist jetzt erstmal gelöst. Er tut es zwar immer noch nicht so ganz, aber immerhin wird jetzt der richtige Link generiert.

Hier lag der Fehler:

".htm\',3)\">"
statt
".htm\',3)\'>"

Gute Nacht

 
ApoY2k
06-09-2011, 07:16 
 
Solche Fehler würde dir übrigens eine gescheite IDE direkt anzeigen.

 
Linksaussen_11
06-09-2011, 12:50 
 
Hallo,

was wäre denn zum Beispiel eine gescheite IDE?
Ich merk schon, mit meinem gefürchteten PHP-Halbwissen wird's schwierig, die Datenbank anzubinden.

Danke euch erstmal

Viele Grüße

 
ApoY2k
06-09-2011, 12:53 
 
Alles, außer einem normalen Texteditor.

Google ist dein Freund (http://www.google.com/search?q=php+ide)

- -

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