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
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>'; ?>
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>';
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
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>'; } ?>
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ä.
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>'; } ?>
Nythän tuossa on ennen silmukkaa ylimääräinen echo-rivi. Muuten meni ihan oikein, paitsi se aiemmin mainitsemani htmlspecialchars puuttuu edelleen tulostuksista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.