| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

31-08-2011, 01:06
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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
|

31-08-2011, 02:13
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

31-08-2011, 22:35
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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
.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
|

31-08-2011, 23:19
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Linksaussen_11
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
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (31-08-2011 um 23:24 Uhr)
|

01-09-2011, 23:34
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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
|

02-09-2011, 04:14
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Linksaussen_11
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

02-09-2011, 23:48
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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.Einsatz) desc, min(saison.SaisonNr), max(saison.SaisonNr) desc
|

03-09-2011, 01:42
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

03-09-2011, 02:05
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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.
|

03-09-2011, 02:24
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Dann zeig mal die Stelle her, wo $data zusammengebaut wird, denn du sagtest ja, dass print_r($data) dann bereits ein falsches Ergebnis liefert.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

04-09-2011, 01:35
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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.
|

04-09-2011, 18:20
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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…
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

04-09-2011, 19:38
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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
|

04-09-2011, 19:44
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Linksaussen_11
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.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

05-09-2011, 18:40
|
|
Linksaussen_11
Registrierter Benutzer
|
|
Registriert seit: Jul 2005
Beiträge: 22
|
|
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.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|