Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP Dropdown list while-funktiolla ja muuttujalla

Sivun loppuun

Othnos [30.11.2009 18:20:51]

#

Tervehdys hyvät Ohjelmointiputkan gurut.

Olen uusi PHP:n ja MySQL:än ihmeellisessä maailmassa joten tarvitsen kipeästi neuvoja, koska projektin olisi hyvä olla valmis vuodenvaihteeseen mennessä.

Eli tilanne on se, että luon taulukon while-funktiolla ja kyseiseen tauluun tulee dropdown list johon pitäisi saada tuotua nimet toisesta taulukosta, jonne tullaan lisäämään nimiä. Olisin kiitollinen tietojen hausta asiakkaat-taulusta ja sen liittämisestä dropdown listiin.

Karsin koodin turhat osat pois, että lainauksesta ei tulisi niin pitkä.

<?php

//Toisen taulun muuttujan kutsuminen näin?
$sql2 = "SELECT nimi FROM asiakkaat";
$result2 = mysql_query($sql2) or trigger_error(mysql_error(),E_USER_ERROR);

$sql = "SELECT tuntikortti.id,pvm,tunnit,tunnit50,tunnit100,kilometrit,
kokopvr,osapvr,atkorvaus,lomapaivat,asiakas,projekti,
tyo,urakka,tarv FROM tuntikortti WHERE kayttaja='$username' AND poisto=0 ORDER BY pvm, asiakas";
			$result = mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
			while(list($id,$pvm,$tunnit,$tunnit50,$tunnit100,$kilometrit,
$kokopvr,$osapvr,$atkorvaus,$lomapaivat,$asiakas,$projekti,
$tyo,$urakka,$tarv)=mysql_fetch_row($result)){

			$checkedu = ($urakka==1) ? 'checked="checked"' : '';
			$checkedt = ($tarv==1) ? 'checked="checked"' : '';

			echo '<tr>';
			echo '<form action='.$_SERVER['PHP_SELF'].' method="post">';
			echo '<td><input type="date" name="pvm" value="'.date("Y.m.d",strtotime($pvm)).'"></td>';
			echo '<td><input type="int" name="tunnit" value="'.$tunnit.'"></td>';
			echo '<td><input type="int" name="tunnit50" value="'.$tunnit50.'"></td>';
			echo '<td><input type="int" name="tunnit100" value="'.$tunnit100.'"></td>';
			echo '<td><input type="int" name="kilometrit" value="'.$kilometrit.'"></td>';
			echo '<td><input type="int" name="kokopvr" value="'.$kokopvr.'"></td>';
			echo '<td><input type="int" name="osapvr" value="'.$osapvr.'"></td>';
			echo '<td><input type="int" name="atkorvaus" value="'.$atkorvaus.'"></td>';
			echo '<td><input type="int" name="lomapaivat" value="'.$lomapaivat.'"></td>';

//Tässä kohdassa ongelman ydin
			echo '<td><select name="asiakas"><option SELECTED>'.$asiakas.'</option>';
			while(list($asiakkaat)=mysql_fetch_row($result)){
				echo '<option value="'.$asiakkaat.'">'.$asiakkaat.'</option>';
				}
			echo '</select></td>';
//end
			echo '<td><input type="text" name="projekti" value="'.$projekti.'"></td>';
?>

-Othnos

Othnos [30.11.2009 22:01:10]

#

Kokeiltuani tarpeeksi löysin ratkaisun ongelmaan. Guruilla parempaa ratkaisua kyseiseen tilanteeseen? Alkaako jo näinkin lyhyt pätkä kuormittamaan palvelinta tarpeettomasti?

<?php

$sql = "SELECT tuntikortti.id,pvm,tunnit,tunnit50,tunnit100,kilometrit,
kokopvr,osapvr,atkorvaus,lomapaivat,asiakas,projekti,
tyo,urakka,tarv FROM tuntikortti WHERE kayttaja='$username' AND poisto=0 ORDER BY pvm, asiakas";
			$result = mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
			while(list($id,$pvm,$tunnit,$tunnit50,$tunnit100,$kilometrit,
$kokopvr,$osapvr,$atkorvaus,$lomapaivat,$asiakas,$projekti,
$tyo,$urakka,$tarv)=mysql_fetch_row($result)){

			$checkedu = ($urakka==1) ? 'checked="checked"' : '';
			$checkedt = ($tarv==1) ? 'checked="checked"' : '';
//Tietojen hakeminen toisesta tietokannasta tässä vaiheessa
			$sql2 = "SELECT nimi FROM asiakkaat";
			$result2 = mysql_query($sql2) or trigger_error(mysql_error(),E_USER_ERROR);

			echo '<tr>';
			echo '<form action='.$_SERVER['PHP_SELF'].' method="post">';
			echo '<td><input type="date" name="pvm" value="'.date("Y.m.d",strtotime($pvm)).'"></td>';
			echo '<td><input type="int" name="tunnit" value="'.$tunnit.'"></td>';
			echo '<td><input type="int" name="tunnit50" value="'.$tunnit50.'"></td>';
			echo '<td><input type="int" name="tunnit100" value="'.$tunnit100.'"></td>';
			echo '<td><input type="int" name="kilometrit" value="'.$kilometrit.'"></td>';
			echo '<td><input type="int" name="kokopvr" value="'.$kokopvr.'"></td>';
			echo '<td><input type="int" name="osapvr" value="'.$osapvr.'"></td>';
			echo '<td><input type="int" name="atkorvaus" value="'.$atkorvaus.'"></td>';
			echo '<td><input type="int" name="lomapaivat" value="'.$lomapaivat.'"></td>';

//Tätä ei tarvinnut edes muuttaa kummemmin.
			echo '<td><select name="asiakas"><option SELECTED>'.$asiakas.'</option>';
			while(list($asiakkaat)=mysql_fetch_row($result2)){
				echo '<option value="'.$asiakkaat.'">'.$asiakkaat.'</option>';
				}
			echo '</select></td>';
			echo '<td><input type="text" name="projekti" value="'.$projekti.'"></td>';
?>

Metabolix [30.11.2009 22:06:04]

#

Jos kerran aina listaat kaikki asiakkaat, voit hakea ne taulukkomuuttujaan jo ihan koodisi alussa. Turha niillä on monta kertaa MySQL:ää vaivata. Muuten ratkaisu on aivan oikea. Tyylipisteitä voisi vielä napata sillä, että tulostaisi asiakkaat aakkosjärjestyksessä ja myös valitun asiakkaan vain yhteen kertaan. Lisäksi suosittelen htmlspecialchars-funktiota kaikissa tulostuksissa.

<?php
echo '<td><input type="text" name="projekti" value="'.htmlspecialchars($projekti).'"></td>';

Othnos [08.12.2009 18:08:25]

#

Kiitos Metabolix vastauksestasi. Kerkesin vasta nyt perehtymään taas paremmin ohjelmaani, joten anteeksi topicin nostaminen. Aluksi yritin hakea muuttujia ennen while:ä, mutta jostain syystä tulosti aina vain ensimmäisen rivin oikein ja rivejä ollessa useampia oli lopuissa dropdown listit tyhjiä.

Uutena ongelmana minun pitää hakea dropdown listiin asiakkaat taulusta "Index" ja sama asiakas saisi tulostua vain kerran. (Käyttäisin muuten asiakkaat taulua, mutta hakuehdoiksi pitäisi saada Index taulun tietoja)

Index taulu:
Asiakas 1 Projekti 1
Asiakas 1 Projekti 2
Asiakas 2 Projekti 1
Asiakas 2 Projekti 2
Asiakas 3 Projekti 1
Asiakas 3 Projekti 2

Index tauluun tietojen lisäämiseen käytän erillistä "Asiakkaat" taulua. Onko tapa huono? Ja kuinka viittaus taulusta Index tauluun Asiakkaat tapahtuu? Id:n perusteella?

Asiakkaat taulu:
Asiakas 1
Asiakas 2
Asiakas 3

Othnos [08.12.2009 19:12:35]

#

Hmm... En pysty enää muokkaamaan edellistä viestiä, joten postaan lyhyen esimerkin viimeisestä ongelmasta. Onko helpompaa tapaa kirjoittaa kyseistä koodia?

<?php

			//Asiakasid:n säilytys
			$asiakasid=$_POST['asiakas'];
			//Asiakkaan nimen hakeminen id:n perusteella <option SELECTED> kohtaan
			$sql="SELECT nimi FROM asiakkaat WHERE id='$asiakasid'";
			$result=mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
			$result2=mysql_fetch_array($result);
			$asiakasnimi=$result2['nimi'];
			//Kenttien tulostus
			echo '<p>PVM: <input type="date" name="pvm" value="'.date("Y.m.d", time()).'">';
			echo 'Asiakas: <select name="asiakas"><option SELECTED>'.$asiakasnimi.'</option>';
			//Kaikkien asiakkaiden haku ja tulostus dropdown listiin
			$sql="SELECT nimi,id FROM asiakkaat";
			$result=mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
			while(list($asiakkaat,$id)=mysql_fetch_row($result))
			{
				echo '<option value="'.$id.'">'.$asiakkaat.'</option>';
			}
			echo '</select><input type="submit" name="paivitys" value="Päivitä">';

			//Projektin haku Asiakkaan nimellä
			if(isset($_POST['paivitys']))
			{
				$asiakasid=$_POST['asiakas'];
				$projektilisays=$_POST['projektilisays'];
				$sql = "SELECT projekti FROM projektit WHERE nimi='$asiakasid'";
				$result = mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
				echo 'Projekti: <select name="projekti">';
				while(list($projektit)=mysql_fetch_row($result))
				{
					echo '<option value="'.$projektit.'">'.$projektit.'</option>';
				}
				echo '</select>';
			}

?>

Metabolix [08.12.2009 20:25:43]

#

Kannattaa ainakin ottaa tuo ensimmäinen asiakaskysely pois ja vain while-silmukassa tarkistaa, että jos tulostettavan asiakkaan ID on valittu, tulostetaankin valinta valittuna.

Othnos kirjoitti:

SELECT projekti FROM projektit WHERE nimi='$asiakasid'

Tässä on selvästi jokin suunnitteluvirhe. Aina tuollaisissa tilanteissa pitäisi viitata toiseen tauluun id:n perusteella, ja myös kentän nimen kannattaisi olla esimerkiksi asiakas_id. (Loogisesti projekti-taulun nimi-kenttä sisältää projektin nimen eikä suinkaan asiakkaan ID-numeroa.) Lue MySQL-oppaasta osa 8 ja osa 9, joissa kerrotaan usean taulun käytöstä.

Othnos [08.12.2009 21:42:51]

#

Kerkesin jo ennen vastaustasi perehtyä oppaan 9 osaan tarkemmin, jolloin kuten huomata saatoit, muutin taulut viittaaviksi. Ja tuo mainitsemasi virhe johtui siitä, koska vasta jälkikäteen aloin käyttämään viittauksia, joten nimet jäi muuttamatta.Postaan vielä tuon muokatun pikkuisen koodin pätkän tähän varmistaakseni, että tein asiakaslistauksen oikein.

Kiitos jälleen todella hyvistä vihjeistä ja rakentavasta palautteesta. Jo pienellä aivojen käytöllä ja tuolla vihjeellä sain dropdown listin, sekä ennen kaikkea, nimeämisen suht järkeväksi.

<?php

			//Kenttien tulostus

			echo '<p>PVM: <input type="date" name="pvm" value="'.date("Y.m.d", time()).'">';
			echo 'Asiakas: <select name="asiakkaat_id">';

			//Kaikkien asiakkaiden haku ja tulostus dropdown listiin

			$sql="SELECT id,nimi FROM asiakkaat ORDER BY nimi";
			$result=mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
			echo '<option value="'.$asiakkaat_id.'" SELECTED>'.$asiakkaat_nimi.'</option>';
			while(list($asiakkaat_id,$asiakkaat_nimi)=mysql_fetch_row($result))
			{
				if($asiakkaat_id==$_POST['asiakkaat_id'])
				{
					echo '<option value="'.$asiakkaat_id.'" SELECTED>'.$asiakkaat_nimi.'</option>';
				}
				else
				{
					echo '<option value="'.$asiakkaat_id.'">'.$asiakkaat_nimi.'</option>';
				}
			}
			echo '</select><input type="submit" name="paivitys" value="Päivitä">';

			//Projektin haku Asiakkaan nimellä

			if(isset($_POST['paivitys']))
			{
				$asiakkaat_id=$_POST['asiakkaat_id'];
				$sql="SELECT id,nimi FROM projektit WHERE asiakkaat_id='$asiakkaat_id' ORDER BY nimi";
				$result=mysql_query($sql) or trigger_error(mysql_error(),E_USER_ERROR);
				echo 'Projekti: <select name="projektit_id">';
				while(list($projektit_id,$projektit_nimi)=mysql_fetch_row($result))
				{
					echo '<option value="'.$projektit_id.'">'.$projektit_nimi.'</option>';
				}
				echo '</select>';
			}

?>

Metabolix [08.12.2009 21:59:16]

#

Nythän tuossa on ennen silmukkaa ylimääräinen echo-rivi. Muuten meni ihan oikein, paitsi se aiemmin mainitsemani htmlspecialchars puuttuu edelleen tulostuksista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta