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?
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?
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?
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?
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?
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'";
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?
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ä.
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...
Saiskohan tuota tietokannan rakennetta hieman optimoitua, esim. laittamalla kaikki tuotteet (prosessori, emolevy, käyttöjärjestelmä yms. yms.) samaan tauluun, josta ne haettaisiin?
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...
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.
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?
Sulla on error_reporting() pois päältä ja koodissa on joku syntaksivirhe?
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.
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€.
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-
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>
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.
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.
Jukran pujut, suosittelisin muutaman edellisen kirjoittajan tapaan normalisoimaan tuota tietokantaa ja rajulla kädellä.
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.
Voisit ehkä ite opetella ne jutut ennenko alat ottaa urakkaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.