[PHP] SQL Abfrage für Schule / keine Ahnung

Pual

Ensign
Registriert
Nov. 2004
Beiträge
227
Hi.

Ich bräuchte mal die Hilfe von erfahrenen PHP und SQL Fans :D

Und zwar soll ich für die Schule eine Page erstellen, die ein Drop Down Formularfeld enthält, welches wiederum dynamisch mit dem Inhalt einer Tabelle oder besser gesagt einer Spalte dieser Tabelle gefüllt werden soll. Leider Gottes bin ich auf dem Gebiet ne absolute Niete, und PHP hatten wir noch nicht mal in der Schule, sollen es aber anwenden... :freak:

So. Und zwar habe ich mir gedacht, eine normale HTML Seite zu erstellen, die aber PHP Code enthält, der wiederum per SQL Befehl die Daten aus der Tabelle auslesen soll. Wir haben einen lokalen Server mit XAMPP installiert - dort soll die Seite schließlich gespeichert werden und dort liegt wiederum auch die Datenbank.

Ich habe jetzt diversen konfusen Code zusammengewürfelt und habe schon Angst vor meinem eigenen gefährlichen Halbwissen :king:
Deswegen poste ich hier mal meine "Entwürfe" und ihr könnt mir dann vielleicht sagen, wie man es richtig macht ;)

Code:
$index = 1;
$abfrage;

<select name="Name">
while $index <= maximale KategorieID //wie formuliere ich das?
{
$abfrage = "SELECT Name FROM kategorie WHERE KategorieID is $index";
<option value= "$index"> $abfrage </option>

$index++;
}
</select>

Code:
<?php
  mysql_connect('localhost','NAME','PASSWORT') or die(mysql_error());
  mysql_select_db("f4f");
  $abfrage = "SELECT * FROM kategorie";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis))
    {
    echo $row->kategorie; //hier wird der Spaltenname angegeben
    }
  ?>

...und so sieht die bisherige HTML Seite aus:
Code:
<html>
<head>
<title>F4F Auswahl</title>
</head>

<body>
<p align="center"><img src="http://f4f.dyndns.org/f4f/banner.jpg"></p>
<p align="center">&nbsp;</p>
<form method="post" action="sql_abfrage.php">
  <div align="center">
    <table width="50%"  border="0">
      <tr>
        <td width="9%"><select name="KategorieID"> //Name der zu abrufenden Spalte?!
          <option>1</option>
          <option>2</option>
          <option>3</option>       
        </select></td>
        <td width="5%"><input type="checkbox" name="Windows" value="checkbox"></td> 
        <td width="86%">Windows</td>
      </tr>
      <tr>
        <td><div align="right">
        </div></td>
        <td><input type="checkbox" name="Linux" value="checkbox"></td>
        <td>Linux</td>
      </tr>
    </table>
    <p><input type="submit" value="Suche starten" /></p>
  </div>
</form>

</body>
</html>

Sorry, ich weiß das is vermutlich ein einziges WirrWarr, aber das ist einfach nur aus Infos entstanden, die ich mir mühsam durch diverse Tutorials zusammen gesucht habe...
 
Hab jetzt zwar nur telweise verstanden was du eigentlich genau willst, aber versuch es mal auf diese Weise:

PHP:
<?PHP
// DB Verbindung aufbauen
mysql_connect('localhost','NAME','PASSWORT') or die(mysql_error());
mysql_select_db("f4f");
// Abfrage auf die Datenbank ausführen, Daten in ein Recordset ($ergebnis) zwischenspeichern 
$abfrage = "SELECT Name FROM kategorie;"; // "select * ..." nach möglichkeit vermeiden, lieber die benötigten Felder einzeln angeben.
$ergebnis = mysql_query($abfrage);
?>
<html>
<head>
<title>F4F Auswahl</title>
</head>
<body>
<p align="center"></p>
<p align="center">&nbsp;</p>
<form method="post" action="sql_abfrage.php">
  <div align="center">
    <table width="50%"  border="0">
      <tr>
        <td width="9%"><select name="Kategorie"> <!-- Der Name des Steuerfeldes ist frei wählbar und hat nichts mit der Abfrage zu tun! -->
          <?PHP
          // Ausgabe des Abfrageergebnisses, hierbei wird jede Zeile einzeln in ein Array eingelesen und die entsprechende Spalte ausgegeben
          while($row = mysql_fetch_array($ergebnis,MYSQL_ASSOC))  // Schleife durchläuft alle zurückgegebenen Zeilen
          {
              // Ausgabe der einzelnen Optionen der Select Box, ggf. noch die ID als value Wert mitgeben (<option value='" . $row['KategorieID']."'>"
               echo "<option>" . $row['Name'] . "</option>";
          }
          // Da das Abfrageergebniss nicht mehr benötigt wird löschen wir es und befreien so etwas Speicher des Servers
          $row = "";
          $ergebnis = "";
          ?>    
        </select></td>
        <td width="5%"><input type="checkbox" name="Windows" value="checkbox"></td> 
        <td width="86%">Windows</td>
      </tr>
      <tr>
        <td><div align="right">
        </div></td>
        <td><input type="checkbox" name="Linux" value="checkbox"></td>
        <td>Linux</td>
      </tr>
    </table>
    <p><input type="submit" value="Suche starten" /></p>
  </div>
</form>
</body>
</html>
<?PHP 
// Datenbankverbindung schließen, leider hab ich den Code gerade nicht im Kopf :P
?>

Anpassungen an den Spaltenname der Tabelle must du noch selber machen, aber das dürfte eigentlich kein Problem sein.

Der Code ist ungetestet, kann also durchaus noch Tipp und Syntaxfehler beinhalten. Eine gutes Nachschlagewerk für PHP ist auch www.selfphp.de.
 
Ehm ok. Vielen Dank erstmal! Ich hab mir dies bezüglich was zusammen gebastelt.

Frage dazu:
"select * ..." nach möglichkeit vermeiden, lieber die benötigten Felder einzeln angeben.

Wieso?

Und ums vielleicht noch mal klarer zu formulieren: Ziel ist es, eine Weboberfläche für einen File-Server zu erstellen. Auf dem FileServer liegen dann diverse Freeware-Tools, die eben auch per MySQL in einer Datenbank vermerkt sind. Desweiteren exisiert auch eine Tabelle, die die Softwarekategorie enthält. Aus einem DropDown Feld auf der Seite soll man dann diese SoftwareKategorien auswählen können (das Drop-Down Feld soll sich dabei natürlich dynamisch an den Inhalt der Tabelle anpassen).

Weiterhin soll man die Auswahl haben, ein Häkchen bei Windows und/oder bei Linux zu setzen. Im folgenden soll die Seite quasi eine Suchanfrage starten, die alle Einträge aus der Tabelle Software auflistet, die den Suchkriterien entsprechen (z.B. Kategorie Security, Windows=ja, Linux=nein)

Es gibt also zum einen eine Kategorie-Tabelle, die so aussehen könnte:

KategorieID: 1
Name: Security

KategorieID: 2
Name: Multimedia

usw...

Einträge einer Zeile in der Software-Tabelle könnten dann z.B. so aussehen:
Name: WinZip
KatergorieID (Fremdschlüssel)
Windows: True
Linux: False
Dateigröße: 1234

Soo... Jetzt muss ich also noch die eigentliche Aussgabe des Suchergebnisses hinbekommen... Habe auch da mal was konfuses aufgeschrieben, wie ich mir das vorstelle:

Code:
if(isset($_POST['Windows'])){
	$Windows = "&& Windows = TRUE";
}
if(isset($_POST['Linux'])) {
	$Linux = "&& Linux = TRUE";
}
	

$sql = "SELECT 
					*
				FROM
					Software
				WHERE
					KategorieID
				IS '".$_POST['KategorieID']."' '".$Windows."' '".$Linux."'";


$result = mysql_query($sql) OR die(mysql_error());

Kann man das so irgendwie machen? Aber da fehlt jetzt noch die eigentliche Ausgabe der Abfrage oder? "echo $result;" kann ich da nicht einfach schreiben, oder?

Sorry, ich weiß das das echt viele Infos auf einem Haufen sind, aber ich sitz da echt in der Sackgasse. Habe mir schon seitenweise Tutorials durchgelesen, aber zum einen is Programmieren nicht mein Fachgebiet, zum anderen versteh ich von PHP speziell eigentlich rein garnix :freak:
 
Zuletzt bearbeitet:
Hallo Pual,

ich habe mal deinen Code etwas überarbeitet.

PHP:
// Zusätzlich Bedingungen erstellen. 
$where_string = '';
if(isset($_POST['Windows'])){
	$where_string .= " AND Windows = '1'";
}

if(isset($_POST['Linux'])) {
	$where_string .= " AND Linux = '1'";
}

//  SQL - Statement vorbereiten.
$sql = "SELECT 
				*
			FROM
				Software
			WHERE
				KategorieID
			IS '".mysql_real_escape_string($_POST['KategorieID'])."'".$where_string;

// Abfrage ausführen.
$result = mysql_query($sql) OR die(mysql_error());

// Ausgabe aller Zeilen.
while ($row = mysql_fetch_assoc($result)) {
    echo $row["Name"].' - ';
    echo $row["KatergorieID "].' - ';
    echo $row["Windows"].' - ';
    echo $row["Linux"].' - ';
    echo $row["Dateigröße"].'<br />';
}

Eine kleine Erläuterung:
Die Funktion mysql_real_escape_sting() dient der Maskierung von SQL-Sonderzeichen, allen voran Hochkommata. Wenn man das nicht macht, ist Dein Code anfällig für SQL-Injections. Bau das als Kommentar irgendwo ein, das wird deinen Lehrer beeindrucken, aber belies dich vorher etwas zu dem Thema, falls er dich dazu etwas fragt.

Des Weiteren habe ich den Datentyp für die Spalten Windows & Linux angepasst. Diese wären jetzt vom Typ enum(0, 1), da MySQL keine Boolschen Typen für Spalten kennt. Idealerweise könnte man beide Spalten zu einer zusammenfassen, dann würde sich die Abfrage aber etwas ändern. Man könnte eine Spalte System mit dem Werten enum(0, 1, 2) machen oder besser noch ein integer und dort eine Binärkodierung verwenden, aber das wäre Optimierungspotential für später. Ich habe übrigens die Variablen $Windows & $Linux ganz bewusst entfernt. Auf einem System mit aktivierter register_globals Option könnte man diese per $_GET manipulieren, obwohl in $_POST nichts drin steht. Das hätte in deinem Code dann auch wieder zu einer SQL-Injection geführt.

Der letzte Abschnitt ist eine unformatierte Ausgabe Deiner Tabelle. Den kannst Du dann an deinen Geschmack und die HTML-Vorgaben anpassen.

So das war jetzt viel Theorie und sicher viele neue Begriffe. Versuch Dich etwas zu den Themen zu belesen. Google und Wikipedia sind hier wohl erste gute Anlaufstellen.


Ciao
 
WoW! :daumen:

Ich glaube das hat mir SEEHR geholfen :D

Werde natürlich (wie auch schon die ganze Zeit) weiter die Hintergründe erforschen und mich zu dem Thema belesen. Ich muss es ja nachher verstanden haben und dem Lehrer erklären können bzw. es in der Dokumentation verständlich niederschreiben...

Aber das wichtigste ist erstmal, dass die Sache läuft, und so wie ich das sehe, bin ich da auf nem guten Weg dank eurer Hilfe ;)
 
Zurück
Oben