PDA

Vollständige Version anzeigen : php/MySQL Experten: Wie verarbeite ich die Daten weiter?


Sven
19-03-2004, 11:33
Ich hab folgendes kleines Script mit dem ich Daten aus einer MySQL Tabelle in ein Dropdown einlesen lasse:
<?include("data.php");
$con_dat=@MYSQL_CONNECT($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db,$con_dat);
$query = "SELECT * FROM getraenke ORDER BY kategorie";
$result = mysql_query($query);
$number = mysql_numrows($result);
print "Kategoriewahl:<p>
<form action=\"kat_test.php\" method=\"post\">
<select name=\"ID1\"><option value=\"\">Wähle eine Kategorie</option>";
for ($i=0; $i<$number; $i++) {
$ID = mysql_result($result,$i,"PRIMARY");
$bez = mysql_result($result,$i,"bezeichnung");
$txt = mysql_result($result,$i,"text");
$preis = mysql_result($result,$i,"preis");
$kat = mysql_result($result,$i,"kategorie");
print "<option value=\"ID1\">$kat: $bez | $txt | $preis</option>";
}
print "</select><input type=\"submit\" value=\"Absenden\" name=\"submit\">
</form>";mysql_close();
?>
So weit so gut.
Nuir bin ich leider absolut planlos wie ich herausfinde was der Anwender ausgewählt hat und wie ich diese Daten weiterverwenden kann....

Ok, ich bin in der Hinsicht der Volln00b :D

almhirte
19-03-2004, 13:37
Also ich denke das da in deinem script bereits ein kleiner Fehler ist.

Das select element hast du ID1 genannt. Über diesen Namen kannst du es dann später als Variable benutzen.

Die option elemente haben als value das was $ID enthält.
Da ist n kleiner Fehler bei dir.
Bei dir steht:

print "<option value=\"ID1\">$kat: $bez | $txt | $preis</option>";

Es müsste glaub ich etwa so aussehen:

echo '<option value="'.$ID.'">'.$kat.': '.$bez.' | '.$txt.' | '.$preis.'</option>';

Dann kriegt jede option einen eindeutigen Wert zugewiesen. Nämlich die ID die bei dir glaub ich der primary key ist. Dieser ist später das was der user ausgewählt hat.
In deiner formular-ziel datei (kat_test.php) kannst du dann etwa so damit umgehen

if (isset($ID1))//ID1 ist die gesamte combobox (dropdown)
{
//der wert von ID1 ist dann das
//was bei dem jeweiligen option als value eingetragen wurde.
//du musst dir also dein internes mapping für
//die einzelnen optionen merken

}


Ich hoffe das ist irgendwie verständlich :crazy:

Sven
19-03-2004, 13:40
Jupp, werd ich heute Abend ausprobieren ;) :thx: schonmal

se7en
19-03-2004, 14:03
endlich mal ne Frage für mich ;) und da ist sie schon beantwortet :(

Aber ok, eins hab ich noch. Es kann sein, das die Methode nicht funktioniert, d.h. Du die Variable $ID ohne Wert ist. Das hängt dann mit der Option "Register Globals" zusammen (ist ne Einstellung der PHP installation auf dem PHP-Server/Rechner). Dann musst Du $_POST["ID"] verwenden um an den Wert der Variable zu kommen (_POST für die method POST, _GET für method get).

und noch was:
echo "HTML-Text $Variable und dann noch mehr Text"; funktioniert auch :)

Sven
19-03-2004, 14:08
Wie ich das nachher umstricke etc. ist erstmal unwichtig.
Stehen hab ich ein Formular zur Dateneingabe, ein Script zum Auslesen und eben dieses Dropdown.
Ziel ist es über das Dropdown einen Datensatz gezielt anzuwählen um ihn dann in einem weiteren Formular editieren zu können.
Damit wären meine Ansprüche an mein erstes Superminiwinzig php/MySQL Projektchen auch schon erfüllt ;)

se7en
19-03-2004, 14:13
ein anderer Vorschlag zur For-Schleife:
$query = mysql_query("SELECT * FROM Tabelle");
while ($row = mysql_fetch_row($query))
{
echo "Spalte1" . $row[0] . "\n";
echo "Spalte2" . $row[1] . "\n";
...
}


(Wenn Du die Spaltennamen angeben möchtest, ist zu empfehlen wenn später mal die Scripte geändern müssen!):
$query = mysql_query("SELECT * FROM Tabelle");
while ($row = mysql_fetch_array($sql, MYSQL_ASSOC))
{
echo "Spaltenname1" . $row["Spaltenname1"] . "\n";
echo "Spaltenname2" . $row["Spaltenname2"] . "\n";
...
}

Sven
19-03-2004, 14:39
Ich lerne gerne was dazu ;)

almhirte
19-03-2004, 15:06
und noch was:
echo "HTML-Text $Variable und dann noch mehr Text"; funktioniert auch :)

Das ist wohl wahr. Aber bei:
echo "HTML-Text ".$Variable." und dann noch mehr Text";

Sieht man die verwendeten Variablen sofort. Mir ist schon öfter passiert das ich sonst mal eine übersehe wenn so'n String länger wird.

EEBKiller
19-03-2004, 15:12
<?php
require("data.php");
$con_dat=@mysql_connect($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db, $con_dat);
$query = "SELECT * FROM getraenke ORDER BY kategorie";
print "Kategoriewahl:<br />\r\n";
print "<form action=\"kat_test.php\" method=\"post\" name=\"select\">\r\n";
print " <select name=\"ID\" onchange=\"select.submit();\">";
print " <option>Wähle eine Kategorie</option>\r\n";
while ( $result = mysql_fetch_array($query)) {
print " <option value=\"$result[PRIMARY]\">$result[kategorie]: $result[bezeichnung] | $result[text] | $result[preis]</option>\r\n";
}
print " </select>\r\n";
print " <input type=\"submit\" value=\"Absenden\" name=\"submit\">\r\n";
print "</form>";
mysql_close();
?>

Und die kat_test.php

<?php
if (isset($_POST['ID'])) {
require("data.php");
$con_dat=@mysql_connect($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db, $con_dat);
$query = "SELECT * FROM getraenke WHERE PRIMARY = $_POST[ID]";
$result = mysql_fetch_array($query);
// Hier kommt der Teil hin, wenn eine Kategorie ausgewählt wurde.
// Deine Daten stehen dir nun als $result[preis] usw zur verfügung ;)
} else {
// Hier kommt der Teil hin, wenn der User zu faul war, ne Kategorie
// zu wählen und einfach nur auf Submit gedrückt hat
}
?>

Für fehlende ; übernehme ich keine Haftung, das passiert mir andauernd :D


@ almhirte: Passiert mir relativ selten, dass ich ne Variable in so nem String übersehe. Vorallem arbeite ich überwiegend mit Arrays und die [] fallen einem gewöhnlicherweise sofort ins Auge :D


€DIT @ Sven : Ich würde dir dringend raten, deine spalte PRIMARY in id umzutaufen. Ich weiss nämlich nicht genau, ob PRIMARY nicht sogar ein reserviertes Schlüsselwort ist ;)

Sven
19-03-2004, 15:53
Herzlichen Dank nochmal.... blöderweise kann ich jetzt gerade nicht das machen wozu ich die größte Lust hätte: Es direkt ausprobieren. :( :cry:

Also werd ich gegen später alle Vorschläge und Lösungen testen ;)

CaptureX
19-03-2004, 17:18
Es kann sein, das die Methode nicht funktioniert, d.h. Du die Variable $ID ohne Wert ist. Das hängt dann mit der Option "Register Globals" zusammen (ist ne Einstellung der PHP installation auf dem PHP-Server/Rechner).

Sollte dies so sein...kannst du aber mal in der php.ini (ich glaube im Windows-Ordner) "Register Globals" auf ON setzen. ;)

; You should do your best to write your scripts so that they do not require
; register_globals to be on; Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = On


:cu:

EEBKiller
19-03-2004, 20:33
wer proggt heute noch basierend auf register_globals = on ??? :o: :D

Sven
20-03-2004, 15:35
Sodele, jetzt hab ich das so weit laufen ;)
<?
// dropdown.php
require("data.php");
$con_dat=@mysql_connect($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db, $con_dat);
$query = mysql_query("SELECT * FROM getraenke WHERE kategorie = 'Hauptgerichte'");
print "Bitte wählen Sie einen Datensatz:\r\n";
print "<form action=\"kat_test.php\" method=\"post\" name=\"select\">\r\n";
print "<select name=\"ID\" onchange=\"select.submit();\">";
// print " <option>Wähle eine Kategorie</option>\r\n";
while ($result = mysql_fetch_array($query)) {
print "<option value=\"$result[0]\"> $result[4]: $result[1] | $result[2] | $result[3]</option>\r\n";
}
print " </select>\r\n";
print " <input type=\"submit\" value=\"Absenden\" name=\"submit\">\r\n";
print "</form>";
mysql_close();
?>
<div><a href="ausgabe.php">Daten anzeigen (Hauptgerichte)</a> | <a href="dropdown.php">Datensatz ändern</a> | <a href="form.html">Eingabeformular</a></div>

<form action="aendern.php" method="post">
<table>
<tr>
<td>ArtNo.:</td><td>Bezeichnung</td><td>Beschreibung</td><td>Preis</td><td>Kategorie</td>
</tr>
<tr>
<?php
// kat_test.php
if (isset($_POST['ID'])) {
require("data.php");
$con_dat=@mysql_connect($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db, $con_dat);
$query = mysql_query("SELECT * FROM getraenke WHERE ArtNo = $_POST[ID]");
$result = mysql_fetch_array($query);
print "<input type=\"hidden\" name=\"ArtNo\" value=\"$result[0]\">";
print "<td>$result[0]</td>";
print "<td><input name=\"bezeichnung\" value=\"$result[1]\"></td>";
print "<td><input name=\"beschreibung\" value=\"$result[2]\"></td>";
print "<td><input name=\"preis\" value=\"$result[3]\"></td>";
print "<td><input name=\"kategorie\" value=\"$result[4]\"></td>";
}
else {
print "Sie haben keinen Eintrag gewählt";
}
?>
</tr>
</table>
<table>
<tr>
<td>
<input type="submit" value=" Absenden ">
<input type="reset" value=" Abbrechen">
</td>
</tr>
</table>
<div><a href="ausgabe.php">Daten anzeigen (Hauptgerichte)</a> | <a href="dropdown.php">Datensatz ändern</a> | <a href="form.html">Eingabeformular</a></div>
</form><?
// aendern.php
include("connect.php");
if(!$bezeichnung || !$beschreibung || !$preis || !$kategorie ) {
echo "Ein Feld wurde leer gelassen!";
exit;
}
else {
$sql = "UPDATE getraenke SET bezeichnung='$bezeichnung', text='$beschreibung', preis='$preis', kategorie='$kategorie' WHERE ArtNo = $ArtNo ";
include("send_sql.php");
}

if ($res=send_sql($db, $sql)) {
echo "Datensatz geändert";
}
mysql_close;
?>
<div><a href="ausgabe.php">Daten anzeigen (Hauptgerichte)</a> | <a href="dropdown.php">Datensatz ändern</a> | <a href="form.html">Eingabeformular</a></div>
Vielen Dank bis da hin :thx:

Nu mal weiter gefragt:
Wie bekomm ich das eigentlich hin das alles auf eine Seite zu packen?

redroach
20-03-2004, 16:35
du lässt das formular einfach die skriptdatei selbst nochmal aufrufen.
sprich:

<?
// dropdown.php
require("data.php");
$con_dat=@mysql_connect($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db, $con_dat);
$query = mysql_query("SELECT * FROM getraenke WHERE kategorie = 'Hauptgerichte'");
//######## hier der test, ob der 'abschicken'-button gedrückt wurde ######
if ($_POST[submit]) /*###weiss nicht mehr genau, welcher wert da übermittelt
wird, evtl. anderer test######*/
{
//
//hier deine bearbeitung der tabelle
//
}
else
{ //###falls nicht 'abschicken'gedrückt wurde, zeige formular####
print "Bitte wählen Sie einen Datensatz:\r\n";
//######hier dropdown.php im formular rufen############
print "<form action=\"dropdown.php\" method=\"post\" name=\"select\">\r\n";
print "<select name=\"ID\" onchange=\"select.submit();\">";
// print " <option>Wähle eine Kategorie</option>\r\n";
while ($result = mysql_fetch_array($query)) {
print "<option value=\"$result[0]\"> $result[4]: $result[1] | $result[2] | $result[3]</option>\r\n";
}
print " </select>\r\n";
print " <input type=\"submit\" value=\"Absenden\" name=\"submit\">\r\n";
print "</form>";
}
mysql_close();
?>
<div><a href="ausgabe.php">Daten anzeigen (Hauptgerichte)</a> | <a href="form.html">Eingabeformular</a></div>

Sven
24-03-2004, 16:08
Ich mach einfach hier mal weiter.....
<table class="karte" width="75%">
<?
require("admin/data.php");
$con_dat=@MYSQL_CONNECT($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db,$con_dat);
$result=mysql_query("SELECT * FROM speisen WHERE uebersicht = 'ueber'");
$kats=mysql_query("SELECT DISTINCT kategorie FROM speisen ORDER BY 'kategorie'");
// Zur Kontrolle:
$num_entries_kat = mysql_num_rows($kats);
$num_entries_speisen = mysql_num_rows($result);
echo "Kat:".$num_entries_kat."<br>";
echo "Speisen:".$num_entries_speisen."<br>";
// Ende Kontrolle
while($kateg=mysql_fetch_array($kats)) {
print "<tr><td class=\"teiler\" colspan=\"4\">".$kateg['kategorie']."</td></tr>";
while($liste=mysql_fetch_array($result)) {
if($liste[4]==$kateg['kategorie']) {
print "<tr><td>".$liste[1]."</td><td>".$liste[2]."</td><td>".$liste[3]."</td><td>".$liste[4]."</tr>";
}
}
}
?>
</table>
Das soll für jede Kategorie alle Speisen anzeigen deren Kategorie der aktuellen Kategorie entspricht und bei der in der Spalte 'uebersicht' der Wert 'ueber' steht.
Das funzt aber leider nur für die erste Kategorie, dann ist Feierabend :cry:

Ansehen könnt ihr euch das Ergebnis hier:
http://www.berliner-hof.net/ausgabe_ueber.php

se7en
24-03-2004, 16:37
ich hab zwar keine Ahung wie die Tabelle "Speisen" aussieht, aber ich denke so geht es und Du hast dir ein SQL-Statement gespart: (iss untestet ;))


$kats=mysql_query("SELECT * FROM speisen ORDER BY 'kategorie'";
$temp="";
while($kateg=mysql_fetch_array($kats)) {
if($temp!=$kateg['kategorie']) {
print "<tr><td class=\"teiler\" colspan=\"4\">".$kateg['kategorie']."</td></tr>"; }
$temp=$kateg['kategorie'];
print "<tr><td>".$kateg[1]."</td><td>".$kateg[2]."</td><td>".$kateg[3]."</td><td>".$kateg[4]."</tr>";
}

Sven
24-03-2004, 17:37
Hmm, nee, funzt nicht.
Mit der Version bekomm ich alle Speisen angezeigt - aber ohne jegliche Überschrift....

Tabelle:

ArtNo | Bezeichnung | Text | Preis | Kategorie | Uebersicht
1 | Schnitzel | Wiener | 1.50 | Haupt | ueber
2 | Wurst | Bock | 0.20 | Happen |
3 | Suppe | Lecker | 1.00 | Suppen | ueber

EEBKiller
24-03-2004, 19:21
[...]Das funzt aber leider nur für die erste Kategorie, dann ist Feierabend :cry:
http://www.berliner-hof.net/ausgabe_ueber.php

Weil SQL grunsätzlich nicht 2 Querys gleichzeitig verarbeitet. Du musst zuerst einen in ne Var Puffern und dann das gepufferte mit nem foreach wieder auslesen und den 2. Query starten ;)

<table class="karte" width="75%">
<?php
require("admin/data.php");
$con_dat = @MYSQL_CONNECT($MySQL_Host, $MySQL_User, $MySQL_Passw);
mysql_select_db($db,$con_dat);
$kats = mysql_query("SELECT DISTINCT kategorie FROM speisen ORDER BY
kategorie");
$kat_data = array();
// Puffert erstmal die Kategorien
while($kat_temp = mysql_fetch_array($kats)) {
$kat_data[] = $kat_temp;
}
// Ruft die Kategorie wieder auf und dann dazu die Speisen
foreach($kat_data as $elem) {
$result = mysql_query("SELECT * FROM speisen WHERE uebersicht = 'ueber' AND kategorie = '$elem[kategorie]'");
print "<tr><td class=\"teiler\" colspan=\"4\">".$elem['kategorie']."</td></tr>";
while($liste = mysql_fetch_array($result)) {
print "<tr><td>".$liste[1]."</td><td>".$liste[2]."</td><td>".$liste[3]."</td><td>".$liste[4]."</tr>";
}
}
?>
</table>

Sollte schon eher funzen, allerdings hab ichs ned getestet ;)


€DIT: "DISTINCT" is goil, allerdings braucht man es nur, wenn man seine DB nicht normalisiert hat....

Sven
24-03-2004, 23:10
Funzta wunderherrlich :freu: :thx:

se7en
26-03-2004, 15:46
Hmm, nee, funzt nicht.
Mit der Version bekomm ich alle Speisen angezeigt - aber ohne jegliche Überschrift....
ups, öh... die Schleife hab ich ja auch falsch... naja funzt ja anders schon längst :)