Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kaksi kenttää tietokannasta

Sivun loppuun

prakka [09.08.2007 18:56:41]

#

Rakennan eräälle pienelle yritykselle tietokoneen pakettilaskuria php:llä, ja se kaatuu seuraavaan lausekkeeseen:

		<?php // Laskuri tekee laskun ja tulostaa niin paljon tavaraa kuin myslikulhosta löytyy
		for($laskuri = 0; $laskuri < mysql_numrows($tulosprossu775); $laskuri++) { ?>
		<option><?php echo mysql_result($tulosprossu775,$laskuri,"hinta","nimi") or die ("virhe"); ?></option> <?php } ?>

Osaisitteko sanoa mikä tuossa on vikana? Se ei siis sano sitäkään että taulua ei olisi kun se queraa sitä.

E: Toimii kun laittaa vain kun poistaa jomman kumman, "hinta" tai "nimi", mutta tahdon että se näyttää molemmat. Lisäksi se tulostaa nimen kohdalla luvun yksi joka on siis ensimmäinen asia (en nyt muista miten sen sieltä näin ja että mikä se oli :P) ko. taulussa.

E2: Se oli 1 kpl ko. rivejä... Miten siis sen saa tulostamaan sen oikean tiedon?

Antti Laaksonen [09.08.2007 19:28:02]

#

Funktiolla mysql_result ei voi noutaa kerrallaan kuin yhden kentän. Mutta voit kutsua funktiota kahdesti ja yhdistää funktioiden paluuarvot ja tarvittavat muut merkkijonot pisteillä.

prakka kirjoitti:

Lisäksi se tulostaa nimen kohdalla luvun yksi joka on siis ensimmäinen asia (en nyt muista miten sen sieltä näin ja että mikä se oli :P) ko. taulussa.

Mikä on "ensimmäinen asia"? Onko SQL-kysely oikea?

prakka [09.08.2007 19:29:31]

#

Antti Laaksonen kirjoitti:

prakka kirjoitti:

Lisäksi se tulostaa nimen kohdalla luvun yksi joka on siis ensimmäinen asia (en nyt muista miten sen sieltä näin ja että mikä se oli :P) ko. taulussa.

Mikä on "ensimmäinen asia"? Onko SQL-kysely oikea?

Siis se olikin "Kpl rivejä"...

$prossu775 = "SELECT nimi,hinta FROM intel775 ORDER BY nimi";
$tulosprossu775 = mysql_query($prossu775) or die ("taulua ei olemassa!");

Toi ORDER BY on pakko pitää kun ne pitäisi saada nimijärjestykseen, vai onko siihen jokin muu kikka php:llä? En nyt ainakaan muista moista...

E: Lisäksi kysyn miten on mahdollista ottaa tietokannasta tieto selville, että se ottaa lomakkeesta esim. prossun nimen, sitten käsittelijä etsii sillä nimellä tietokannasta ja valitsee sen hinnan?

Antti Laaksonen [09.08.2007 19:46:25]

#

Tiedot kannattaa järjestellä nimenomaan SQL-kyselyssä, niin kuin olet tehnyt. Mutta en vieläkään ymmärrä, mitä skriptisi tulostaa nykyisellään ja mitä sen pitäisi tulostaa. Mistä "Kpl rivejä" ilmestyy ja mikä on "oikea tieto"? Ja onko tarkoitus saada aikaan alasvetovalikko, jonka jokainen kohta on yksi tietokannasta haettu arvopari (hinta ja nimi), vai jotain muuta?

prakka [09.08.2007 19:51:16]

#

Voit kokeilla http://verkkolinja.org/konepaketti/intel775.php

Kpl rivejä ilmestyy kun katsoo phpmyadminissa erillisiä arvoja...

Oikea tieto on "Intel C2D E4400"
Ja kyllä, alasvetolaatikko oli tarkoituksena tehdä, jossa joka kohta on yksi tietokannasta haettu arvopari kuten sanoit :P

E: Lisäksi kysyn miten on mahdollista ottaa tietokannasta tieto selville, että se ottaa lomakkeesta esim. prossun nimen, sitten käsittelijä etsii sillä nimellä tietokannasta ja valitsee sen hinnan?

Antti Laaksonen [09.08.2007 20:04:06]

#

Onko tietokantaan varmasti syötetty oikeanmuotoista tietoa? Jos syötät kyselyn "SELECT nimi, hinta FROM intel775 ORDER BY nimi" phpMyAdminiin, niin tuleeko silloin oikeita tietoja? Jos tulee, niin paljastapa koko PHP-sivun lähdekoodi, niin virhettä on helpompaa etsiä.

SQL-kyselyyn voi liittää lomakkeesta tulleita tietoja näin:

// edellytys: POST-lomake, jossa on nimi-kenttä
$nimi = $_POST['nimi'];
$kysely = "SELECT hinta FROM intel775 WHERE nimi = '$nimi'";

prakka [09.08.2007 20:09:42]

#

Aah, kiitos tuhannesti tuosta kyselystä, ajattelinkin että se on todella yksinkertainen mutta ei tullut mieleen :)

Olinkin juuri tarjoamassa lähdekoodia :D

Tuo SQL-kysely antaa minulle oikeat tiedot...

Ja tässä tulee lähdekoodia:

. . .

<body>
<?php
// Sisällytetään mysql.php (conffaa kuntoon)
include("mysql.php");
?>

. . .

                <td style="width: 188px;">
                <select name="prosessori" style="width: 140px;">
                <option>Prosessori</option>
		<?php // Laskuri tekee laskun ja tulostaa niin paljon tavaraa kuin myslikulhosta löytyy
		for($laskuri = 0; $laskuri < mysql_numrows($tulosprossu775); $laskuri++) { ?>
		<option><?php echo mysql_result($tulosprossu775,$laskuri,"hinta") or die ("virhe") . mysql_result($tulosprossu775,$laskuri,"nimi") or die ("virhe"); ?></option> <?php } ?>


                </select>
                <br>

                <select name="emolevy" style="width: 140px;">
                <option>Emolevy</option>
		<?php // Laskuri tekee laskun ja tulostaa niin paljon tavaraa kuin myslikulhosta löytyy
		for($laskuri = 0; $laskuri < mysql_numrows($tulosemo775); $laskuri++) { ?>
		<option><?php echo mysql_result($tulosemo775,$laskuri,"hinta","nimi") ?></option> <?php } ?>
                </select>
                <br>

. . .

Tuo on siis tiedostosta jossa on tuo lomake... Tarvitsetko vielä jotain muuta?

Antti Laaksonen [09.08.2007 20:16:53]

#

Muuta tämä kohta:

echo mysql_result($tulosprossu775,$laskuri,"hinta") or die ("virhe") . mysql_result($tulosprossu775,$laskuri,"nimi") or die ("virhe");

Tämäntapaiseksi:

echo mysql_result($tulosprossu775,$laskuri,"hinta") . " " . mysql_result($tulosprossu775,$laskuri,"nimi");

Noista "or die" -jutuista voi hyvinkin olla seurauksena näkemäsi ykkönen.

Jos koodi ei sittenkään toimi, niin näytä myös koodin kohta, jossa $tulosprossu775 muodostetaan.

PS. Poistin viestistäsi ne koodin osat, joilla ei nyt ole merkitystä.

prakka [09.08.2007 20:31:09]

#

Okei, kiitos todella paljon että viitsit minuakin autella, onhan ongelmani todella yksinkertaisia mutta en vain älyä niitä :P Tuleepahan taas opittua jotain ^^

Ja tuo sun koodinpätkä toimii, kiitosta... Kyselen varmaan vielä sitten jos tulee jotain muuta ongelmaa...

E: Nyt teen tuossa ohjausta seuraavalle sivulle, mutta kun siihen pitäisi saada tuo laskutoimituksen muuttuja laitettua että se laittaa sen muuttujan siihen urliin ja muuttuu sitten tulokseksi... Meinaan siis että se hinta olisi urlissa josta sitten se hintasivu katsoo hinnan.

<?php
// Sisällytetään tiedot kannasta
include('mysql.php');


//Otetaan tiedot muuttujiin lomakkeesta
$prosessori = $_POST['prosessori'];
$emolevy = $_POST['emolevy'];
$muisti = $_POST['muisti'];
$naytonohjain = $_POST['naytonohjain'];
$kotelo = $_POST['kotelo'];
$virtalahde = $_POST['virtalahde'];
$kayttojarjestelma = $_POST['kayttojarjestelma'];
$optasema = $_POST['optasema'];
$kovalevy = $_POST['kovalevy'];
$naytto = $_POST['naytto'];
$nappis = $_POST['nappis'];
$hiiri = $_POST['hiiri'];

//Etsitään hinnat
$haku1 = "SELECT hinta FROM intel775 WHERE nimi = '$prosessori'";
$haku2 = "SELECT hinta FROM emo775 WHERE nimi = '$emolevy'";
$haku3 = "SELECT hinta FROM muisti WHERE nimi = '$muisti'";
$haku4 = "SELECT hinta FROM nayttis WHERE nimi = '$naytonohjain'";
$haku5 = "SELECT hinta FROM kotelo WHERE nimi = '$kotelo'";
$haku6 = "SELECT hinta FROM poweri WHERE nimi = '$virtalahde'";
$haku7 = "SELECT hinta FROM kayttis WHERE nimi = '$kayttojarjestelma'";
$haku8 = "SELECT hinta FROM optasema WHERE nimi = '$optasema'";
$haku9 = "SELECT hinta FROM kovo WHERE nimi = '$kovalevy'";
$haku10 = "SELECT hinta FROM naytto WHERE nimi = '$naytto'";
$haku11 = "SELECT hinta FROM nappis WHERE nimi = '$nappis'";
$haku12 = "SELECT hinta FROM hiiri WHERE nimi = '$hiiri'";


$query1 = mysql_query($haku1) or die ("virhe hintahaussa");
$query2 = mysql_query($haku2) or die ("virhe hintahaussa");
$query3 = mysql_query($haku3) or die ("virhe hintahaussa");
$query4 = mysql_query($haku4) or die ("virhe hintahaussa");
$query5 = mysql_query($haku5) or die ("virhe hintahaussa");
$query6 = mysql_query($haku6) or die ("virhe hintahaussa");
$query7 = mysql_query($haku7) or die ("virhe hintahaussa");
$query8 = mysql_query($haku8) or die ("virhe hintahaussa");
$query9 = mysql_query($haku9) or die ("virhe hintahaussa");
$query10 = mysql_query($haku10) or die ("virhe hintahaussa");
$query11 = mysql_query($haku11) or die ("virhe hintahaussa");
$query12 = mysql_query($haku12) or die ("virhe hintahaussa");

//Lasketaan hinta yhteen
$lasku = $query1 + $query2 + $query3 + $query4 + $query5 + $query6 + $query7 + $query8 + $query9 + $query10 + $query11 + $query12



//Siirretään seuraavalle sivulle ja kirjoitetaan samalla hinta urliin.

header("Location: lasku.php?luku
?>

Jätin tuon headerin auki tuosta että siihen voit sitten laittaa sen muuttujan.

E2: Tämä on siis ihan sama turvallisuuden puolesta kun laskuriin ei pääse netin kautta käsiksi vaan ainoastaan servukoneelta joka sijaitsee myymälässä. Laittaisin koko jutun eri sivulle selkeyden vuoksi.

E3:

header("Location: lasku.php?luku=" . $lasku);

tuommoista kokeilin, ei toiminut...

Lebe80 [09.08.2007 20:52:11]

#

Saiskohan tuota tietokannan rakennetta hieman optimoitua, esim. laittamalla kaikki tuotteet (prosessori, emolevy, käyttöjärjestelmä yms. yms.) samaan tauluun, josta ne haettaisiin?

prakka [09.08.2007 21:00:26]

#

Lebe80: Ei, koska tuotteita on paljon, ja tuollain ne saadaan eriteltyä paremmin. Ja tuotteita vaihdellaan ja lisätään yms. jatkuvasti joten toimii parhaiten noin.

Eikä sitä koodia tuijoteta kuin muokkauksessa jota ei tehdä paljoa, ja laitan vielä parempaa kommenttia tuonne niin se on helpompaa muokkailla.

E: Kokeilinpa piruuttaan toimiiko tuo koodi (lomakkeen käsittelijä) ollenkaan ja kappas, valkoinen ruutu vain tulee...

Antti Laaksonen [09.08.2007 23:09:18]

#

Onko muuttujan $lasku arvo oikea ennen header-funktion kutsua? Tuosta koodista puuttuvat mysql_result-funktiot, eli esim. $query1 ei ole prosessorin hinta vaan pelkkä viittaus tietokantahaun tuloksiin. Kokeile muuttaa rivit tällaisiksi:

$query1 = mysql_result(mysql_query($haku1), 0, 0);

Uudelle sivulle ohjauksen pitäisi toimia ehdottamallasi (E3) tavalla. Muista myös laittaa puolipiste summalausekkeen loppuun.

prakka [10.08.2007 08:29:47]

#

Hmm... Mikäs voi olla vikana, kun menee lomake775.php-sivulle, se antaa ihan valkoista sivua vain. Sitten rupesin viljelemään echoa joka paikkaan, ja siis ensimmäinenkään teksti ei tulostu. Mitäs nyt oikein sitten on pulmana?

ajv [10.08.2007 08:35:41]

#

Sulla on error_reporting() pois päältä ja koodissa on joku syntaksivirhe?

prakka [10.08.2007 09:22:15]

#

ajv kirjoitti:

Sulla on error_reporting() pois päältä ja koodissa on joku syntaksivirhe?

Hmm... Mutta siis se ei tulosta yhtään mitään. Mites ton error reporttaamisen saa päälle? Ja mikäs syntaksivirhe sieltä voisi löytyä... Mutta siis kun se ei tulosta yhtään mitään.

E: Error-reportti ei anna mitään.

prakka [10.08.2007 11:21:52]

#

Joo-o, nythän onkin kiva, liitin sen käsittelijän siihen lomakesivuun, ja huomasin siellä oman virheen ja toimii periaatteessa, mutta.

Se hinta ei tule vaan se sanoo koko aika että 0€.

Wizard [10.08.2007 11:56:07]

#

prakka kirjoitti:

Lebe80: Ei, koska tuotteita on paljon, ja tuollain ne saadaan eriteltyä paremmin. Ja tuotteita vaihdellaan ja lisätään yms. jatkuvasti joten toimii parhaiten noin.

Periaatteessa tuossa menee jo tietokannan periaate hukkaan kun erillisillä tuotteilla on omat taulunsa. Se on tehosta pois, koska tietokantapalvelin käsittelee paljon nopeammin yhden kyselyn kuin useita kyselyitä.

Lajittelut ovat nopeita ja kyllä yksi tietokantapalvelin nyt käy läpi taulun joissa on satojatuhansia rivejä helpostikin kunhan vain on indeksit kohdallaan.

Tuossa mallissa olisi melkein sama vaikka kaikki hinnastot olisivat tekstitiedossa. ;)

-W-

prakka [10.08.2007 12:16:52]

#

Mutta mutta, nyt se pukkaa mulle virhettä, mutta ei ole mitään tekstiä ja virhenumero on 0. Lisäksi hinta pitää saada erilleen noista muuttujista.

E: Tjaa-ah, nyt toimii. Mutta nyt siinä ei näe hintaa mitenkään. Mitenkäs minä voisin lisätä hinnat perään sillain ettei tulisi tuohon käsittelyyn kuitenkaan mukaan, eli se karsiutuisi jo tuohon muuttujaan laitettaessa pois. Tämmöstä koodia nyt:

<?php // Otetaan tiedot muuttujiin lomakkeesta
$prosessori = $_POST['prosessori'];
$emolevy = $_POST['emolevy'];
$muisti = $_POST['muisti'];
$naytonohjain = $_POST['naytonohjain'];
$kotelo = $_POST['kotelo'];
$virtalahde = $_POST['virtalahde'];
$kayttojarjestelma = $_POST['kayttojarjestelma'];
$optasema = $_POST['optasema'];
$kovalevy = $_POST['kovalevy'];
$naytto = $_POST['naytto'];
$nappis = $_POST['nappis'];
$hiiri = $_POST['hiiri'];
// Etsitään hinnat
$haku1 = "SELECT hinta FROM intelam2 WHERE nimi='$prosessori'";
$haku2 = "SELECT hinta FROM emoam2 WHERE nimi='$emolevy'";
$haku3 = "SELECT hinta FROM muisti WHERE nimi='$muisti'";
$haku4 = "SELECT hinta FROM nayttis WHERE nimi='$naytonohjain'";
$haku5 = "SELECT hinta FROM kotelo WHERE nimi='$kotelo'";
$haku6 = "SELECT hinta FROM poweri WHERE nimi='$virtalahde'";
$haku7 = "SELECT hinta FROM kayttis WHERE nimi='$kayttojarjestelma'";
$haku8 = "SELECT hinta FROM optasema WHERE nimi='$optasema'";
$haku9 = "SELECT hinta FROM kovo WHERE nimi='$kovalevy'";
$haku10 = "SELECT hinta FROM naytto WHERE nimi='$naytto'";
$haku11 = "SELECT hinta FROM nappis WHERE nimi='$nappis'";
$haku12 = "SELECT hinta FROM hiiri WHERE nimi='$hiiri'";
// Laitetaan hinnat muuttujiin joissa on queryt
$query1 = mysql_result(mysql_query($haku1), 0, 0);
$query2 = mysql_result(mysql_query($haku2), 0, 0);
$query3 = mysql_result(mysql_query($haku3), 0, 0);
$query4 = mysql_result(mysql_query($haku4), 0, 0);
$query5 = mysql_result(mysql_query($haku5), 0, 0);
$query6 = mysql_result(mysql_query($haku6), 0, 0);
$query7 = mysql_result(mysql_query($haku7), 0, 0);
$query8 = mysql_result(mysql_query($haku8), 0, 0);
$query9 = mysql_result(mysql_query($haku9), 0, 0);
$query10 = mysql_result(mysql_query($haku10), 0, 0);
$query11 = mysql_result(mysql_query($haku11), 0, 0);
$query12 = mysql_result(mysql_query($haku12), 0, 0);
//Lasketaan hinta yhteen
$lasku = $query1 + $query2 + $query3 + $query4 + $query5 + $query6 + $query7 + $query8 + $query9 + $query10 + $query11 +

$query12;
//Tulosta hinta
if ($lasku < 1) { echo "Valitse osia"; } else {
echo $lasku . "€"; }
 ?>

Ja sitten se mistä se tota ottaa

<select name="prosessori" style="width: 140px;">
                <option>Prosessori</option>
		<?php // Laskuri tekee laskun ja tulostaa niin paljon tavaraa kuin myslikulhosta löytyy samalla kun

kasvattaa numeroa, ja kun numero on yhtä iso kuin on rivejä se lopettaa tulostamisen
		for($laskuri = 0; $laskuri < mysql_numrows($tulosprossuam2); $laskuri++) { ?>
		<option><? echo mysql_result($tulosprossuam2,$laskuri,"nimi"); ?></option> <?php } ?>


                </select>

Antti Laaksonen [10.08.2007 13:59:34]

#

Tämmöinen voisi toimia (kaikkiin kohtiin vastaavasti):

<option value="<? echo mysql_result($tulosprossuam2,$laskuri,"nimi"); ?>">
<? echo mysql_result($tulosprossuam2,$laskuri,"nimi") . " " . mysql_result($tulosprossuam2,$laskuri,"hinta"); ?></option>

Eli option-tagille voi antaa erikseen lähetettävän arvon value-attribuutilla.

prakka [17.08.2007 18:28:01]

#

Jooh. Mites muuten onnistuu sillä kirjainkorjaus-systeemillä +-merkin muunto umlautiksi (onko sille omaa?) jotta AMD:n prossujen nimet toimisi oikein? Nyt se rikkoo koko jutun.

Olga [18.08.2007 01:54:00]

#

Jukran pujut, suosittelisin muutaman edellisen kirjoittajan tapaan normalisoimaan tuota tietokantaa ja rajulla kädellä.

prakka [18.08.2007 08:33:18]

#

No voisittekin sitten antaa "pientä" esimerkkiä siitä miten saan ne kaikki menemään yhteen, ja miten teen 2:n taulun liitoksen, meinaan tuo mun koodi on nyt jo niin tarvitseeko oikeastaan mitään muuta tehdä kuin sitten tonne yhteys-filuun säätää mitään, teen tällä hetkellä admin-paneelia ja olen kyllä itsekin jo huomannut että on aika vittumaista tolla systeemillä tehdä...
...mutta kun ei vain osaa, kokeilin kyllä tota muunnella mutta loppui osaaminen kesken.

tsuriga [19.08.2007 07:20:42]

#

Voisit ehkä ite opetella ne jutut ennenko alat ottaa urakkaa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta