Hei, Tarkoituksenani olisi rakentaa esittelysivusto, jossa käyttäisin PHPtä ja MySQLää. Osaan perusteet kummastakin mutta hiukan huonosti tuon PHPn. Eli mistä kannattaisi lähteä liikkeelle?
Suunnitelin asiaa näin: Tietokantaan tallennettaisiin kaikki perustiedot esiteltävästä kohteesta. Esittely tietysti tarvitsee kuvia (n. kolme kuvaa per esittely). Ajattelin että kuvat ladataan hakemistoon palvelimella ja tietokantaan tulisi kunkin esittelyn kohdalle linkit esittelykohteen kuviin palvelimella. Se taitaa olla suurin ongelmani. eli miten tuo linkitys tulisi tehdä tuossa tietokannassa?
Lisääkin kysymyksiä on mielessä mutta etenen hitaasti tämän kanssa että kaikki oppimani pysyy muistissa.
Jos tiedät vastaaviin tarkoituksiin sopivia koodeja niin toivottavasti laitat linkin tänne. Koodia lukemalla oppin paljon ko. asiasta.
Paras tapa aloittaa on tietenkin oppaiden kautta (esim. putkan oma) ja tutustumalla muiden koodinpätkiin.
En ihan ymmärtänyt tuota "suurinta ongelmaasi" joten voisitko hieman täsmentää tuota kohtaa "miten tuo linkitys tulisi tehdä". Tarkoititko tietokannan suunnittelua vai itse koodia?
Tietokannastahan voidaan hakea tiedot kuvista, linkestä ja muista näppärästi. Tuossapa esim oma esimerkki siitä miten tietokannasta voidaan hakea tietoa valintalistaan: http://kasetti.propelli.cop.fi/fi/koodivinkit.
kiitos linkistä. tuotakin pitää käyttää...
eli tarkoitukseni oli kysyä miten tuo tietokanta kannattaa rakentaa kun jokaisesta kohteesta on n. 3 kuvaa ja kohteita on kerralla tietokannassa n. 50 kpl.
Eli tallennanko kaikki kuvat palvelimella olevaan hakemistoon vai siihen tietokantaan (eikös ne sinnekin pysty tallentamaan?)
Saanko tallennettua samalla kertaa kohteen tiedot ja ne kolme kuvaa vai pitääkö siinä jotenkin kikkailla eli ensin tallentaa kohteen tiedot ja sitten vasta kuvat.
Tietokantaan ei kuvia kannata tallentaa, vaan todellakin vain linkit mistä kuvat löytyvät.
Jos sinulla olisi esim. kaksi taulua:
taulu Kohteen_tiedot:
Kohde_id / tieto / tieto2/ jne...
taulu Kohteen_kuvat:
Kohde_id / Kuvapolku
Näin jokaisella kohteella voisi olla eri määrä kuvia jotka linkitetään tuolla Kohde_id numerolla sitten SQL-kyselyssä.
ok. no nyt vähän selkesi tuo ajatus kuinka nuo kuvat linkitetään oikeaan kohteeseen. Kiitos paljon.
Hei taas. Hiukan erilailla lähdenkin rakentamaan tätä asiaa. Monien kokeilujen jälkeen tälläisellä koodilla saan syötettyä kohteen tiedot tietokantaan ja upattua kuvan palvelimelle, mutta kuinka saan kuvan polun ja kuvan tyypin tuonne tietokantaan eli tuolla sql lausekkeen perässä olevat $tieto5sen perässä olevat 2 tyhjää paikka...
... $latauskansio = "../ladatut/"; //lomakkeen tiedot muuttujiin $merkki = $_POST["merkki"]; $malli = $_POST["malli"]; $tieto1 = $_POST["tieto1"]; $tieto2 = $_POST["tieto2"]; $tieto3 = $_POST["tieto3"]; $tieto4 = $_POST["tieto4"]; $tieto5 = $_POST["tieto5"]; if(is_uploaded_file($_FILES['kuva']['tmp_name'])) { // Hakemiston nimi johon tiedosto siirretään. // Muista luoda tämä hakemisto myös ! $hakemisto = $latauskansio; $nimi = $_FILES['kuva']['name']; move_uploaded_file($_FILES['kuva']['tmp_name'], $hakemisto . $nimi); echo "Tiedosto ".$_FILES['kuva']['tmp_name']." on kopioitu hakemistoon ".$nimi."\n"; } else { echo "Mahdollinen file-upload hyökkäys tapahtunut, tiedoston nimi oli: " . $_FILES['kuva']['name']; } $sql_lauseke = "insert into esittely (merkki,malli,tieto1,tieto2,tieto3,tieto4,tieto5,kuva_nimi, kuva_tyyppi) values ('$merkki','$malli','$tieto1','$tieto2','$tieto3','$tieto4','$tieto5','','') "; if (!$kysely = mysql_query($sql_lauseke,$yhteys)) { print "epäonnistui" ; exit; } else { print "Onnistui" } ?>
ps. Koodi on varmasti huonoa koska olen todellakin aloittelija.
EDIT: tämäkin koodi on saatu aikaan erilaisten tutoriaalien avulla :)
Polku: $hakemisto.$nimi mikä sinulla tuolla jo yhdessä kohtaa koodia onkin. Pistä se tuohon sql_lausekkeeseen.
Tyyppi: Esimerkiksi strrposilla ja substr:llä erottelet kuvan tiedostopäätteen (mikäli sitä etsit). Tosin mitä teet sillä kannassa?
1. Kannattaa käyttää yhteneviä merkintöjä koodissa, $_POST["tieto5"] tilalle $_POST['tieto5']. Ja välillä käytät printtiä, välillä echoa.
2. Melko turhaa määritellä $latauskansio ja sitten laittaa se $hakemiston arvoksi, sama olisi suoraan määritellä alussa $hakemisto configeissa, mistä koodin käyttäjä sen helpommin löytää jos haluaa muokata.
3. Palvelleeko exit; jotain tarkoitustakin tuossa? Tuon koko loppuiffin voisi lyhentää muotoon:
<?php echo (($kysely = mysql_query($sql_lauseke,$yhteys))) ? "Onnistui" : "Epäonnistui"; ?>
Eikös tähän saisi myös tehtyä kuvan automaattisen pienentämisen?
Tiedän että voin tarkistaa kuvankoon getimagesize() komennolla, mutta kuinkas tuo koon muuttaminen?
if(is_uploaded_file($_FILES['kuva2']['tmp_name'])) { $hakemisto = "../ladatut/"; $nimi2 = $_FILES['kuva2']['name']; move_uploaded_file($_FILES['kuva2']['tmp_name'], $hakemisto . $nimi2); //echo "<img src=\"../ladatut/$nimi2\">"; } else { echo "Tiedoston " . $_FILES['kuva2']['name'] . " lataaminen palvelimelle epäonnistui"; }
Jeps. olen jo saanut tehtyä suurimman osan toiminnoista mitä haluan esittelysivustooni tehdä, mutta voisiko joku neuvoa miten saan tehtyä seuraavat temput:
Kun näytän kuvaa tiedostosta kuvan koko pitäisi joka kerta muuttaa vaikkapa 250 * 200 kokoon. eli ihan vain litistää alkuperäinen kuva.
EDIT: vastaan itse tähän. tein ko. asian antamalla img tageille kiinteän arvon
Kuinka saan tehtyä tuohon edellisessä viestissäni olevaan kuvan uppauskoodiin tarkistuksen että jos filetiedosto on tyhjä (eli upattavaa ei ole) näytetään tuo 'else'ssä oleva teksti. (eli nyt jos päivitän kannassa olevia tietoja, mukaan lukien kuvan polku. jos en anna filetiedostolle mitään arvoa (eli en valitse kuvaa päivitettäväksi) niin kantaan tallentuu kuvan polun kohdalle tyhjää jolloin vanha kuva katoaa sieltä.
Tulipas sekavaa tekstiä, jota en yhtään ihmettele, koska olen kaksi päivää katsellut pelkkää php koodia. aloittelijana on pää ihan sekaisin ja koodi on kauhean näköistä :(
Jos joku tajuaa mistä oli kyse niin Auta!
tajusin juuri että ongelma ei ole kuvan upload kohdassa vaan sql lauseessa. Koodi päivittää joka kerta myös kuvan polun vaikka uutta kuvaa ei valittaisi. tässä koodi:
$sql_lauseke = "update esittely set tieto1='$tieto1', tieto2='$tieto2', kuva1='$hakemisto$nimi1', kuva2='$hakemisto$nimi2', kuva3='$hakemisto$nimi3', where id=$id ";
Eli pitääkö tuohon rakentaa erilaisia sql -lausekkeita jotka tarkistetaan if else lauseilla ennen sql koodin suorittamista.
EDIT: vai switch case tyyliin?
EDIT 2: Nyt menee kyllä vähän vaikeaksi tämä ajattelu mutta pitääköhän mun tehdä näin:
apumuuttujat apu1, apu2 ja apu3 joiden arvo annetaan näin:
jos kuva1 = tyhjä
apu1 = 0
muuten apu1 = 1
ja apu2 sekä kolme sama juttu. sitten if ja else ifillä tarkastetaan mitä sql lausetta käytetään tähän tyylin:
jos (apu1=1, apu2=0, apu3=0)
sql lause1
muuten jos (0, 1, 0)
sql lause2
muuten jos (0, 0, 1)
sql lause3
...
muuten jos (1, 0, 1)
sql lause6
muuten
sql lause7
Sullahan on tuossa jo ehtolause koodissa, mikset laita sitä kantapäivitystä sinne:
<? if(is_uploaded_file($_FILES['kuva2']['tmp_name'])) { $hakemisto = "../ladatut/"; $nimi2 = $_FILES['kuva2']['name']; move_uploaded_file($_FILES['kuva2']['tmp_name'], $hakemisto . $nimi2); //TÄHÄN SE KANTAAN KIRJOITUS! //echo "<img src=\"../ladatut/$nimi2\">"; } else { echo "Tiedoston " . $_FILES['kuva2']['name'] . " lataaminen palvelimelle epäonnistui"; } ?>
Silloin sitä ei suoriteta joka kerta kun sivua ladataan vaan silloin, kun lataus onnistui.
AIVAN!
Kiitos. nyt toimii mahtavasti :D Tietoturva on vielä pyllyllään, mutta eiköhän se siitä. Oikein paljon kiitoksia!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.