Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Videolainaamo PHP+SQL

Sivun loppuun

jarspa [18.04.2005 20:50:40]

#

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>";
?>
        &nbsp; </td>
    </tr>
    <tr bgcolor="#FFCC33">
      <td>&nbsp;</td>
      <td>&nbsp;</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>&nbsp; </p>

Olga [18.04.2005 23:30:33]

#

$_POST käyttöön. http://mureakuha.com/keskustelut/2?8936

jarspa [21.04.2005 09:06:14]

#

Tosta $_POST keskustelusta ei kyl saa mitään irti

Olga [21.04.2005 09:22:18]

#

Vaihda $muuttuja -> $_POST['muuttuja'] ja $lerssi -> $_POST['lerssi'] ja niin edelleen.

jarspa [21.04.2005 09:50:48]

#

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ä...

Olga [21.04.2005 10:10:26]

#

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.

Blaze [21.04.2005 13:53:54]

#

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']}");

Olga [21.04.2005 14:02:25]

#

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'] . "'");

jarspa [22.04.2005 15:58:15]

#

Jees nyt TOIMII! Paljon kiitoksia vinkeistä...

ajv [22.04.2005 17:29:43]

#

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.

Olga [22.04.2005 19:36:52]

#

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 :)

ajv [22.04.2005 20:22:21]

#

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.

Olga [22.04.2005 22:36:08]

#

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.

jarspa [24.04.2005 08:01:58]

#

Tuli pieni uusi ongelma tän homman kanssa... Eli jos leffan nimessä on välejä niin näiden kohdalla tallennus ei toimi. Mikä avuksi?

ajv [24.04.2005 09:45:28]

#

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

jarspa [24.04.2005 12:41:38]

#

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>&nbsp;</td>
      <td>&nbsp; </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>";
}

?>

ajv [24.04.2005 15:35:27]

#

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

uffis [24.04.2005 16:45:31]

#

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.

jarspa [24.04.2005 20:11:51]

#

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 :)

Juice [25.04.2005 20:19:54]

#

Jospa katsottaisiin PHP:n manuaalia: https://www.php.net/manual/fi/function.mysql-real-escape-string.php


Sivun alkuun

Vastaus

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

Tietoa sivustosta