du meinst doch sicher:
Variablen Wert auf "egal" setzen
-
-
Oder so.
-
sorry, aber ich steck einfach fest und komm nicht weiter
Mittlerweile habe ich das Gefühl, dass es vielleicht mal wieder an meinem mangelnden Verständnis liegt....
PHP$conditions = array(); if (! empty($_POST['Bundesland'])) $conditions[] = "bundesland='" . mysql_real_escape_string($_POST['Bundesland']) . "'"; if (count($conditions)) $query .= " where " . implode(" AND ", $conditions);
Diese Anweisung bedeutet in meinem Verständnis folgendes:
Falls das select Feld, dem ich den Namen "Bundesland" gegeben habe nicht leer ist, wird die Variable conditions um den entsprechenden Eintrag "Bundesland" erweitert und es wird dann geschaut, ob in meiner MySQL Tabelle in der Spalte "bundesland" ein entsprechender Eintrag zu finden ist.
Mein Problem ist nämlich zur Zeit, dass mir immer der komplette Inhalt meiner Datenbank angezeigt wird, unabhängig davon, was ich in den select-Feldern auswähle.
Mein (gekürzter) Code sieht so aus:
PHP
Alles anzeigen<?php $verbindung = mysql_connect ("HOST", "DB", "****") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch"); mysql_select_db("DB") or die ("Die Datenbank existiert nicht."); $conditions = array(); if (! empty($_POST['Bundesland'])) $conditions[] = "bundesland='" . mysql_real_escape_string($_POST['Bundesland']) . "'"; $query = "Select stadt, bundesland, from jobs"; if (count($conditions)) $query .= " where " . implode(" AND ", $conditions); $result = mysql_query($query) or die ("MySQL-Fehler mit $query:<br>" . mysql_error()); // Vorhandensein eines Ergebnnisses überprüfen $num_rows = mysql_num_rows($result); if ($num_rows == 0) { echo "Zu Ihrer Anfrage wurden keine Ergebnisse gefunden."; } else // Ende der Überprüfung while($row = mysql_fetch_object($result)) { echo "$row->id, $row->stadt, $row->bundesland <br>"; } ?>
übrigens wird mir auch keine id angezeigt... - da ist wohl auch ein Haken drin..
Ich wär also mal wieder dankbar, wenn mich hier jemand einen Schritt weiter bringen könnte
-
Wieso er dir die id nicht anzeigt kann ich dir sagen: Du Selectest die id überhaupt nicht bei deiner Abfrage:
Zu der anderen Frage, es sieht eigentlich für mich alles richtig aus.
Hast du dir deinen Query mal ausgeben lassen? Bekommt er überhaupt die Where-Klausel?Edit sagt: Wo ich meine gepostete Anfrage sehe, fällt mir auch ein Fehler auf.
In deiner Abfrage ist das Komma nach bundesland zuviel. Entweder zeigst du uns nicht den Code mit dem du tatsächlich arbeitest und der dir alle Datensätze zurückgibt, oder du verschweigst uns eine MySQL-Fehlermeldung die dir mit deinem hier geposteten Code ausgeben werden muß und kriegst überhaupt keine Datensätze selected.
Beides trägt nicht dazu bei, dass dir jemand helfen kann.Edit's Mama sagt:
Kann es sein, dass du den Namen im Formular kleinschreibst? PHP ist case-sensitive bei Array-Keys. -
sorry, will hier nichts verschweigen und auch nichts verheimlichen - dachte nur, dass es vielleicht übersichtlicher ist, wenn ich nur einen Ausschnitt poste, da der Rest des Codes mit dem gleichen Muster arbeitet.
Also kurz zum Plan: Wie man an meinem mangelnden Plan sehen kann, bin ich kein Programmierer, sonder arbeite als Mediziner. Das, was ich programmieren kann habe ich mir in meiner Freizeit angeeignet. Aufgrund der sagen wir mal "nicht ganz optimalen Situtation" im Gesundheitswesen haben Kollegen und ich uns nach Alternativen umgesehen und keine Seite gefunden, die diese ordentlich auflistet. Also habe ich meine eingestaubten Kenntnisse wieder ausgegraben und versuche zur Zeit den Rost von diesen abzuschütteln. Die Abfrage dient dazu eine sehr einfach Jobbörse zu erstellen, auf der eben alternative Berufe gefunden werden können.
So viel zur Idee und jetzt der Code (mit eingefügter id in Select) in voller Länge
HTML
Alles anzeigen<form action="jobfinder.php"> <fieldset> <legend>Angaben zur Person</legend> <table> <tr> <td>Fach:</td> <td><select style="width:100%;" name="Fach" size="1"> <option value="">alle</option> <option value="Allgemeinmedizin">Allgemeinmedizin</option> <option value="Anästhesie">Anästhesie</option> <option value="Arbeitsmedizin">Arbeitsmedizin</option> <option value="Augenheilkunde">Augenheilkunde</option> <option value="Chirugie">Chirugie</option> <option value="Dermatologie">Dermatologie</option> <option value="Gynäkologie und Geburtshilfe">Gynäkologie und Geburtshilfe</option> <option value="Hals-Nasen-Ohren Heilkunde">Hals-Nasen-Ohren Heilkunde</option> <option value="Humangenetik">Humangenetik</option> <option value="Hygiene- und Umweltmedizin">Hygiene- und Umweltmedizin</option> <option value="Innere Medizin">Innere Medizin</option> <option value="Kinder- und Jugendpsychatrie">Kinder- und Jugendpsychatrie</option> <option value="Klinische Pharmakologie">Klinische Pharmakologie</option> <option value="Laboratoriumsmedizin">Laboratoriumsmedizin</option> <option value="Mikrobiologie, Virologie und Infektionsepidemiologie">Mikrobiologie, Virologie und Infektionsepidemiologie</option> <option value="Neurochirugie">Neurochirugie</option> <option value="Neurologie">Neurologie</option> <option value="Neuropathologie">Neuropathologie</option> <option value="Nuklearmedizin">Nuklearmedizin</option> <option value="Öffentliches Gesundheitswesen">Öffentliches Gesundheitswesen</option> <option value="Orthopädie">Orthopädie</option> <option value="Pädiatrie">Pädiatrie</option> <option value="Pathologie">Pathologie</option> <option value="Pharmakologie und Toxikologie">Pharmakologie und Toxikologie</option> <option value="Phoniatrie und Pädaudiologie">Phoniatrie und Pädaudiologie</option> <option value="Physikalische und Rehabilitative Medizin">Physikalische und Rehabilitative Medizin</option> <option value="Psychiatrie und Psychotherapie">Psychiatrie und Psychotherapie</option> <option value="Psychosomatische Medizin">Psychosomatische Medizin</option> <option value="Radiologie">Radiologie</option> <option value="Rechtsmedizin">Rechtsmedizin</option> <option value="Strahlentherapie">Strahlentherapie</option> <option value="Transfusionsmedizin">Transfusionsmedizin</option> <option value="Urologie">Urologie</option> </select> </td> </tr> <tr> <td>Qualifikation:</td> <td><select style="width:100%;" name="Qualifikation" size="1"> <option value="">alle</option> <option value="Student / -in">Student / -in</option> <option value="Assistenzarzt / -ärztin">Assistenzarzt / -ärztin</option> <option value="Facharzt / -ärztin">Facharzt / -ärztin</option> <option value="Oberarzt / -ärztin">Oberarzt / -ärztin</option> <option value="Professor / -in">Professor / -in</option> </select> </td> </tr> </table> </fieldset> <fieldset> <legend>Angaben zum gewünschten Job</legend> <table> <tr> <td>Bundesland:</td> <td><select style="width:100%;" name="Bundesland" size="1"> <option value="">alle</option> <optionvalue="Baden-Württemberg">Baden-Württemberg</option> <option value="Bayern">Bayern</option> <option value="Berlin">Berlin</option> <option value="Brandenburg">Brandenburg</option> <option value="Bremen">Bremen</option> <option value="Hamburg">Hamburg</option> <option value="Hessen">Hessen</option> <option value="Mecklenburg-Vorpommern">Mecklenburg-Vorpommern</option> <option value="Niedersachsen">Niedersachsen</option> <option value="Nordrhein-Westfalen">Nordrhein-Westfalen</option> <option value="Rheinland-Pfalz">Rheinland-Pfalz</option> <option value="Saarland">Saarland</option> <option value="Sachsen">Sachsen</option> <option value="Sachsen-Anhalt">Sachsen-Anhalt</option> <option value="Schleswig-Holstein">Schleswig-Holstein</option> <option value="Thüringen">Thüringen</option> </select> </td> </tr> <tr> <td>Gehaltswunsch jährlich (brutto):</td> <td><select style="width:100%;" name="Gehaltswunsch" size="1"> <option value="">alle</option> <option value="50000">ab 50.000 EUR</option> <option value="75000">ab 75.000 EUR</option> <option value="100000">ab 100.000 EUR</option> <option value="150000">ab 150.000 EUR</option> <option value="200000">ab 200.000 EUR</option> </select> </td> </tr> <tr> <td>Branche:</td> <td><select style="width: 100%;" name="Branche" size="1"> <option value="">alle</option> <option value="Beratung">Beratung</option> <option value="Biotechnologie">Biotechnologie</option> <option value="Industrie (Pharma)">Industrie (Pharma)</option> <option value="Industrie (Medizintechnik)">Industrie (Medizintechnik)</option> <option value="Industrie (Sonstiges)">Industrie (Sonstiges)</option> <option value="Management und Verwaltung">Management und Verwaltung</option> <option value="Politik, Institute und Verbände">Politik, Institute und Verbände</option> <option value="Versicherung">Versicherung</option> <option value="Sonstiges">Sonstiges</option> </select> </td> </tr> </table> </fieldset> <input style="margin-top:1em; float:right;" name="send" type="submit" value="Traumjob finden"> </form>
PHP
Alles anzeigen<?php $verbindung = mysql_connect ("localhost", "idadi", "Pu221cat") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch"); mysql_select_db("idadi") or die ("Die Datenbank existiert nicht."); $conditions = array(); if (! empty($_POST['Fach'])) $conditions[] = "fach='" . mysql_real_escape_string($_POST['Fach']) . "'"; if (! empty($_POST['Qualifikation'])) $conditions[] = "qualifikation='" . mysql_real_escape_string($_POST['Qualifikation']) . "'"; if (! empty($_POST['Bundesland'])) $conditions[] = "bundesland='" . mysql_real_escape_string($_POST['Bundesland']) . "'"; if (! empty($_POST['Gehaltswunsch'])) $conditions[] = "gehalt='" . mysql_real_escape_string($_POST['Gehaltswunsch']) . "'"; if (! empty($_POST['Branche'])) $conditions[] = "branche='" . mysql_real_escape_string($_POST['Branche']) . "'"; $query = "Select id, firma, branche, stadt, bundesland, qualifikation, fach, gehalt, kurzbeschreibung, link from jobs"; if (count($conditions)) $query .= " where " . implode(" AND ", $conditions); $result = mysql_query($query) or die ("MySQL-Fehler mit $query:<br>" . mysql_error()); // Vorhandensein eines Ergebnnisses überprüfen $num_rows = mysql_num_rows($result); if ($num_rows == 0) { echo "Zu Ihrer Anfrage wurden keine Ergebnisse gefunden."; } else // Ende der Überprüfung while($row = mysql_fetch_object($result)) { echo "$row->id, $row->stadt, $row->fach, $row->qualifikation, <br>"; } ?>
-
Hm, das sieht eigentlich alles passend aus, das einzige was mir auffällt ist beim select-feld für das Bundesland ein fehlendes Leerzeichen zwischen option und value an einer Stelle. Denke aber mal nicht, dass das daran liegt, wenn es auch bei den anderen Select-Feldern nicht klappt.
HTML<td>Bundesland:</td> <td><select style="width:100%;" name="Bundesland" size="1"> <option value="">alle</option> <optionvalue="Baden-Württemberg">Baden-Württemberg</option>
Kannst du mal bei ein paar Feldern eine Auswahl treffen, dir den SQL-Query der generiert wird ausgeben lassen und hier posten?
-
-
Nein, das hilft leider nicht.
$query meinte ich. Also die Anfrage die du mit mysql_query() an die Datenbank schickst. -
okay, dann bekomme ich
Select id, firma, branche, stadt, bundesland, qualifikation, fach, gehalt, kurzbeschreibung, link from jobs
das scheintwohl nicht ganz richtig zu sein... aber ich finde den Fehler trotzdem nicht
-
<form action="jobfinder.php" method="POST">
Und noch ein Tipp: deine ganzen Select-Felder bzw. deren Werte solltes du ebenfalls in der DB stehen haben. Es tut nämlich nicht Not, dass du in deiner Tabelle jobs alle Daten wie Fach, Qualifikation, etc. in Klartext stehen hast, du verschwendest damit unnötig Resourcen -
es klappt
Da den Fehler zu suchen hätte bei mir wohl noch ewig gedauert...
Vielen Dank und bis zum nächsten Stolperstein
EDIT: Sorry, deinen Tipp verstehe ich nicht. Meinst du ich soll beispielsweise die Bundesländer alle durchnummerieren und dann statt Baden-Würtemberg z.B. eine 1 in die Tabelle eintragen?
-
Hab doch noch ne Frage
Angenommen, jemand trifft eine Auswahl, die keine oder sehr viele Ergebnisse liefert und möchte dann seine Suche verfeinern. Wenn ich dann auf der "Ergebnisseite" einen "zurück" oder "Suche verfeinern" Link anbiete, wie kann ich dann das Formuar in der Weise darstellen, dass die soeben abgefragten Daten noch in den select-Feldern stehen?
Ich beschäftige mich gerne selbst mit der Theorie - will ja wissen wie meine Seite funktioniert. Ich hätte nur gern einen Tipp wonach ich schauen muss.
Sind Sessions da das richtige Gebiet oder gäbe es für so etwas bessere Lösungen?Danke
-
Sind Sessions da das richtige Gebiet
Yeap, schon mal richtig erkannt -
und verrätst du mir auch noch was du mit deinem Tipp meintest die Select-Felder in die DB zu integrieren bzw. wie ich das bewerkstelligen kann?
Meinst du, dass ich z.B. Baden-Würtemberg die 1 zuordne und dann statt des Textes nur die Zahl in die DB eintrage? Wie schaff ich es dann aber, dass bei der Ausgabe wieder der Text und nicht die Zahl steht?
Danke
-
okay, also ich habe eine Lösung gefunden, die auch funktioniert
Wollte nur einmal fragen, ob die Übernahme der ausgewählten Werte in das Formular auch einfacher zu bewerkstelligen werde.
Also ich habe eine identische Formulardatei (logischerweise mit anderem Namen) angelegt.
In die Auswertung der ersten Abfrage habe ich dann folgendes geschrieben:
PHPsession_start(); $_SESSION['Fach'] = "{$_POST['Fach']}"; $_SESSION['Qualifikation'] = "{$_POST['Qualifikation']}"; $_SESSION['Bundesland'] = "{$_POST['Bundesland']}"; $_SESSION['Gehaltswunsch'] = "{$_POST['Gehaltswunsch']}"; $_SESSION['Branche'] = "{$_POST['Branche']}";
die Weitergabe erfolgt dann über
PHPif ($num_rows == 0) { echo "Zu Ihrer Anfrage wurden keine Ergebnisse gefunden.<br /><a href=\"suche2.php?' . SID . '\">Suche ändern</a>";
und in das "neue" Formular habe ich dann jeweils an die erste Stelle eines select-Feldes folgenden Code eingebaut:
PHP
Alles anzeigen<?php session_start();echo "<option value=\"{$_SESSION['Fach']}\">"; if (empty($_SESSION['Fach'])) { echo "alle"; } else { echo "{$_SESSION['Fach']}"; } echo "</option>"; ?>
Ich mein es funktioniert und ich bin stolz wie Oskar ;-). Aber es scheint mir jetzt so schon etwas umständlich zu sein und ich frage mich, ob es auch eine elegantere Möglichkeit gegeben hätte. Ich will ja schließlich dazulernen
-
Der letzte PHP-Teil ist nicht schön.
Erste Lösung: Du machst für jedes Selectfeld einen array in dem die Optionen stehen.
Nehmen wir an du hast die Bundesländer in einem Array $bundesland stehen, beim generieren der Selectbox baust du dann eine Schleife in etwa folgender Form:PHP$options = ""; foreach($bundesland as $value) { if($value==$_SESSION['bundesland']) $options.= "<option selected>$value</option>"; else $options.= "<option>$value</option>"; } $select_bundesland = "<select name='Bundesland'>$options</select>";
$select_bundesland kannst du dann an passender Stelle in dein Formular einfügen.
Zweite Lösung, und wesentlich besser, wäre der Vorschlag von Bandit, die Optionen in der DB abzulegen. Das hat nicht nur den Vorteil, dass du Datenbank-Ressourcen sparst, sondern wenn sich eine Option beispielsweise irgendwann mal in der Bezeichnung ändert, brauchst du das nur in der Tabelle wo eben diese Bezeichnungen stehen zu ändern. Alle eingetragenen Jobs übernehmen automatisch die neue Bezeichnung, da sie über eine ID auf den entsprechenden Eintrag in der entsprechenden Tabelle referenzieren.
Ich habe gerade keine Zeit da ich nochmal weg muß, werde dafür aber später mal noch ein Beispiel posten wenn du die nötige Struktur noch nicht ganz nachvollziehen kannst. -
danke schon mal für deine Antwort. Ich freu mich schon auf deine Erklärung. Habe mir schon gedacht, dass Bandits Idee die bessere und flexiblere ist, habe aber keine Ahnung wie ich das bewerkstelligen kann
-
[!-- Jeglicher Code ungetestet --!]
Nehmen wir mal diese Select-Box als Beispiel:
HTML<td> <select style="width:100%;" name="Qualifikation" size="1"> <option value="">alle</option> <option value="Student / -in">Student / -in</option> <option value="Assistenzarzt / -ärztin">Assistenzarzt / -ärztin</option> <option value="Facharzt / -ärztin">Facharzt / -ärztin</option> <option value="Oberarzt / -ärztin">Oberarzt / -ärztin</option> <option value="Professor / -in">Professor / -in</option> </select> </td>
Dazu legst du dir eine Tabelle in deiner Datenbank an, z.B. `qualifikation` mit den Feldern `id` als Int Primary Key und `bezeichnung` als Varchar.
In deiner Job-Tabelle speicherst du dann für die Qualifikation nur noch die Id. Wenn du dann etwas an der Bezeichnung der Qualifikation änderst wird das automatisch für alle eingetragenen Jobs übernommen.
Auch das Hinzufügen weiterer Bezeichnungen erfolgt nur über die DB, du brauchst nichts am Skript zu ändern.Beispiel für die Generierung der Select-Box:
PHP
Alles anzeigen<?php $sql = " SELECT id, bezeichnung FROM qualifikation"; $result = mysql_query($sql) or die("MySQL-Fehler mit <br>$sql<br><br>".mysql_error()); $select_qualifikation = " <select style='width:100%;' name='Qualifikation' size ='1'> <option value='0'>alle</option>\n"; while($row = mysql_fetch_array($result)) { $sel = $_SESSION['qualifikation']==$row['id'] ? " selected" : ""; $select_qualifikation.= "<option{$sel}>{$row['bezeichnung']}</option>\n"; } $select_qualifikation.= "</select>"; ?>
Äquivalent umsetzbar auf die restlichen Select-Boxen.
Du arbeitest intern nur noch mit den Ids der jeweiligen Felder. Die Bezeichnungen brauchst du nur für die Ausgabe.
Wenn du jetzt für einen Job eine Übersicht zur Ausgabe brauchst kannst du deine SQL-Abfrage z.B. so aufbauen:
PHP
Alles anzeigen<?php $sql = " SELECT j.id AS id, j.firma AS firma, b.bezeichnung AS branche, j.stadt AS stadt, bl.name AS bundesland, q.bezeichnung AS qualifikation, f.bezeichnung AS fach, j.gehalt AS gehalt, j.kurzbeschreibung AS kurzbeschreibung, j.link AS link FROM jobs j, branche b, bundesland bl, qualifikation q, fach f WHERE j.id={$id_des_jobs} AND b.id=j.branche AND bl.id=j.bundesland AND q.id=j.qualifikation AND f.id=j.fach "; $result = mysql_query($sql) or die("MySQL-Fehler mit <br>$sql<br><br>".mysql_error()); $row = mysql_fetch_array($result); // Ausgabe ?>
Wenn du weitere Fragen hast einfach fragen.
-
super!
Ich bedanke mich schon mal recht herzlich für deine Mühen. Ich glaub, ich steig durch den Code. Wenn ich hängen bleibe, melde ich mich wieder
-
Mag sein, dass ich äußerst begriffsstutzig bin, aber muss ich für jede einzelne Selectbox ne neue Verbindung zu DB aufbauen?
Alternativ würde mir nur noch einfallen den gesamten HTML-Code zu "echo"n - sieht dann aber auch nicht gerade schick aus....
und noch ne Frage:
Wozu dient dieser Teil:
lediglich dazu, die "Rückkehr" auf das gleiche Formular mit bestehen bleibenden Einträgen zu ermöglichen???
und noch ne Frage:
läuft die Abfrage dann ausschließlich über Sessions? Habe jetzt folgendes gemacht:Habe nach deinem Muster die Tabellen erstellt und auch den entsprechenden Code übernommen. Das ganze sieht bei mir jetzt etwas umständlich aus...
HTML<table> <tr> <td> <?php DB-Verbindungsaufbau -plus Selectbox1 ?> </td> </tr> <tr> <td> <?php DB-Verbindungsaufbau -plus Selectbox2 ?> </td> </tr> </table>
Mit obiger Abfrage bekomm ich dann folgendes:
MySQL-Fehler mit
SELECT j.id AS id, j.firma AS firma, b.bezeichnung AS branche, j.stadt AS stadt, bl.name AS bundesland, q.bezeichnung AS qualifikation, f.bezeichnung AS fach, j.gehalt AS gehalt, j.kurzbeschreibung AS kurzbeschreibung, j.link AS link FROM jobs j, branche b, bundesland bl, qualifikation q, fach f WHERE j.id= AND b.id=j.branche AND bl.id=j.bundesland AND q.id=j.qualifikation AND f.id=j.fachYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND b.id=j.branche AND bl.id=j.bundesland AND q.id=j' at line 20
Ich will jetzt nicht aufgeben, aber ohne Hilfe wird das dann glaub ich nichts mehr...
die Suche erfolgt über:
PHP
Alles anzeigen<?php $verbindung = mysql_connect ("HOST", "DB", "***") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch"); mysql_select_db("DB") or die ("Die Datenbank existiert nicht."); $sql = " SELECT j.id AS id, j.firma AS firma, b.bezeichnung AS branche, j.stadt AS stadt, bl.name AS bundesland, q.bezeichnung AS qualifikation, f.bezeichnung AS fach, j.gehalt AS gehalt, j.kurzbeschreibung AS kurzbeschreibung, j.link AS link FROM jobs j, branche b, bundesland bl, qualifikation q, fach f WHERE j.id={$id_des_jobs} AND b.id=j.branche AND bl.id=j.bundesland AND q.id=j.qualifikation AND f.id=j.fach "; $result = mysql_query($sql) or die("MySQL-Fehler mit <br>$sql<br><br>".mysql_error()); while ($row = mysql_fetch_array($result)) { echo "$row->firma, $row->fach, $row->stadt"; }
Danke
-