 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
26.09.2007, 23:45
|
#1
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Link in Variable "schreiben"
Guten Abend,
ich bräuchte eure Hilfe bei folgender Sache. Eine Deutschlandkarte wurde von mir in mehrere Links (also die Bundesländer) unterteilt. Nun will ich, dass auf einer nachfolgenden Suchergebnisseite alle Datenbanktreffer, die zu einem Bundesland gehören, bei Klick auf den Link angezeigt werden.
Also WHERE bundesland LIKE Variable
Wie schaffe ich es, dass in meiner Variable nun automatisch das richtige Bundesland eingetragen wird, wenn der User bspw. auf die Fläche "Saarland" klickt?
Diese Fläche habe ich übrigens als sog. Hotspot mittels DW erstellt.
Vielen Dank für eure Antworten.
|
|
|
27.09.2007, 17:22
|
#2
|
|
TP-Supporter
Registriert seit: Sep 2002
Ort: Zürich
|
Hallo Marki
Eigentlich ganz einfach in dem du an den Link des Hotspots einfach noch eine Variable hinhängst und die nachher auswertest.
So in dem Stil
PHP-Code:
<a href="verarbeiten.php?bundesland=saarland">
<a href="verarbeiten.php?bundesland=bayern">
usw.
Auf der Seite verarbeiten kannst du ja dann die Variable Bundesland mittels $_GET['bundesland'] holen und dementsprechend dein SQL Statement generieren.
Etwa so:
PHP-Code:
$bundesland = $_GET['bundesland'];
$sql = "SELECT spalte1, spalte2 FROM Tabelle1 WHERE bundesland ="'.$bundesland.'"";
Ist doch ganz isi
Gruss: Spin
|
|
|
27.09.2007, 18:32
|
#3
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Vielen Dank Spin, jetzt funktioniert es!!!
|
|
|
28.09.2007, 09:30
|
#4
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Um MySQL-Injection zu verhindern, würde ich Zahlenwerte übergeben. Diese lassen sich leicht auf Manipulation überprüfen. So kann man wirkungsvoll Manipulationsversuchen vorbeugen.
Beispiel:
PHP-Code:
<a href="verarbeiten.php?bundesland=0">
<a href="verarbeiten.php?bundesland=1">
...
Auswertung mit Validierung:
PHP-Code:
$bundeslaender=array('saarland','bayern','...'); // Vorgabe erlaubter Werte
$bundesland = isset($_GET['bundesland']) ? intval($_GET['bundesland']):0; // durch intval wird zwangsweise eine Zahl aus der uebergebenen Variablen gemacht. Textmanipulationen bleiben dadurch ohne Wirkung
if (isset($bundeslaender[$bundesland])) // Pruefen -> gibt es den Index? Wenn nicht hat einer rumgepfuscht
$sql = "SELECT spalte1, spalte2 FROM Tabelle1 WHERE bundesland ="'.$bundeslaender[$bundesland].'"";
else die("Du gemeiner Hacker! Lass das Manipulieren der Variablen sein oder ich sags Deiner Mutti!");
|
|
|
28.09.2007, 11:28
|
#5
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Danke für den Tip, die Abfrage scheint auch schon richtig zu sein, allerdings habe ich noch eine Verständnisfrage zu <a href= :
Gibst du den Links aufsteigende Zahlen (von 0-15 hier) und ordnest jedem Bundesland dann eine Zahl zu oder habe ich das jetzt falsch verstanden?
Wenn ich es nämlich so mache, müsste ja im Saarland-Link "0" stehen
(dies funktioniert allerdings nicht, dann werden keine Treffer angezeigt).
|
|
|
28.09.2007, 12:18
|
#6
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Die Nummer entspricht dem Index des Arrays - also wie Du richtig vermutest, entspricht 0 dann "saarland".
Zum Test gebe ich Dir das Array einmal auf dem Bildschirm aus:
PHP-Code:
$bundeslaender=array('saarland','bayern','...'); // Vorgabe erlaubter Werte
print_r($bundeslaender);
$bundesland = isset($_GET['bundesland']) ? intval($_GET['bundesland']):0; // durch intval wird zwangsweise eine Zahl aus der uebergebenen Variablen gemacht. Textmanipulationen bleiben dadurch ohne Wirkung
// Pruefen -> gibt es den Index? Wenn nicht hat einer rumgepfuscht
if (isset($bundeslaender[$bundesland]))
{
$sql="SELECT spalte1, spalte2 FROM Tabelle1 WHERE bundesland ='".$bundeslaender[$bundesland]."'";
}
else die("Du gemeiner Hacker! Lass das Manipulieren der Variablen sein oder ich sags Deiner Mutti!");
Beim Querystring hatte ich gerade Hochkommas und Gänsefüßchen vertauscht. Jetzt passt es.
Generell ist es aber kein gutes Datenbankdesign wenn in der Spalte für jeden Datensatz "saarland" als Text in der DB steht. Das verbraucht unnötig Speicherplatz in der DB und macht die Abfragen zusätzlich langsamer (ein Textvergleich ist immer wesentlich langsamer, als ein Vergleich von Ganzzahlen). Stell Dir vor, Du hast 2000 Datensätze für das Saarland und in jedem dieser Datensätze steht dieser String "saarland". Das sind 8 Bytes pro Eintrag mal 2000 Datensätze=16.000 Bytes Speicherplatzverbrauch in der Datenbanktabelle.
Wenn Du auch in der DB Zahlen speicherst (Typ Tinyint (1) ), dann verbraucht die gleiche Information nur 2000 Bytes. Das entspricht einer Ersparnis von 14.000 Bytes oder 87,5 Prozent. Mit "Mecklenburg-Vorpommern" darfst Du die Ersparnis jetzt selbst ausrechnen.
Das mag zunächst kleinlich klingen, wirkt sich aber bei größeren Projekten erheblich auf die Performance und den Speicherplatzbedarf aus. Man sollte da von Anfang an drauf achten.
Das nur so als Denkanstoß.
|
|
|
28.09.2007, 13:35
|
#7
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Das habe ich jetzt geändert, leider werden aber immer noch keine Ergebnisse angezeigt.
Sicherlich habe ich deinen Codeteil nicht richtig eingesetzt.
Hier mal mein Versuch:
PHP-Code:
mysql_select_db($database_Studios, $Studios);
$bundeslaender=array('bayern','hes','badenw','berl','nieder');
$bundesland = isset($_GET['bundesland']) ? intval($_GET['bundesland']):0;
$query_Abfrage_studios = "SELECT id, name, plz, ort, freigeben FROM tbl_studios WHERE bundesland LIKE '".$bundeslaender[$bundesland]."' ORDER BY studioname ASC";
$Abfrage_studios = mysql_query($query_Abfrage_studios, $Studios) or die(mysql_error());
$row_Abfrage_studios = mysql_fetch_assoc($Abfrage_studios);
$totalRows_Abfrage_studios = mysql_num_rows($Abfrage_studios);
Wie du siehst habe ich bei den Bundesländern Kürzel benutzt, das dürfte aber sicherlich nicht der Grund sein...
Wäre super wenn du mir sagen könntest wo der Fehler liegt!
|
|
|
28.09.2007, 19:01
|
#8
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Warum bei Dir jetzt keine Ergebnisse angezeigt werden kann ich nur vermuten, da ich weder Deine MySQl-Tabellen besitze, noch deren genauen Aufbau kenne.
Lass Dir den Query einfach mal ausgeben und gebe ihn händisch zur Überprüfung im MySQLDumper im SQLBrowser oder in PHPMyAdmin ein. Klappt der Query dort? Ich habe z.B. mal den Spaltennamen "name" in Backticks gesetzt, da dies in höheren MySQL-Versionen ein reserviertes Wort ist.
Warum benutzt Du LIKE anstatt =?
Wenn Du den erwarteten Wert genau kennst, benötigst Du das langsamere LIKE nicht. LIKE macht nur in Verbindung mit Wildcards Sinn wenn man Teile von Inhalten finden muss.
PHP-Code:
mysql_select_db($database_Studios, $Studios);
$bundeslaender=array('bayern','hes','badenw','berl','nieder');
$bundesland = isset($_GET['bundesland']) ? intval($_GET['bundesland']):0;
$query_Abfrage_studios = "SELECT id, `name`, plz, ort, freigeben FROM tbl_studios WHERE bundesland='".$bundeslaender[$bundesland]."' ORDER BY studioname ASC";
echo "<br>Query: <br>".$query_Abfrage_studios."<br>";
$Abfrage_studios = mysql_query($query_Abfrage_studios, $Studios) or die(mysql_error());
$row_Abfrage_studios = mysql_fetch_assoc($Abfrage_studios);
$totalRows_Abfrage_studios = mysql_num_rows($Abfrage_studios);
|
|
|
28.09.2007, 19:14
|
#9
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Jetzt habe ich mal den Code so von dir übernommen.
Ausgegeben hat er mir folgendes:
Code:
<br>Query: <br>SELECT id, `name`, plz, ort, freigeben FROM tbl_studios WHERE bundesland='bayern' ORDER BY studioname ASC<br>
Obwohl er bayern erkennt (und im Feld bundesland bayern drinsteht) gibt er mir keine Ergebnisse/Treffer aus.
Das Echo wird ganz normal so ausgegeben:
PHP-Code:
<?php echo $row_Abfrage_studios['name']; ?>
Ich weiß wirklich nicht weiter...
|
|
|
28.09.2007, 20:11
|
#10
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Steht denn "bayern" auch exakt so in der Datenbanktablle?
Groß-/ Kleinschreibung beachtet?
|
|
|
28.09.2007, 20:52
|
#11
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
Genau so steht es drin.
Dann kann es doch nur an einem falschen Echo liegen, da ja der Query eigentlich besagt, dass sonst alles funktioniert...?
|
|
|
28.09.2007, 22:02
|
#12
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Ach Markus, sei doch nicht so unbeholfen. Du musst als Programmierer schon in der Lage sein ein Problem einzugrenzen und durch Überprüfung feststellen können an welcher Stelle es schief läuft.
Ich schrieb weiter oben z.B., dass Du den Query einmal in MySQLDumper oder PhpMyAdmin ausführen sollst, um zu überprüfen, ob dieser überhaupt korrekt ist und Ergebnisdatensätze liefert. Falls ja, kannst Du das als Fehlerquelle ausschließen.
Dann wäre im nächsten Schritt zu überprüfen, was genau in $row_Abfrage_studios drinsteht. Da es sich um ein assoziatives Array handelt, mach eine Testausgabe mittels
PHP-Code:
print_r($row_Abfrage_studios);
so wie ich es weiter oben auch gemacht habe.
Du musst die Werkzeuge nur richtig einsetzen, um dem Fehler auf die Spur zu kommen. Also Gehirnzellen frisch geputzt und jetzt selbst ran ans Werk. 
|
|
|
28.09.2007, 23:48
|
#13
|
|
TP-Senior
Registriert seit: Jul 2007
Ort: Bobingen
|
So jetzt läuft es, ich hatte in meiner Suchergebnisseite noch ein 2. echo stehen, also ein wahnsinnig dummer Fehler, der nur einem Anfänger passieren kann.
Trotzdem vielen, vielen Dank für deine engagierte Hilfe und die nützlichen Tips.
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 14:56 Uhr.
|
 |