Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Drop-Down-Menü aus mySQL-Tabelle





Frage

Hallo Leute: Ich habe folgendes Problem: Ich will aus einer mySQL-Tabelle (arbeitsschritt) jeweils die ID und den Namen herausbekommen und die dann in eine Drop-Down-Liste einfügen. könntete ihr mir bitte helfen was bei meinem Script der Fehler ist? Habe es aus dem Buch "PHP4 - Grundlagen und Profiwissen". nur halt etwas abgeändert. Die Verbindung zur DB läuft ohne Probleme. [code]<html><head></head><body> Arbeitsschritt: <select name="abs_id" size="1"> <?php $query="SELECT * FROM arbeitsschritt"; $result = mysql_query($query) or die(´Fehler:´.mysql_error()); $rows = mysql_num_rows($result); $x=1; while ($x <= rows) { $arbid = mysql_result($result,$x,"Arb_ID"); $arbname = mysql_result($result,$x,"Arb_Name"); echo "<option value=\""+$arbid+"\">"+$arbname; }?> </select></body></html>[code]

Antwort 1 von hepna

Hi,

auf jeden Fall fehlt mal ein $ vor rows in
while($x <= $rows) 
.

Ansonsten sollte es funktionieren.

Gruß
hepna

Antwort 2 von disco

moin

du musst erst ein select-tag aufmachen und dann darin über die ergebnisse iterieren und sie gleichzeitig ins select schreiben.:

<body>
<select name="personal" title="Wählen den Mitabeiter">
<?php
while ($x <= rows)
{
print(´<option value="$arbid">$arbname</option>´);
}
?>
</select>
</body>

g,
disco

Antwort 3 von tomham

Zitat:
du musst erst ein select-tag aufmachen und dann darin über die ergebnisse iterieren und sie gleichzeitig ins select schreiben


Habe ich. Steht gleich in der zweiten Zeile.

Zitat:
auf jeden Fall fehlt mal ein $ vor rows in while($x <= $rows)


Habe das fehlende $ eingefügt, jetzt geht gar nichts mehr. Es wird mir nicht mal mehr meine Überschrift angezeigt. (Quelltext oben ist nur ein Ausschnitt aus dem ganzen Script !!)

Antwort 4 von disco

haste denn mal meinn beispiel ausprobiert (da fehlt auch das "$"), bzw. hast du in deinem originalen code überhaupt ein select-tag aufgemacht? stehen überhaupt werte im result?

Antwort 5 von disco

ahso. sorry jetzt seh ich auch, dass du es aufgemacht hast.
duz solltest den db aufruf wegen der übersichtlichkeit oben machen

Antwort 6 von tomham

Habe jetzt was anderes ausprobiert:


<html><head></head><body> 
Arbeitsschritt: <select name="abs_id" size="1">
<?php
$result=mysql_db_query ($MySQLDatabase,"SELECT * FROM arbeitsschritt");
while ($row=mysql_fetch_object($result))
{
  $arbid=$row->Arb_ID;
  $arbname=$row->Arb_Name;
  echo "<option value=\""+$arbid+"\">"+$arbname;
}
mysql_free_result($result);
?>
</select></body></html>


Das funktioniert aber auch nicht. Wo kann da der Fehler liegen in den beiden Beispielen??

Antwort 7 von tomham

Die Datenbank schließe ich am Ende wieder Ordnungsgemäß mit

<?php
mysql_close($ServerConnection);
?>

wobei $ServerConnection die Verbindung zu meiner Datenbank ist.

Antwort 8 von tomham

Ich würde mich freuen wenn ich heute noch eine Antwort bekommen könnte. Ich muss nämlich das Script bis Freitag komplett fertig haben und mir fehlen auch noch andere heikle Sachen, z.Bsp. wie man in einem Formularfeld als Standardwert einen Wert aus einer SQL-Abfrage einfügen kann.

Also helft mir BITTE BITTE BITTE !!! *heul**sniff*

Antwort 9 von rabies

Hi,

 
<html>
	 <head>
	 <title> DropDown aus SQL-Daten </title>
	 </head>
	 <body>
Arbeitsschritt: <form action="" method="post"><select name="abs_id" size="1">
<?php
mysql_connect("localhost", "username", "passwort") or die ("Unable to connect to database. Err.: ".mysql_error());
mysql_select_db("test_db") or die ("Unable to select database. Err.: ".mysql_error());
$query="SELECT Arb_ID, Arb_Name FROM arbeitsschritt";
$result = mysql_query($query) or die("Err.:".mysql_error());
while ($rows = mysql_fetch_array($result,MYSQL_ASSOC))
{
echo "<option name=\"Arb_ID\" value=\"".$rows["Arb_ID"]."\">".$rows["Arb_Name"]."</option>";
}?>
</select></form> 
	 </body>
</html> 



Hab´ das jetzt einfach mal so zusammengeschrieben - funktioniert prächtig.

CREATE Anweisung (vllt. liegt ja da auch der Fehler, warum Du nichts zurückbekommst?)


CREATE TABLE arbeitsschritt (Arb_ID int not null auto_increment, Arb_Name varchar(100), primary key(Arb_ID));



Btw.: Wurde überhaupt ein Formular angezeigt, oder waren nur keine Daten in der im dem Select? -> Eigentlich müsste nämlich gar nichts angezeigt worden sein -> du hattest kein <form>.

Und das mit dem Standardwert - Das hast Du doch bei deinem option auch schon gemacht - oder was meinst Du, was das value="" da bedeutet? (Da gehört übrigens wirklich ein Name noch dazu hin. -> Name=Wert)

Greets,
Sven.

Antwort 10 von tomham

Danke für deine Hilfe Sven.
War schon am Verzweifeln.

Das mit dem Standardwert hat sich erledigt, ich mache das über den Query-String und les dann von dem wieder ein. Aus einer DB auslesen und diese Werte nehmen hat nicht funkitoniert.

Aber danke nochmals für deine Hilfe!!

mfg.
Tomham

Antwort 11 von tomham

Hab jetzt leider ein anderes Problem: Um leere Einträge beim UPDATE einer Tabelle zu überspringen habe ich es folgendermaßen gelöst:

	if($ak!=´´){
	$akquery="UPDATE auftrag SET AK=´$ak´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($eingang!=´´){
	$akquery="UPDATE auftrag SET Eingang=´$eingang´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($kunde!=´´){
	$akquery="UPDATE auftrag SET Kunde=´$kunde´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($bezeichnung!=´´){
	$akquery="UPDATE auftrag SET Bezeichnung=´$bezeichnung´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($stück!=´´){
	$akquery="UPDATE auftrag SET Stück=´$stück´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($termin!=´´){
	$akquery="UPDATE auftrag SET Termin=´$termin´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($arbid!=´´){
	$akquery="UPDATE auftrag SET Arb_ID=´$arbid´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($erledigt!=´´){
	$akquery="UPDATE auftrag SET Erledigt=´$erledigt´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($ausgeliefert!=´´){
	$akquery="UPDATE auftrag SET Ausgeliefert=´$ausgeliefert´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($zeitraum!=´´){
	$akquery="UPDATE auftrag SET Zeitraum=´$zeitraum´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($verbleibend!=´´){
	$akquery="UPDATE auftrag SET Verbleibend=´$verbleibend´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($differenz!=´´){
	$akquery="UPDATE auftrag SET Differenz=´$differenz´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	if($fertig!=´´){
	$akquery="UPDATE auftrag SET Fertig=´$fertig´ WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());
	}
	header(´Location:´.$_SERVER[´REQUEST_URI´]);


Wenn ich dann dieses UPDATE auf der Weboberfläche ausführe kommt immer wieder der Fehler:

Zitat:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ´´ at line 1


Wo liegt da der Fehler ?? Ich finde ihn nicht. Habe auch schon immer wieder einen der IFs auskommentiert, aber es kommt auch wen ich mehrere auskommentiere. Felder sind alle vorhanden und ich kann sie auch ganz normal ausgeben (echo "$id, $eingang, ...";)

Antwort 12 von disco

zeig doch mal was in $akquery steht nach dem die ganzen ifs durchlaufen sind. ausserdem solltest du das mysql_query einfach nur ganz zum schluss aufrufen und es da nicht in jede if abfrage schreiben, so dass du das update in einem rutsch machst und nicht stückchenweise.
weiterhin weiss ich gar nicht sicher, ob das $bla != ´´; geht. kanns gerade nicht testen. probiers mal mit if(strlen($bla)> 0).
zeig aber auf jedenfall mal wie dein letztendliches statement aussieht.

Antwort 13 von rabies

Klar geht das - Auskommentiert heißt das einfach so viel wie "Wenn String nicht leer ist".

Aber hast schon recht - das mit dem strlen wäre die saubere Lösung dazu.

Dass der Fehler allerdings schon in Zeile 1 stattfindet, verwundert mich. Kannst Du mal versuchsweise die Sache nicht mit irgendwelchen "Hochkommatas" machen, sondern so:

$akquery="UPDATE auftrag SET AK=."$ak". WHERE ID=".$id;

Ich hab´s schon oft genug erlebt, dass irgendwelche Fehler an einfachen Anführungszeichen lagen...

Ansonsten mal spaßenshalber direkt in der MySQL-Konsole überprüfen, was Dir das ganze da so entgegenwirft...

Sven.

Antwort 14 von rabies

Wargh... falsch.

$akquery="UPDATE auftrag SET AK=."$ak". WHERE ID=".$id; = NONSENS!

- Man notiere: das nächste mal überles´ ich gleich alles noch einmal und denk´ vor dem Schreiben nach -

$akquery="UPDATE auftrag SET AK=".$ak." WHERE ID=".$id;

so sollte es aussehen... Sorry.

Antwort 15 von tomham

Zitat:
zeig doch mal was in $akquery steht nach dem die ganzen ifs durchlaufen sind.

Hab ich gemacht: da stimmt alles

Zitat:
ausserdem solltest du das mysql_query einfach nur ganz zum schluss aufrufen und es da nicht in jede if abfrage schreiben, so dass du das update in einem rutsch machst und nicht stückchenweise.


Wie macht man dann das wenn eines der argumente leer ist?

Zitat:
Ansonsten mal spaßenshalber direkt in der MySQL-Konsole überprüfen, was Dir das ganze da so entgegenwirft...

Hab es direkt aus der MySQL-Konsole (die UPDATE-Anweisung). Da läuft es ohne Probleme (wenn eines leer ist wird übersprungen

Zitat:
Wargh... falsch.

$akquery="UPDATE auftrag SET AK=."$ak". WHERE ID=".$id; = NONSENS!

- Man notiere: das nächste mal überles´ ich gleich alles noch einmal und denk´ vor dem Schreiben nach -

$akquery="UPDATE auftrag SET AK=".$ak." WHERE ID=".$id;

so sollte es aussehen... Sorry.

Wo ist da der Unterschied zwischen dem ersten und dem Zweiten ?? ;-)

Antwort 16 von disco

wenn ein argument leer ist, dann schreib es einfach nicht rein (bzw. veränder es nicht). du kannst ja immer weitere teilstrings anfügen:

$akquery = "UPDATE tabelle SET name=´$name´ ";
if(eine bedingung)
{
$akquery = $akquery.",nachname=´$nachname´ ";
}
$akquery = $akquery. "WHERE id = $id";

die hockommatas solltest du nur weglassen,wenn du in felder des typs int (usw.) schreibts. bei strings gibts da eher mehr nachteile, als vorteile.

poste bitte trotzdem mal den inhalt von $akquery.

der unterschied bei rabies string lag daran dass er beim ersten mal den "." zur verknüpfung der strings innerhalb des teilstrings hatte und so keine verknüpfung entstehen konnte.
"so ist"."das richtig"

g,
disco

Antwort 17 von tomham

Habe das alles jetzt so umgeändert wie du gesagt hast, aber es bleibt beim gleichen Fehler (´´ in Zeile 1)

Sieht jetzt so aus:

 	if(strlen($ak)>0){
	$akquery="UPDATE auftrag SET AK=´$ak´";
	}
	if(strlen($eingang)>0){
	$akquery=$akquery.", Eingang=$eingang";
	}
	if(strlen($kunde)>0){
	$akquery=$akquery.", Kunde=$kunde";
	}
	if(strlen($bezeichnung)>0){
	$akquery=$akquery.", Bezeichnung=´$bezeichnung´";
	}
	if(strlen($stück)>0){
	$akquery=$akquery.", Stück=´$stück´";
	}
	if(strlen($termin)>0){
	$akquery=$akquery.", Termin=$termin";
	}
	if(strlen($arbid)>0){
	$akquery=$akquery.", Arb_ID=$arbid";
	}
	if(strlen($erledigt)>0){
	$akquery=$akquery.", Erledigt=$erledigt";
	}
	if(strlen($ausgeliefert)>0){
	$akquery=$akquery."Ausgeliefert=$ausgeliefert";
	}
	if(strlen($zeitraum)>0){
	$akquery=$akquery.", Zeitraum=$zeitraum";
	}
	if(strlen($verbleibend)>0){
	$akquery=$akquery.", Verbleibend=$verbleibend";
	}
	if(strlen($differenz)>0){
	$akquery=$akquery.", Differenz=$differenz";
	}
	if(strlen($fertig)>0){
	$akquery=$akquery.", Fertig=$fertig";
	}
	$akquery=$akquery." WHERE ID=$id";
	mysql_query($akquery, $ServerConnect) or die(mysql_error());    


ID, AK, Kunde, Arb_ID, Zeitraum, Verbleibend, Differenz und Fertig sind Int
Eingang, Termin, Erledigt und Ausgeliefert sind Datum

der Rest sind normale Strings

Und ich bekomms nicht hin ...

Antwort 18 von disco

zeig doch bitte mal endlich $akquery.
einfach mit print($akquery) nach
$akquery=$akquery." WHERE ID=$id"; ausgeben lassen.

Antwort 19 von tomham

Hat sich erledigt, hab es geschafft !!

ICH HABS !! ICH HABS !! ICH HABS !! ICH HABS !!
Ich hatte nach dem senden keine ID mehr, ging durch das Senden verloren (hab sie nicht mitgesendet), aber jetzt gehts !!
ES GEHT !! ES GEHT !! ES GEHT !! ES GEHT !! ES GEHT !!
Nur werden jetzt die Datums gelösht, aber das werde ich auch noch hinkriegen.

Danke Disco für deine Hilfe, danke auch an alle anderen!!

mfg.
Tomham

Antwort 20 von disco

schön.
das mit dem datum könnte an den fehlenden hochkommatas liegen. hab aber wie schon erwähnt keine möglichkeit das hier zu testen.

Antwort 21 von tomham

Es lag an den Hochkommas, hab sie schon eingefügt.
Nu läuft alles zu meiner vollen zufriedenheit, die restlichen Fehler suche ich mir selber raus (ist nur mehr eine Übergabe einer Abfrage an eine andere, werd ich mitm Query-String machen, aber ich schaffs !!)

Ich hoffe nächstes mal kann ich dir helfen ;-)

mfg.
Tomham

Antwort 22 von tomham

Ich packs doch nicht alleine ...

Und zwar habe ich jetzt ein Suchformular geschrieben für meine Tabelle.
Wenn ich jetzt auf suchen klicke wechsle ich zwar auf eine andere Seite, aber meine Suchanfrage ist futsch und ich erhalte eine leere Seite. Ich finde aber keinen Fehler. zur Platzersparnis habe ich die datei mal online gestellt --> http://home.pages.at/webtommy/finder.php
Weiß nicht wie man nur den Code anzeigen kann ohne dass der PHP dazwischenschaltet.
Vielleicht kann mir da auch wer helfen.

mfg.
Tomham

Antwort 23 von rabies

Den Quelltext da meinst Du aber nicht ernst, oder? ... Brrrr, keine Endtags für body, html und form und select... Der W3C-Validator würde sich des Herzens freuen.

Schön und gut, dass das Script da online liegt - aber da ist auch kein Submitbutton?! Also nix da mit Reaktion. Der PHP-Quelltext wäre vllt. hilfreicher. ;x Also her damit. ;D

Sven.