Tere!
Olen tehnyt pieni muotoisen lainaus sydeemin joka laittaa SQL-kantaan merkinnän lainauksesta. Mikäköhän mättää tossa koodissa kun painaa lainattu namiskaa niin ei tee mitään! Sama juttu kun yrittää palauttaa leffaa.
<form name="form1" method="post" action=""> <h2>Lainaamo</h2> <p> <?php $yhteys=mysql_connect("localhost","","") or die("Tietokantayhteyttä ei voitu avata"); mysql_select_db("leffa") or die ("Tietokantaa ei voitu avata"); $today = date ("d.m.y"); ?> </p> <table width="57%" border="0"> <tr bgcolor="#FFCC33"> <td width="32%">Leffannimi</td> <td width="68%"> <?php $mysql_haku = mysql_query("SELECT leffannimi FROM leffat ORDER BY leffannimi"); print "<select name='leffat' id='leffat'>"; while($mysql_tiedot = mysql_fetch_array($mysql_haku)){ print "<option value=".$mysql_tiedot["leffannimi"].">".$mysql_tiedot["leffannimi"]."</option>"; } print "</select>"; ?> </td> </tr> <tr bgcolor="#FFCC33"> <td> </td> <td> </td> </tr> <tr bgcolor="#FFCC33"> <td>Lainaan</td> <td bgcolor="#FFCC33"><select name="lainaaja" id="lainaaja"> <option value=" "> </option> <option value="Viki">Viki</option> <option value="Juha">Juha</option> <option value="Eini">Eini</option> <option value="Pekka">Pekka</option> <option value="Tapsa">Tapsa</option> <option value="Mika">Mika</option> </select> <input name="lainattu" type="submit" id="lainattu" value="Lainattu"> </td> </tr> <tr bgcolor="#FFCC33"> <td>Palautettu </td> <td><input name="pal" type="submit" id="pal" value="Palautettu"> <?php if(isset($_POST['lainattu'])) { mysql_query("UPDATE leffat SET lainassa = '$lainaaja',lainauspvm = '$today' WHERE leffannimi = '$leffat'"); print "<b>Lainattu lainaajalle $lainaaja</b>"; } if(isset($_POST['pal'])) { mysql_query("UPDATE leffat SET lainassa = 0,lainauspvm = 0 WHERE leffannimi = '$leffat'"); print "<b>$lainassa oli todella fixu ja palautti leffan $nimi!</b>"; } ?> </td> </tr> </table> <input name="lainatut" type="submit" id="lainatut" value="Lainassa"> </form> <?php if(isset($_POST['lainatut'])) { $laina=mysql_query("SELECT leffannimi,lainassa FROM leffat WHERE lainassa > '0'"); echo "<table border>"; echo "<tr><td><b>Leffan nimi</b></td><td><b>Lainaaja</b></td></tr>"; //käydään leffat läpi for ($i = 0; $i < mysql_num_rows($laina); $i++) { //haetaan leffan nimi, kategoria ja cd-määrä muuttujiin $leffannimi = mysql_result($laina, $i, "leffannimi"); $lainaaja = mysql_result($laina, $i, "lainassa"); echo "<tr><td>$leffannimi</td><td>$lainaaja</td></tr>"; } } ?> <p> </p>
$_POST käyttöön. http://mureakuha.com/keskustelut/2?8936
Tosta $_POST keskustelusta ei kyl saa mitään irti
Vaihda $muuttuja -> $_POST['muuttuja'] ja $lerssi -> $_POST['lerssi'] ja niin edelleen.
mysql_query("UPDATE leffat SET lainassa = $_POST['lainaaja'],lainauspvm = $_POST['today'] WHERE leffannimi = $_POST['leffat']");
Koitin näin mutta ei toiminut! Register Globals on päällä...
Sen kummemmin muuhun koodiin kantaa ottamatta... noihin tagien attribuutteihin tulee laittaa ne lainausmerkit ympärille. Jos sulla on esimerkiksi leffan nimi "Pomppivat Banaanit" ja sulla lukee tauhkassa <option value=Pomppivat Banaanit>Pomppivat Banaanit</option>, niin eihän siitä mitään tule. Kyselyssä ilmeisesti silloin etsitään leffaa "Pomppivat", jollaista siellä ei kuitenkaan ole. Kannattaa muutenkin käyttää jonkinlaista id-tunnusta kaikissa kannan tauluissa ja hakea tavaraa sen perusteella.
jarspa kirjoitti:
mysql_query("UPDATE leffat SET lainassa = $_POST['lainaaja'],lainauspvm = $_POST['today'] WHERE leffannimi = $_POST['leffat']");
mysql_query("UPDATE leffat SET lainassa = {$_POST['lainaaja']},lainauspvm = {$_POST['today']} WHERE leffannimi = {$_POST['leffat']}");
Merkkimuotoisten kenttien ympärille pitää pistää noi hipsut. Edellisten lisäksi suosittelen vielä laittamaan päivämäärän kantaan joko kannan omassa muodossa tai vaihtoehtoisesti unix-timestamppina, jolloin kyselyiden teko jatkossa helpottuu ja aikaa voi muotoilla haluamallaan tavalla ilman kikkailuja.
mysql_query("UPDATE leffat " . "SET lainassa='" . $_POST['lainaaja'] . "', lainauspvm='" . $today . "' " . "WHERE leffannimi='" . $_POST['leffat'] . "'");
Jees nyt TOIMII! Paljon kiitoksia vinkeistä...
Olga kirjoitti:
Edellisten lisäksi suosittelen vielä laittamaan päivämäärän kantaan joko kannan omassa muodossa tai vaihtoehtoisesti unix-timestamppina, jolloin kyselyiden teko jatkossa helpottuu ja aikaa voi muotoilla haluamallaan tavalla ilman kikkailuja.
Juu, itse suosittelisin 110-prosenttisesti käyttämään kannan omaa aikaleimaa, jolloin pystyy käyttämään tietokannan omia työkaluja ajan kanssa kikkailemiseen. Ainakin minun tietojeni pohjalta ovat tietokantojen omat työkalut paljon tehokkaampia ja monipuolisempia kuin php:n ajankäsittelyfunktiot.
ajv kirjoitti:
Juu, itse suosittelisin 110-prosenttisesti käyttämään kannan omaa aikaleimaa, jolloin pystyy käyttämään tietokannan omia työkaluja ajan kanssa kikkailemiseen. Ainakin minun tietojeni pohjalta ovat tietokantojen omat työkalut paljon tehokkaampia ja monipuolisempia kuin php:n ajankäsittelyfunktiot.
Kyllähän unix-timestamppia käsittelee siinä missä kannan omaakin päivämäärämuotoa, ainakin MySQL:ssä (FROM_UNIXTIME-funktio). Mutta totta on että kannan oma muoto on varmasti paljon tehokkaampi. Itselläni kuitenkin vaakakupissa painaa se, että koodin (ja tietokannat) saa helposti siirrettyä johonkin toiseen ympäristöön, eikä päivämääriä tarvitse muuttaa miksikään. Mutta tämä lienee ihan makuasia :)
Olga kirjoitti:
Itselläni kuitenkin vaakakupissa painaa se, että koodin (ja tietokannat) saa helposti siirrettyä johonkin toiseen ympäristöön, eikä päivämääriä tarvitse muuttaa miksikään. Mutta tämä lienee ihan makuasia :)
No eikös tuo tietokantojen (ainakin MySQL ja MSSQL) standardin mukainen muoto ole se helpoiten muihin ympäristöihin muunnettava muoto? Vai tarkoitatko eri php-ympäristöihin? Muistaakseni MSSQL ei edes osaa muuntaa UNIX-aikaleimaa luettavaan muotoon (saatan olla väärässä).
Mutta tosiaan omissa skripteissä tuolla nyt ei ole juurikaan merkitystä. Itsekkin tallentelin hyvin pitkään ajat UNIX-aikoina ja ikinä mitän ongelmia ollut. Sen sijaan paljon huonompi vaihtoehto on tallentaa aika jossakin omassa muodossa.
ajv kirjoitti:
Itsekkin tallentelin hyvin pitkään ajat UNIX-aikoina ja ikinä mitän ongelmia ollut. Sen sijaan paljon huonompi vaihtoehto on tallentaa aika jossakin omassa muodossa.
Näinhän se on. Mutta voi olla että oikeastaan suurin syy tuon standardin käyttämättömyydelle on laiskuus, eli ei vaan jaksa opetella :) Ja toisaalta ihan hyvin olen tähän saakka tullut toimeen. Tietty kun kannan koko kasvaa suuremmaksi, lienee parasta ottaa se manuaali kauniiseen käteen ja opetella tekemään ne jutut oikein.
Tuli pieni uusi ongelma tän homman kanssa... Eli jos leffan nimessä on välejä niin näiden kohdalla tallennus ei toimi. Mikä avuksi?
Ehkäpä tässäkin on yksi syy, miksi tietokannoissa käytetään id:nä yleensä numeroa.
"WHERE leffannimi='" . $_POST['leffat'] . "'");
kannattaisi laittaa muotoon
"WHERE LeffaId='" . $_POST['LeffaId'] . "'");
ja tuo LeffaId on jokin UNIIKKI kokonaisluku, MySQL:ssä yleensä int auto_increment primary key. Titenkin joudut hieman koodejasi muuttelemaan ja ehkä jopa kantarakennetta, jos leffoilla ei vielä ole omaa uniikkia id-numeroa
Ihmettelen vaan sitä että miten sit aikasempi tekemäni versio tosta toimi? Siinä ei tulostettu kannasta leffoja optioniin vaan haettiin erilliseen kenttään hakusanalla.
Se toimi vaikka leffan nimessä on välejä...
<?php if(isset($_POST['hae'])) { $haku=mysql_query("SELECT leffannimi,lainassa FROM leffat WHERE leffannimi LIKE '%$haku%'"); $rivi=mysql_fetch_row($haku); } ?> </p> <table width="57%" border="0"> <tr bgcolor="#FFCC33"> <td width="32%"><p>Leffan haku</p></td> <td width="68%"><input name="haku" type="text" id="haku2"> <input name="hae" type="submit" id="hae3" value="Hae lainattava leffa"> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr bgcolor="#FFCC33"> <td>Leffannimi</td> <td><input name="nimi" type="text" id="nimi" value="<?php print $rivi[0];?>"> </td> </tr> <tr bgcolor="#FFCC33"> <td>Lainassa?</td> <td><input name="lainassa" type="text" id="lainassa" value="<?php print $rivi[1];?>"></td> </tr> <tr bgcolor="#FFCC33"> <td>Lainaan</td> <td bgcolor="#FFCC33"><select name="lainaaja" id="lainaaja"> <option value=" "> </option> <option value="Viki">Viki</option> <option value="Juha">Juha</option> <option value="Eini">Eini</option> <option value="Pekka">Pekka</option> <option value="Tapsa">Tapsa</option> <option value="Mika">Mika</option> </select> <input name="lainattu" type="submit" id="lainattu2" value="Lainattu"> </td> </tr> <tr bgcolor="#FFCC33"> <td>Palautettu </td> <td><input name="pal" type="submit" id="pal" value="Palautettu"> </td> </tr> </table> <?php if(isset($_POST['lainattu'])) { mysql_query("UPDATE leffat SET lainassa = '$lainaaja',lainauspvm = '$today' WHERE leffannimi = '$nimi'"); print "<b>Lainattu lainaajalle $lainaaja</b>"; } if(isset($_POST['pal'])) { mysql_query("UPDATE leffat SET lainassa = 0,lainauspvm = 0 WHERE leffannimi = '$nimi'"); print "<b>$lainassa oli todella fixu ja palautti leffan $nimi!</b>"; } ?>
Kyllähän sen varmaan pitäisikin toimia, mutta suosittelen silti harkitsemaan tuon uniikin id-numeron käyttöä. Yleensähän "vuokraamoissa" on useampi kappale samaa elokuvaa. Mites ajattelit toteuttaa sen, että näistä vain yksi merkitään lainattaessa lainatuksi?
Lisäksi uniikin numeerisen kentän hakeminen on ehkä 100 x nopeampaa kuin fulltext-search
Tarkistakaa nyt hyvät ihmiset se käyttäjän syöte ennen kuin lisäätte sitä kyselyyn. Esim. funktio mysql_real_escape_string auttaa MySQL:n tapauksessa.
uffis kirjoitti:
Tarkistakaa nyt hyvät ihmiset se käyttäjän syöte ennen kuin lisäätte sitä kyselyyn. Esim. funktio mysql_real_escape_string auttaa MySQL:n tapauksessa.
Jaahas! Mitenköhän toi toimii :)
Jospa katsottaisiin PHP:n manuaalia: https://www.php.net/manual/fi/function.mysql-real-escape-string.php
Aihe on jo aika vanha, joten et voi enää vastata siihen.