Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Työvuoron varaus (PHP)

Sivun loppuun

latenleffahylly [09.01.2012 19:01:17]

#

Hei,

Olen tekemässä web-sivuja, joiden kautta voi varata työvuoroja. Eli olisi työ-tapahtumia ja niitä klikkaamalla pääsisi kyseisen tapahtuman lomakkeelle, jossa voisi kirjoittaa oman nimen ja osallistua.

Onko tähän kellään antaa paria vinkkiä miten kannattaa toteuttaa? Lomakkeen validointi on kunnossa. Eli ehkä se miten tapahtumia lisätään ja poistetaan ja rakennetaanko aina uusi taulu tietokantaan (SQL-lauseella).

kiitos kaikesta avusta!!

Lebe80 [09.01.2012 19:08:30]

#

Jos tietokantaan ollaan "aina lisäämässä uusi taulu" niin suunnittelussa on iso virhe!

Macro [09.01.2012 19:19:25]

#

Pidät yhdessä taulussa työvuorot, jotka sisältävät ainakin id-numeron, ajankohdan ja tiedon siitä, onko se jo varattu vai ei. Toisessa taulussa pidät varauksia, jotka sisältävät id-numeron, varaajan ja varausajankohdan id-numeron. Silloin on helppo hakea, onko aika varattu jo, vai voiko sen varata.

latenleffahylly [09.01.2012 19:31:00]

#

Thänks! Tajusin oikeastaan itse siinä vaiheessa kun tänne kirjoitin miten kannattaa toteuttaa.

1. Ylläpidon kautta lisätään tapahtuma
2. Tapahtuma näytetään käyttäjälle
3. Käyttäjä klikkaa tapahtumaa
4. Tapahtuma aukeaa ja se "varataan"

...

latenleffahylly [10.01.2012 00:56:21]

#

Iltaa kaikille,

K: Miten lomakkeelta tallennetaan nimi tietokantaan > suljetaan tietokantayhteys > avataan yhteys samalla sivulla ja näytetään juuri lisätty nimi?

-----

Nyt tapahtuu niin, että aina kun päivitän selaimen niin sama nimi tallentuu tietokantaan. Eli yhteys on auki koko ajan..

latenleffahylly [10.01.2012 14:20:38]

#

...hei voitteko suositella jotain hyvää kirjaa, jossa käsitellään lomakkeen rakentamista?

-----

Kysymykseni tuntuvat olevan liian aloittelija tasoa, joten jos kirja auttaisi.

Macro [10.01.2012 14:32:36]

#

latenleffahylly kirjoitti:

Miten lomakkeelta tallennetaan nimi tietokantaan > suljetaan tietokantayhteys > avataan yhteys samalla sivulla ja näytetään juuri lisätty nimi?

<?php
$yhteys = mysql_connect("localhost", "käyttäjä", "salasana");
mysql_select_db("tietokanta");

$kenttä = (isset($_POST["kenttä"]) && strlen(trim($_POST["kenttä"])) > 0) ? mysql_real_escape_string($_POST["kenttä"]) : null;
...

if($kenttä === null)
  die("Täytä kenttä!");
...

mysql_query("INSERT INTO varaukset(...) VALUES('$kenttä' ...)");
header("Location: index.php");
die;
?>
<?php
$yhteys = mysql_connect("localhost", "käyttäjä", "salasana");
mysql_select_db("tietokanta");

$kysely = mysql_query("SELECT * FROM varaukset");

while($tulos = mysql_fetch_assoc($kysely)) {
   echo htmlspecialchars($tulos["..."]) . "<br>";
}
?>

Siinä oli yksinkertaistettuna ensin lisäys, sitten näyttö. Ehkä kannattaa tutustua Ohjelmointiputkan PHP-oppaaseen, ja sen jälkeen kahlata se läpi, jossa käsitellään myös MySQL.

latenleffahylly [10.01.2012 14:50:06]

#

Hei Macro,

joo olet kyllä oikeassa. Vaikka olen tutustunut oppaisiin niin tieto ei mene täysin perille. (tutkin juuri kirjaa: Web-ohjelmointi 2005, Ari Rantala)

- Input painikkeen tarkistus (onko lomakkeella, onko klikattu)
- Miten estää selaimen päivityksen aiheuttama tietojen uudelleen ja uudelleen tallennus
- Miten rakentaa täysin tietoturvallinen lomake yritys käyttöön

..tutkin nyt antamasi koodin erittäin tarkkaan - mukava, että joku jaksaa vielä auttaa.

jimi-kimi [10.01.2012 15:11:31]

#

Noihin kysymyksiin löytyy vastaus joko putkasta, tai sitten ainakin googlesta. Tuosta kirjastasi löytyy sisällysluettelon perusteella kaikki tarvitsemasi. Sinun tehtäväsi on enää ymmärtää, tai edes yrittää ymmärtää mitä siinä sanotaan.

latenleffahylly [10.01.2012 15:26:16]

#

juu.. ajattelen jotenkin niin että olisi hienoa tutustua kirjaan, jossa selitettäisiin rauhallisesti vaihe vaiheelta (kuvat+koodi), miten tietoturvallinen lomake rakennetaan vuonna 2012.

- Tarkistukset + tyylikkäät virheilmoitukset
- Tiedon oikein tallentaminen ja tulostaminen (DB)
- Lomakkeen kenttä elementit esim. dt/dd/label jne.
- CSS tyylittely
- PHP/JavaScript tarkistukset
- Lähetetäänkö data erilliselle tiedostolle vai samalle php-tiedostolle
- Ammattilaisten niksit

..ja näin pois päin. Jos ja kun teen yritys käyttöön lomaketta niin haluaisin olla 99% varma lomakkeen tietoturvallisuudesta. En halua kaikkea valmiina, mutta lomakkeet ovat mielestäni tärkein osa web-sivujen rakentamista interaktiiviseksi ja käyttäjän kannalta tarpeelliseksi. (huom! rakennan lomakkeita WordPressin sisään) <- mielestäni paras CMS!

Lebe80 [10.01.2012 19:22:38]

#

Tietoturvallisuudesta sen verran, että kannattaa tutkia ja tutustua miten esim. jo valmiissa järjestelmissä nuo on toteutettu. Näissähän yleensä on erilaisia turvatarkisteita, joita asetetaan esim. kirjauduttuessa.

Myös esim. Pdo:n käyttö kannattaa opetella tietokannan kanssa. Valmiita javascript-skriptejä on netti pullollaan, eli voit valita js-validoinneista itsellesi parhaiten sopivan vaihtoehdon.

Js-kikkareet kannattaa miettiä tosiaan niin, että lomake toimii myös ilman niitä. JavaScripteillä siis luot lähinnä vain mukavamman käyttökokemuksen (esim. Käyttäjä kirjoittaa sähköpostikseen vahingossa kotisivunsa www-osoitteen, jolloin skripti ilmoittaa tästä).

Ja ei ole yhtään väärin hankkia ihan ulkopuolista apua, jos tekee tätä rahasta. Valmiita upeita sivupohjia saa jo muutamalla kymmenellä eurolla.

jimi-kimi [11.01.2012 11:27:51]

#

Koitat nyt mennä perse edellä puuhun. Jos täytyy saada kaikki heti nyt, niin palkkaa ammattilainen. Muussa tapauksessa luet vaan sitä kirjaasi ja koitat itse funtsia asioita ja miten ne liittyvät haluamiisi asioihin. Huomaat kyllä miten helppoa lomakkeen käsittely loppujen lopuksi onkaan. Kukaan ei vaan voi taikoa lukemattomia tunteja harjoittelua päähäsi.

$kenttä = (isset($_POST["kenttä"]) && strlen(trim($_POST["kenttä"])) > 0) ? mysql_real_escape_string($_POST["kenttä"]) : null;
...

Luet sen kirjasi ajatuksella ja tuokin aukeaa.

Lebe80 [11.01.2012 13:08:28]

#

jimi-kimin juttuihin teet vielä yhden funktion, jolla teet kaikki nuo toiminnot kerralla.

latenleffahylly [11.01.2012 16:14:26]

#

Noniin.. sovitaan sitten niin että mietin asioita rauhallisemmin ja aloitan oppaista. Minulla on sellainen tunne ja käsitys, että opiskelu aikana asioita opetettiin eri tavalla. Nyt huomaan, että ne ovat ristiriidassa putkan ohjeiden kanssa.

Täällä asiat tehdään niin kuin ammattilaiset tekevät tämän päivän työelämässä - ainakin siltä vaikuttaa. Ei muutakuin illan jatkoja molemmille (lebe, jk)

tsuriga [11.01.2012 16:18:20]

#

Elä nyt kumminkaan absoluuttisina totuuksina ota kaikkea, mitä satunnainen foorumikirjoittelija sattuu sanomaan, ei meistä kaikki ammattilaisia tai työelämässä harjaantuneita ole. Työelämän reaaliteetit lisäksi voivat usein tarkoittaa teoriallisesta optimista poikkeamista käytännön syistä.

Lebe80 [11.01.2012 19:06:38]

#

Ja ehdottomasti aluksi olisi tärkeää tehdä ihan harjoitusmielessä vastaavanlaisia projelteja. Osa vaikka vain skriptejä jotka eivät esim. tallenna saatuja tietoja minnekkään vaan tulostavat ne vain ruudulle.

Lisäksi, ei haittaa lähellekkään yhtä paljoa, jos joku hakkeroi testimielessä tehdyn varauslistan, kuin se että joku hakkeroi asiakkaalle tehdyn listan.

Välillä pitää osa asioista oppia kantapään kautta. Muutenkin ohjelmoinnissa harjaantuu paremmin, kun ohjelmoi ihan itse. Opit rutiineja yms.

qeijo [12.01.2012 17:04:39]

#

Olisko jokin valmis CMS hyvä pohja?

latenleffahylly [12.01.2012 18:46:37]

#

Paljon hyviä pointteja! ..juu teen WordPressillä sivuja. Seuraavaksi ajattelin kysyä tietoturvasta, mutta siirretään kysymystä hieman myöhemmäksi..

- liittyy oleellisesti tähän työvuorojen varaukseen koska haluaisin sen olevan vain tietyn yrityksen työntekijöitä varten. WordPress tietosuoja ei toimi, olen miettinyt htaccess-tiedoston laittamista kansioon. Sillä suojaisin kaikki kansiossa olevat php-tiedostot.. mutta otan asiasta selvää hieman lisää

qeijo [12.01.2012 20:14:59]

#

latenleffahylly kirjoitti:

WordPress tietosuoja ei toimi

?

latenleffahylly [13.01.2012 13:06:06]

#

Tarkoitan että WP:ssä voi tehdä salasana-sivun tai privaatti-sivun, mutta kun käyttää omaa PHP-koodia niin silloin tämä suojaus ei toimi.

- WP:ssä voi hakea liitännäisiä, jotka mahdollistavat oman php:n kirjoittamisen Artikkelin/Sivun sisään WP-hallintapaneelissa - eli ehkä minun pitäisi ottaa selvää tästä ominaisuudesta. (rakentaa tietoturva tämän pohjalta)

latenleffahylly [13.01.2012 14:31:27]

#

Hei,

Jos tekisin .htaccess tyyppisen suojauksen kaikille kansion tiedostoille niin eikö se ole ihan hyvä tapa suojata web-sivut vielä tänä päivänä?

- mistä hyvät ohjeet?
- jälleen kun etsin netistä niin valtavasti kaiken maailman ohjeita
- teen kansion suoraan palvelimelle ja sinne heitän .htaccess/ .htpassword??


..nyt töihin, palataan!

latenleffahylly [25.01.2012 19:05:43]

#

Hei,

olen päässyt jo pitkälle projektissani, mutta??

- - - - -

Minulla on tapahtuma, jonka voi varata niin monta kertaa kuin haluaa. Mikä olisi oikea SQL-lause jolla näkisin ketkä kaikki asiakkaat ovat varanneet kyseisen tapahtuman.

TAULUT:

- asiakas
- varaus
- varausrivi
- tapahtumat

Grez [25.01.2012 19:15:08]

#

select
  distinct a.asiakas, a.nimi
from
  asiakas a
  join varausrivi r on a.asiakas=r.asiakas
where
  r.varaus = $varausid

latenleffahylly [25.01.2012 19:22:58]

#

Hmm.. tutkitaan, kiitos

latenleffahylly [25.01.2012 19:31:44]

#

Noniin jälleen kerran olen jumissa totaalisesti kun taso ei vaan riitä. Yritän vielä kerran selittää - eli on taulut...

Tapahtumat:
- T_Id
- tapahtumanNimi


Varaus:
- varno
- asno
- tapahtumanNimi


Varausrivi:
- varno
- T_Id


asiakas:
- asno
- animi


--------------------------------------------------------------

Yritän ensin listata kaikki tapahtumat linkkilistana, helppoa!

Sitten kun klikkaan tapahtuman auki niin haluaisin nähdä kaikki jotka osallistuvat kyseiseen tapahtumaan, erittäin vaikeaa?

Grez [25.01.2012 20:03:27]

#

Kun et kertonut mitä kenttiä tarvitset, niin laitoin jotain. Eli asiakastaulun kentät asiakas ja nimi

AkeMake [25.01.2012 22:25:07]

#

Ei käynyt ihan selväksi, mutta oletan, ettei yksi asiakas voi varata samaa tapahtumaa monesti, mutta yhden tapahtuman voi varata monta eri asiakasta. En ymmärrä mikä idea tuolla varausrivillä on. Eikö tähän riittäisi kolme taulua:

Tapahtuma
- Id
- Nimi

Varaus:
- Tapahtuma_Id
- Asiakas_Id

Asiakas:
- Id
- Nimi

Nyt tapahtumat löytyvät Tapahtuma taulusta, asiakkaat Asiakas taulusta ja varaukset Varaus taulusta ja tietyn tapahtuman varanneet asiakkaat voi hakea:

SELECT a.Id, a.Nimi FROM Asiakas AS a, Varaus AS v WHERE a.Id = v.Asiakas_Id AND v.Tapahtuman_Id = ?

latenleffahylly [25.01.2012 22:43:02]

#

Tuota tuota.. minulla on omat kotisivut (elokuvakirjasto) jossa asiakas voi varata elokuvan. Kun elokuvan varaa sitä ei silloin voi enää varata.

Tämän idean pohjalta (uusi projekti) ajattelin, että elokuva voi olla esim. tapahtuma (futismatsi). Tapahtumaan tarvitaan työntekijöitä ja klikkaamalla tapahtuman kuvaa päsee ilmoittautumaan tapahtumaan (varaa työvuoro lomake).

- tästä syystä 4-taulua. Ainakin sitten voi tutkia tietyn henkilön kohdalla missä kaikissa tapahtumissa hän on ollut mukana esim. vuonna 2012. Kuten kaikille foorumilaisille lienee jo tässä vaiheessa selvää - olen php:ssä suht onneton tapaus. Eli luultavasti työvuoron varaus ohjelman voi toteuttaa 100x järkevämmin, mutta..

Nyt työvuoron varaaminen tapahtumaan onnistuu eli tarvitsisin apua teiltä miten voin hakea yhden tapahtuman ja katsoa ketkä kaikki ovat siihen osallistuneet. Kiitän am & grez avusta, mutta ehdotuksenne eroavat paljon toisistaan - onko tosiaan niin että tauluillani (4kpl) haluamaani hakua ei voi tehdä?

-kiitos-

Grez [25.01.2012 23:03:29]

#

Niin no mä vastasin sillä perusteella mitä kerroit sulla olevan. Enhän mäkään käyttänyt kuin kahta niistä tauluista.

Ja mun kyselykin on käytännössä sama kuin AM:n kysely, ainoastaan kosmeettisilla eroilla että laitoin sen näyttämään kunkin asiakkaan vain kertaalleen (distinct) ja käytin JOIN syntaksia siinä missä AM käytti WHERE-syntaksia taulujen yhdistämiseen. Lopputuloksen kannalta sillä ei ole merkitystä.

latenleffahylly [26.01.2012 09:55:31]

#

Ok. ..No yritän löytää ratkaisun 4 taulun ongelmaan. Ylläpitäjän kannalta olisi tärkeää, että hän näkisi kaikki tapahtumaan osallistuvat työntekijät.

latenleffahylly [26.01.2012 10:54:26]

#

asiakas:
- asno
- animi

Varaus:
- asno
- tapahtumanNimi

------------------------------------------------------------------

Nyt tulee virhe SQL-lauseessa??

$sql_lauseke = "SELECT asno, animi FROM asiakas AS person WHERE asiakas.asno = Varaus.asno AND Varaus.tapahtumanNimi =" . $tapahtumanNimi;

..eli yritän hakea kaikkia asiakkaat jotka osallistuvat tapahtumaan X.

Grez [26.01.2012 14:37:45]

#

No ei mikään ihme että tulee virhe. Ainoa taulu jonka otat kyselyyn on asiakas ja haluat käyttää sitä nimellä person. Kuitenkin where lauseessa viitataan asiakas ja varaus -tauluihin, joita ei ole lainkaan kyselyssäsi mukana.

Suosittelen tutustumaan johonkin SQL-oppaaseen niin, että pääsisit jyvälle perusasioista.

makumaku [26.01.2012 14:57:10]

#

Muutenkin jos ohjelmointiharrastus on vasta alkutaipaleella niin pienillä asioilla voi edesauttaa että itsekin ymmärtää koodia paremmin. Esimmerkiksi kannattaa opetella käyttämään kunnollisia muuttujien, taulujen, jne.. nimiä. Nyt esim tuolla on yritetty lyhentää nimet mahdollisimman lyhyiksi, täysin samoja lyhyitä nimiä on eri tauluissa, jotkut alkaa isolla kirjaimella toiset pienellä. Kaikki tälläinen epäloogisuus vaan edesauttaa ettei kohta itsekään pysy kärryillä että mitä missäkin kohtaa piti olla. Eli turha tehdä asioista tarpeettoman vaikeita turhaan, koska haasteita kyllä varmaan riittää muutenkin tarpeeksi.

Grez [26.01.2012 15:34:09]

#

makumaku kirjoitti:

täysin samoja lyhyitä nimiä on eri tauluissa

Tämähän nyt ei välttämättä ole huono asia, jos ne viittaa samaan asiaan. Itsekin olen joskus käyttänyt nimeämiskäytäntöä, jossa taulun yksilöivä avain on saman niminen kuin taulu (esim. Asiakas.Asiakas) ja jos jossain toisessa taulussa viitataan tähän niin se on myös nimeltään sama (esim. Lasku.Asiakas)

AkeMake [26.01.2012 17:23:08]

#

Olen kyllä edelleen sitä mieltä, että tuo esittelemäni tapa toimii tässä nimenomaisessa tilanteessa juuri niin kuin pitääkin. Jos halutaan selvittää myös missä kaikissa tapahtumissa henkilö on ollut mukana minäkin vuonna, niin lisätään Tapahtuma tauluun tapahtuman järjestämisvuosi ja vaikka vielä arvoja 0, 1 saava kenttä, jolla erotellaan järjestetyt ja tulossa olevat tapahtumat toisistaan.

Tapahtuma
Id - Nimi - Vuosi - Jarjestetty
1 - Ottelu 1 - 2011 - 1
2 - Ottelu 2 - 2012 - 1
3 - Ottelu 1 - 2012 - 0
4 - Ottelu 3 - 2013 - 0

Varaus
TId - AId
1 - 1
1 - 3
1 - 2
2 - 2
3 - 1
3 - 3
4 - 2

Asiakas
Id - Nimi
1 - Matti Meikäläinen
2 - Maija Meikäläinen
3 - Einari Esimerkki

Tästä voi hakea esimerkiksi vuonna 2012 olevaan ottelu 1:een osallistuvat henkilöt seuraavasti:

SELECT a.Id, a.Nimi FROM Asiakas AS a, Varaus AS v, Tapahtuma AS t WHERE a.Id = v.AId AND v.TId = t.Id AND t.Vuosi = 2012 AND t.Nimi = "Ottelu 1"

Saadaan tulokseksi Matin ja Einarin rivit niin kuin pitääkin.

Sitten halutaan selvittää missä jo järjestetyissä otteluissa Maija on ollut mukana vuosina 2012 ja 2011:

SELECT t:nimi, t.Vuosi FROM Asiakas AS a, Varaus AS v, Tapahtuma AS t WHERE a.Nimi = "Maija Meikäläinen" AND a.Id = v.AId AND v.TId = t.Id AND t.Jarjestetty = 1 AND (t.Vuosi = 2011 OR t.Vuosi = 2012)

Saadaan selville, että Maija on osallistunut vuonna 2011 otteluun 1 ja vuonna 2012 otteluun 2.

latenleffahylly [26.01.2012 17:38:34]

#

huoh.. olette täysin oikeassa. Mutta nähtävästä noista minun 4 taulusta ei saa hakulausetta aikaiseksi joten kaikki taulut tietoineen uusiksi.

totta on sekin, että pitäisi saada jostain kunnon kirja jossa luodaan täydellinen lomake sekä varausjärjestelmä.

Grez [26.01.2012 18:20:24]

#

Saahan niistä sun neljästäkin taulusta tehtyä kyselyn ihan helposti, mutta ei siinä rakenteessa ole mitään ideaa. Yhdistä varaus ja varausrivi ja heitä tapahtumanNimi sieltä huitsiin.

AkeMake [26.01.2012 23:44:24]

#

Grez kirjoitti:

Yhdistä varaus ja varausrivi ja heitä tapahtumanNimi sieltä huitsiin.

Eikä varno -kentälläkään tehdä taulujen yhdistämisen jälkeen mitään.


Edit.

latenleffahylly kirjoitti:

Mutta nähtävästä noista minun 4 taulusta ei saa hakulausetta aikaiseksi joten kaikki taulut tietoineen uusiksi.

Ei kaikkia tauluja tarvitse uusiksi laittaa. Yhdistät vain saman varno arvon omaavat tiedot keskenään. Lisää vaikka Varaus tauluun kenttä T_Id. Tämän jälkeen haet kaikki rivit taulusta Varausrivi. Sitten käyt kaikki haetut rivit foreach silmukalla läpi ja jokaisen rivin kohdalla laitat hallussasi olevan T_Id arvon sille riville Varaus taulussa, jossa varno on sama.

UPDATE Varaus SET T_Id = ? WHERE varno = ?

Grez [26.01.2012 23:49:47]

#

No itse kyllä tykkään pitää jotain primary key kenttää sidostauluissa varsinaisten muihin tauluihin menevien viittausten lisäksi. Tullut joku ORMikin joskus vastaan, joka ei tykkää jos primääriavaimeksi pistää kaksi kenttää.

AkeMake [27.01.2012 00:03:26]

#

Grez kirjoitti:

No itse kyllä tykkään pitää jotain primary key kenttää sidostauluissa varsinaisten muihin tauluihin menevien viittausten lisäksi.

Voihan sen tosiaan jättää sinne primääriavaimeksi. Itse olen kuitenkin tottunut pitämään niillä aina pelkkää 'id' nimeä, joten varno ei tuntunut mielessäni rivin tunnistenumerolta. Mutta juu, varno:n voi toki jättää, jotta yksittäisiin riveihin olisi helpompi viitata.

Metabolix [27.01.2012 00:17:06]

#

Joka tapaukessa olisi viisaampaa nimetä asiat järkevästi ja lyhentelemättä, esimerkiksi tapahtuma_id ja asiakas_id. Ehkä käytännön ero on vaikea ymmärtää, jos ei osaa kovin hyvin ja joutuu joka tapauksessa lukemaan kyselyt hitaasti, mutta asiaa voi miettiä luonnollisten kielten kautta. "Min ol + jos laitt taul m pk:n, nk G jo san." Eikö olekin käytännöllisesti lyhennetty ja helppolukuinen neuvo – vai olisiko kunnolla kirjoitettu kuitenkin parempi?

Suuri etu on myös siitä, ettei koodatessa tarvitse miettiä, oliko taulussa nyt varno, varnro, varnum, vno, vnro vai vnum, kun tietää, että oikea nimi on varausnumero.

latenleffahylly [27.01.2012 00:31:26]

#

no niin jälleen monta kokkia ja keitos vain paranee. Olen huomannut, että ohjelmointi-tyypit ovat todella fiksuja. Tietävät sitä sun tätä elämästä ja miten kaikki toimii, mutta kun aloittelija kysyy niin yleensä käy niin että nämä ohjelmointi-tyypit eivät voi ymmärtää miten joku toukka ei voi ymmärtää.

Eli tässä tapauksessa kaikki ehdotuksenne ovat varmasti täysin oikeita, mutta tämä topicci lähti siitä ideasta, että tekisin työvuoron varaus järjestelmän.. Eli pääsin kultaisen arvokkailla neuvoillanne siihen pisteeseen, että tapahtuman voi luoda, tapahtuman voi valita, tapahtumaan voi osallistua jne. mutta en tajunnut, että nyt en sitten osaakkaan hakea tapahtumaan Tapahtumat taulusta ja näyttää ketkä siihen osallistuivat..

juu.. hyvää yötä joka tapauksessa ja jälleen hienoa että on kaltaisianne ihmisiä, jotka auttavat "heikompiaan".

Grez [27.01.2012 15:06:23]

#

latenleffahylly kirjoitti:

yleensä käy niin että nämä ohjelmointi-tyypit eivät voi ymmärtää miten joku toukka ei voi ymmärtää.

No kyllä minä ainakin mielestäni ymmärsin ihan hyvinkin ja mm. siksi ehdotin lukemaan SQL-opasta että pääsisi jyvälle kyselyiden perusasioista.

Muuhun viestiin en lähde kommentoimaan kun en osaa päättää oliko se sarkasmia vai ei.

latenleffahylly [29.01.2012 13:35:06]

#

ei ollut sarkasmia. No.. tässä nyt vaan on se tilanne että aloitan sitten projektin alusta. Eli onko 3 taulua tarpeeksi?

Tapahtuma:
- Id
- Nimi

Varaus:
- Tapahtuma_Id
- Asiakas_Id

Asiakas:
- Id
- Nimi

Voisiko joku ylipäätään kertoa miten tällainen projekti kannattaa aloittaa koskien tietokannan tauluja ja niiden yhteyksiä.

Metabolix [29.01.2012 14:06:55]

#

latenleffahylly kirjoitti:

Voisiko joku ylipäätään kertoa miten tällainen projekti kannattaa aloittaa koskien tietokannan tauluja ja niiden yhteyksiä.

Alkeellisen tietokannan suunnittelua on kyllä käsitelty jonkin verran Ohjelmointiputkan MySQL-oppaassa, jos vain ymmärrät lukea sieltä myös esimerkit ajatuksella ja miettiä, miksi esimerkeissä on juuri sellaisia tauluja.

Jos tietokannan suunnittelu ei suju luonnostaan, aloita asia kerrallaan. Esimerkiksi tässä tapauksessa pitäisi olla työvuoroja. Niinpä tarvitaan taulu nimeltä tyovuoro, jossa on id. Sitten pitää olla työntekijöitä, jotka varaavat vuoroja. Heille tarvitaan taulu tyontekija, jossa on jälleen id.

Työvuorolla on luultavasti jokin ajankohta, joten työvuorotauluun pitää lisätä alku ja loppu (DATETIME). Työntekijällä taas on varmaan vähintään nimi ja mahdollisesti kirjautumista varten salasana (tai siis suola ja tiiviste).

Jos työvuoron voi varata vain yksi työntekijä, voit laittaa työvuorotauluun sarakkeen tyontekija_id, joka on aluksi NULL ja vaihtuu sitten työntekijän id-numeroon, kun vuoro varataan. Halutessasi voit laittaa myös varausajankohdan. Tässä tapauksessa siis kaksi taulua riittää!

Jos taas vuoron voi varata useampi henkilö, pitää tehdä erillinen varaustaulu, jossa ovat ainakin tyovuoro_id ja tyontekija_id sekä tarvittavat lisätiedot (varauksen ajankohta). Tässäkin taulussa voi olla oma id-sarake. Tätä tapaa voi toki käyttää myös edellisen sijaan, jos jostain syystä ei halua laittaa varausta suoraan työvuorotauluun.

Perussääntö tietokannassa on, että mitään tietoa ei kopioida moneen tauluun vaan tauluista tarvittaessa viitataan toisiin.

latenleffahylly [29.01.2012 20:54:05]

#

hmm.. joo tosiaan kyse on esim. futismatsista jonne tarvitaan esim. 10 työntekijää. Eli tapahtuma, käyttäjällä mahdollisuus varata työvuoro ja ylläpitäjällä mahdollisuus nähdä ketkä kaikki ovat osallistuneet.

...

Grez [29.01.2012 21:15:23]

#

Sinulla on tuohon toimivat taulut viestissäsi 29.01.2012 13:35:06.

Tosin Asiakas sanan korvaisin ehkä Tekijä tms. sanalla, jos tosiaan on tarkoitus kuvata (työn)tekijöitä eikä asiakkaita.

veikkonieminen [30.01.2012 11:33:26]

#

Ihan peräti tuollaista varausjärjestelmää päätit rakentaa, vaikka et osaa ohjelmoida etkä näemmä ymmärrä tietokantasuunnittelusta tuon taivaallista. Onnea projektiisi!

Sienikasvusto [02.02.2012 17:37:16]

#

veikkonieminen kirjoitti:

Ihan peräti tuollaista varausjärjestelmää päätit rakentaa, vaikka et osaa ohjelmoida etkä näemmä ymmärrä tietokantasuunnittelusta tuon taivaallista. Onnea projektiisi!

Noniin siinäpäs olikin rakentava kommentti innokkaalle aloittelevalle ohjelmoijalle. En näkisi tätä projektia herra latenleffahyllylle mitenkään mahdottomana, varsinkin kun hän on itse ilmeisen kiinnostunut opiskelemaan aihetta. Täällä on ollut pahempiakin sohlareita jotka ovat jopa saaneet jotain aikaiseksi ja ehkä jopa oppineet jotain samalla.

Edit. Kattelin vähän millanen mies sä olet ja näemmä taidat itsekkin olla aika alussa vielä tällä polulla...

latenleffahylly [03.02.2012 15:42:38]

#

Kiitos foorumilaisille kaikesta tuesta,

aloitan juuri nyt rakentamaan tietokannan tauluja uusiksi foorumin ohjeiden mukaisesti ja yritän siinä samalla ymmärtää mitä tietoa kannattaa/pitää tallentaa -> ja mihin tauluun.

latenleffahylly [03.02.2012 19:43:04]

#

Hei,

Nyt on uudet taulut luotu ja pieni ongelma edessä?

-----------------------------------------------------------------

Taulut:

Tapahtuma
- T_Id
- tNimi


Asiakas
- A_Id
- aNimi


Varaus
- Tapahtuma_Id
- Asiakas_Id


Ylläpitäjän pitäisi pystyä hakemaan kaikki "asiakkaat" jotka ovat varanneet tapahtuman x. Ylempänä AKEMAKE yritti tätä kohtaa selittää, mutta nyt kun taulujen ja sarakkeiden nimet hieman muuttuneet niin ongelmia. Antaa erroria (virheellinen sql-lause)

Tarvitsisin tiedon SQL-lauseeseen ja miten tulostaa tulos ylläpitäjälle esim. listana/taulukkona!!

latenleffahylly [03.02.2012 20:12:26]

#

Menee yksinpuheluksi.. MUTTA..

Ohjelmointiputkan -oppaalla sain aikaan tällaisen SQL-lauseen. Nyt enää muutan sitä hieman sillä jos asiakas on varannut tapahtuman esim. 3 kertaa, näkyy hän myös listalla 3 kertaa.

$sql_lauseke = "SELECT Asiakas.A_Id, Asiakas.aNimi, Varaus.Asiakas_Id, Varaus.Tapahtuma_Id FROM Asiakas, Varaus WHERE Asiakas.A_Id = Varaus.Asiakas_Id AND Varaus.Tapahtuma_Id=" . $T_Id;

------------------------------------------------

Seuraava ongelmani on kuinka voisin sulkea tapahtuman kun 10 varausta otettu vastaan.

XYZ [03.02.2012 20:23:39]

#

Vastasit jo itse, laitan silti:
select A_Id,aNimi from Asiakas,Varaus,Tapahtuma where
Asiakas_Id = A_Id and T_Id = Tapahtuma_Id and (tNimi = 'kaljakellunta' tai T_Id=? )

Edit:DISTINCT-käskyllä saa rajattua että tulee vain kerran:
SELECT DISTINCT Asiakas.A_Id...

select count(*) varaustenMaara from Varaus,Tapahtuma where Tapahtuma_Id = T_Id and ( tNimi = 'kaljakellunta' tai T_Id=? )

Haet tuon ennen mahdollisuutta varata ja tarkistat onko varaustenMaara 10 jne

latenleffahylly [03.02.2012 20:39:27]

#

Kiitän XYZ, käytin tosiaan tuota distinctiä..

tuota, tuota.. voisiko tapahtumalle antaa numeron esim. TARVE -> 10, jolloin kun ilmoittautujien määrä yli 10 tapahtuma sulkeutuu?

XYZ [03.02.2012 21:07:53]

#

Jos Tapahtuma-taulussa on tarve-kenttä:
select case when ( select count(*) from Varaus,Tapahtuma where Tapahtuma_Id = T_Id and T_Id=? )>=tarve then 0 else 1 end from Tapahtuma where T_Id=?

Palautuisi 1(vielä mahtuu) tai 0(riittää jo).

Ilmeisesti PHP:ssä:
"select case when ( select count(*) from Varaus,Tapahtuma where Tapahtuma_Id = T_Id and T_Id=".$T_Id." )>=tarve then 0 else 1 end from Tapahtuma where T_Id=".$T_Id;

En ole mySql:ää harrastanut enkä voi nyt testata missään, mutta jotain tuohon suuntaa voisi toimia.

Edit: En myöskään osaa juuri PHP:tä, joten jos nuo $T_Id arvot tulee käyttäjän syötteestä, niin ne tulisi tarkistaa ja varmistaa ettei siellä ole yritetty SQL-injectiota. PHP-oppaassa ilmeisesti ohjetta.

latenleffahylly [03.02.2012 21:19:34]

#

hmm.. täytyy tutkia. Tämä olisi hieno lisä muuten täysin toimivaan työvuoron varaus ohjelmaan, kiitos XYZ!

Metabolix [03.02.2012 21:20:09]

#

Otahan oppaista mallia siinä, miten kyselyt suoritetaan. Muuttujia ei pidä lisätä kyselyyn noin, se on vaarallista.

latenleffahylly [03.02.2012 21:29:12]

#

"Varaus.Tapahtuma_Id=" . $T_Id . "";

Tarkoitatko Metabolix että loppuosa kirjoitetaan näin?

Metabolix [03.02.2012 21:42:35]

#

Tarkoitan, että loppuosaa ei pidä kirjoittaa noin. Olisit tuossa ajassa varmaan jo etsinyt oppaan ja katsonut sieltä, miten PDO:n prepare- ja execute-metodeita käytetään.

XYZ [03.02.2012 21:43:30]

#

Riittäisikö numeerisissa arvoissa integeriksi muunnos? .(int)$T_Id.

Metabolix [03.02.2012 21:56:27]

#

Numeerisissa arvoissa riittäisi, mutta ainakaan aloittelijan ei minusta kannata lähteä tuolle linjalle, vaan turvallisempaa on opetella ensin yksi hyvä tapa, joka toimii myös teksteihin.

latenleffahylly [04.02.2012 12:20:32]

#

Kysyn vielä uudestaan eli ? ...onko mahdollista antaa Tapahtuma-taululle kenttä TARVE. Jos tarve 10 -> tapahtumaan voi ilmoittautua 10 henkilöä. Kun 10 varausta täynnä -> tapahtuma "sulkeutuu".

--------------

..ja lyhyt huomautus avuliaalle Metabolixille, eli et näköjään vieläkään ole halunnut sisäistää että tasoni on "rookie". Eli en ymmärrä kaikkia viestejäsi.. "PDO:n prepare- ja execute-metodeita" <- joten jos kommentoit - kommentoi suomeksi, dankke.

Metabolix [04.02.2012 12:47:52]

#

latenleffahylly kirjoitti:

"PDO:n prepare- ja execute-metodeita" <- joten jos kommentoit - kommentoi suomeksi, dankke.

Minusta on paljon hyödyllisempää neuvoa käyttämään "PDO:n prepare- ja execute-metodeita" kuin "PHP:n tieto-oliorajapinnan valmistelu- ja suoritusjäsenaliohjelmia", nimittäin ensiksi mainituilla sanoilla löytyy netistä tuhansittain ohjeita ja on helppo ymmärtää, että koodirivit "new PDO" ja "$pdo->prepare" liittyvät aiheeseen, kun taas jälkimmäisillä sanoilla tuskin löytyy yhtäkään tulosta eikä sanoja esiinny varmaan missään koodissa. Mutta jos olet todella tuota mieltä, voin jatkossa kirjoittaa kaiken suomeksi, niin saat sitten arvailla, mihin sanat ehkä liittyvät. Nykyisellään tuntuu lähinnä, että olet liian laiska kirjoittaaksesi annettuja sanoja edes hakuun: PDO prepare execute antaa aika selviä tuloksia.

Onko oikeasti liikaa vaadittu, että painaisit sivun yläreunassa olevaa Oppaat-linkkiä ja etsisit oppaan nimeltä MySQL ja PHP: Osa 2 - PHP ja PDO tai edes PHP-ohjelmointi: Osa 12 - Tietokannat? Näissä on monta selvää esimerkkiä siitä, miten tietokantaa käsitellään. Oppaista olennaisia kohtia voi etsiä sanoilla prepare ja execute, mutta tietenkin oppaat kannattaa lukea kokonaan, kun et vielä tiedä asiasta mitään.

latenleffahylly [04.02.2012 13:36:29]

#

Luetaan, luetaan..

Ensinnäkin tein 3 uuttaa taulua 4 sijaan. Sitten sain SQL-lauseen toimimaan, joka hakee kaikki tapahtumaan osallistujat. Nyt koko työvuoron varaus järjestelmä toimii. Seuraava luksus olisi tapahtuman sulkeutuminen kun se on täynnä.

..Eli olen lukenut ohjeitanne, Ohjelmointiputkan oppaita, omaa kirjaa, ja paria muuta netti-opas-sivua. Tuntuu, että täällä ei vieläkään ymmärretä sitä, että luultavasti osaan jotain jo, mutta suuria ("tietoturva") aukkoja on koodamisessani.

Metabolixin kaltaisten foorumilaisten suurin ongelma on se, että he ovat tasolla "Master" tai "Genius" kun taas minä tasolla "Rookie". On vaikea ymmärtää kaikkia antamianne ohjeita. Toiseksi en ole laiska koska olen tehnyt omia projektejani käytännössä 7pv/viikossa viimeiset 3 vuotta.. no joo nyt oppaisiin..

------------------------------------------------------------------

Jos nyt oikein ymmärsin niin PDO olisi:

1. turvallinen tapa käsitellä tietokantoja.
2. kätevä tapa käsitellä erilaisia tietokantoja.

..tämä kysymys on hieman typerä, mutta eikö ole vaikeaa kun ensin opettelee PHP:tä ja sitten joku kertoo että on olemassa PDO niin koodihan on aivan eri näköistä kuin ennen? Aika vaikea omaksua, vai onko sittenkään..

Tulisiko minun opetella käsittelemään tietokantoja PDO-PHP:llä pelkän PHP:n sijaan!?

Metabolix [04.02.2012 13:54:46]

#

latenleffahylly kirjoitti:

On vaikea ymmärtää kaikkia antamianne ohjeita.

Jos olet lukenut oppaat muttet ymmärrä jotain asiaa, voisit edes kertoa, mitä kohtaa niissä et ymmärrä. On ihan mahdotonta auttaa, jos kysymys on tasoa "kertokaa suomeksi, kiitos". (Jos taas et ole lukenut vielä oppaita, on aika turha kysellä foorumilla; oppaat on tehty juuri sitä varten, ettei kaikkea tarvitse selittää jokaiselle kysyjälle erikseen.)

latenleffahylly kirjoitti:

PDO – – niin koodihan on aivan eri näköistä kuin ennen? Aika vaikea omaksua, vai onko sittenkään..

Ei ole olennaisesti erilaista.

latenleffahylly kirjoitti:

Tulisiko minun opetella käsittelemään tietokantoja PDO-PHP:llä pelkän PHP:n sijaan!?

"Kyllä." Sinänsä koko kysymys on mieletön, koska "pelkällä PHP:llä" ei voi käsitellä tietokantoja ja "PDO-PHP" ei eroa mitenkään muusta PHP:stä. PDO on yksi PHP:n kirjasto muiden joukossa, aivan kuten se mysql_-alkuisista funktioista koostuva kikkare on yksi PHP:n kirjasto. PDO käyttää luokkia ja olioita, vanha MySQL-kirjasto käyttää funktioita, ja sekä funktiot että luokat ovat yhtä lailla osa aivan tavallista PHP:tä.

Tietoturvassa pääsee pitkän harppauksen eteenpäin, kun suorittaa kaikki kyselyt PDO:lla niin, että prepare-metodille annetaan valmis teksti (ei yhtäkään muuttujaa!) ja kaikki kyselyyn lisättävät muuttujat annetaan vain ja ainoastaan execute-metodille.

latenleffahylly [04.02.2012 14:02:57]

#

Kiitos näistä.. Mb.

Tuota jos ehdit sen verran vastata, niin miten voisin viitata PHP:ssä taulun sarakkeeseen?

$tarve =

                        $sql_lauseke = "SELECT * FROM Tapahtuma WHERE Tarve BETWEEN 0 AND " . $tarve . " ORDER BY tPvm";

latenleffahylly [04.02.2012 16:41:58]

#

Noniin nyt olen jo todella pitkällä eli kaikki muu toimii paitsi se, että käyttäjä voi varata saman tapahtuman useamman kerran?

Miten tämän saa estettyä?

Metabolix [04.02.2012 16:45:44]

#

Varaustaulussasi pitäisi olla UNIQUE KEY (Tapahtuma_Id, Asiakas_Id).

latenleffahylly [04.02.2012 16:48:04]

#

Hetkinen eli Primary Key sijaan Unique Key?

Metabolix [04.02.2012 16:49:32]

#

PRIMARY KEY ajaa kyllä saman asian, kunhan molemmat sarakkeet ovat siinä mukana. Jos taulussa on muu PRIMARY KEY (kuten aiemmin ehdotettiin), sitten pitää tehdä noista kahdesta UNIQUE KEY.

latenleffahylly [04.02.2012 16:50:41]

#

Tapahtuma
- Tapahtuma_Id (FK)
- Asiakas_Id (FK)
- varno (PK)

Metabolix [04.02.2012 16:52:24]

#

No niin. Toistan vielä. "Varaustaulussasi pitäisi olla UNIQUE KEY (Tapahtuma_Id, Asiakas_Id)." Mitä kohtaa et ymmärtänyt? Tietenkin taulussa on lisäksi PRIMARY KEY ja kaksi FOREIGN KEYtä.

latenleffahylly [04.02.2012 16:53:24]

#

Hetkinen nyt minulla on ollut nuo 2 Foreign Key ja homma toiminut eli muutan ne 2 Primary Key ja varno Foreign Key

Metabolix [04.02.2012 16:54:10]

#

Mitä? Ei. Vaan lisää sinne noiden lisäksi yksi UNIQUE KEY.

latenleffahylly [04.02.2012 16:57:08]

#

Kirjoitit ylhäällä -> UNIQUE KEY (Tapahtuma_Id, Asiakas_Id)

..saako jompi kumpi noista arvon UK

latenleffahylly [04.02.2012 17:03:25]

#

Noniin aloitetaan alusta varovasti..

eli: (alla taulu)

Varaus
- Tapahtuma_Id (Foreign Key)
- Asiakas_Id (Foreign Key)
- varno (Primary Key)


...........Lisätäänkö 2 alla olevaan sarakkeeseen nyt arvot Unique Key

- Tapahtuma_Id (Foreign Key) + (Unique Key)
- Asiakas_Id (Foreign Key) + (Unique Key)

Metabolix [04.02.2012 17:03:25]

#

Minkä ihmeen "arvon UK"? Eikä foreign key mitenkään noin toimi, mitähän ihmettä olet tehnyt? Entä miksi ihmeessä nämä tiedot ovat tauluss Tapahtuma, kun niiden pitäisi olla taulussa Varaus?

Toistan vielä kolmannen kerran. Lisää varaukset sisältävään tauluun UNIQUE KEY (Tapahtuma_Id, Asiakas_Id). Aivan juuri näin. Voit lisätä tämän esimerkiksi tällaisella kyselyllä:

ALTER TABLE Varaus ADD UNIQUE KEY (Tapahtuma_Id, Asiakas_Id)

latenleffahylly [04.02.2012 17:05:25]

#

Parahin Metabolix et vieläkään halua ymmärtää, että tasoni on "Rookie" = aloittelija

Sinun "Master" tai "Genius" = tunnut tietävän kaiken PHP:stä

-----------------------

ajatuksemme eivät kohtaa koska kuulin juuri ensi kertaa Unique Key arvosta???

latenleffahylly [04.02.2012 17:08:41]

#

Noniin nyt olen mokannut eli tarkoitin VARAUS

Metabolix [04.02.2012 17:08:53]

#

Asioita edistäisi, jos et yrittäisi tiivistää kysymyksiäsi vaan näyttäisit ihan koko kyselyt, joilla olet oikeasti luonut taulusi. On ihan mahdotonta taas tietää, mitä tämäkin viritelmäsi oikeasti yrittää tarkoittaa: "Tapahtuma_Id (Foreign Key) + (Unique Key)". En näe tällä oikein mitään yhteyttä MySQL:n syntaksiin.

latenleffahylly [04.02.2012 17:09:41]

#

Kiitos Metabolix, ja pahoittelut..

latenleffahylly [04.02.2012 20:29:23]

#

Ehtiikö joku auttamaan hetken?

..Ongelma, miten tarkistetaan onko tapahtuma täynnä sillä hetkellä kun käyttäjä klikkaa "varaa työvuoro tapahtumaan"?

Tapahtuma
- Vapaana

Tapahtuma -taulussa on kenttä Vapaana josta miinustetaan (-1) aina kun käyttäjä klikkaa "varaa työvuoro tapahtumaan".

$sql_taynna = "SELECT Vapaana FROM Tapahtuma WHERE T_Id = '$_POST[T_Id]'";
                                $tulos = mysql_query($sql_taynna);

                                if ($tulos < 1) {
                                    echo "Tapahtuma on taynna!";
                                }

                                else {

Tämä koodi ei toiminut kun kokeilin 2 selainikkunaa auki! Silti pystyi varaamaan ja Vapaana sarakkeen kohdalle tuli -1, vaikka sen pitäisi pysähtyä nollaan.

Olli [04.02.2012 20:33:28]

#

Muista tarkistaa käyttäjän syöttämän sisällön oikeellisuus, ei koskaan tuohon tapaan miten olet tehnyt.

Ja miinustus tietenkin - tarkistat onko arvo nollaa pienempi - jos on, ei miinusteta, ja jos ei, niin miinustetaan.

latenleffahylly [04.02.2012 20:40:30]

#

Joo.. mutta nyt kyse siitä että kun minulla 2 selain ikkunaa auki niin vaikka toisesta varaa viimeisen vuoron niin toinen ikkuna on edelleen auki ja saman voi tehdä.

Miten estää tämä, että ohjelma tarkistaisi joka kerta.. (vertaisi Vapaana saraketta 0 = 0)

Metabolix [04.02.2012 20:50:51]

#

Koodissasi on varmaan jo monta kohtaa, joissa haet tietokannasta tietoa – vertaa niitä tuohon ja mieti, mikä menee pieleen. Kiinnitä erityisesti huomiota siihen, mitä mysql_query-funktion palauttamalla arvolla tehdään ja mistä ne oikeat tietokannan tiedot tulevat.

latenleffahylly kirjoitti:

Tuntuu, että täällä ei vieläkään ymmärretä sitä, että luultavasti osaan jotain jo

Kyllä tällaiset käsittämättömät töppäilyt puhuvat selvää kieltä sitä osaamista vastaan. Vaikuttaa siltä, että "osaat" lähinnä kopioida valmiita pätkiä ja vaihtaa niihin parin muuttujan nimen.

Lopuksi vielä debuggauksen alkeet: kun koodi ei toimi, tulosta esimerkiksi var_dump-funktiolla muuttujien arvoja eri vaiheissa ja katso, missä kohti alkaa mennä pieleen. Esimerkiksi tuossa voisit aloittaa tulostamalla $tulos-muuttujan arvon juuri ennen if-lausetta – näyttääkö järkevältä?

latenleffahylly [04.02.2012 21:22:50]

#

$sql_haetietoja = "SELECT Vapaana FROM Tapahtuma WHERE T_Id = '$_POST[T_Id]'";

                                            if(!$haku = mysql_query($sql_haetietoja))
                                            {
                                            echo "Haku epaonnistui!";
                                            }
                                            else
                                            {
                                            $tulos = mysql_fetch_row($haku);

                                            if ($tulos < 1) {
                                                echo "Tapahtuma on taynna!";
                                            }

Miten saisin tietää millaisen arvon $tulos pitää sisällään. Harmittaa että vaikka etsin googlesta "debuggauksen alkeet" niin menen vain enemmän sekaisin.

Vielä enemmän harmittaa, että olen jo viimeisessä vaiheessa, mutta nyt tulee PHP osaamattomuuteni vastaan. Tarkoitus on aloittaa alkeista kun saan tämän kohdan tehtyä, mutta vasta sitten - voitteko edes kertoa miten voisin tulostaa $tulos -muuttujan arvon. Kiinnostaisi nähdä onko se edes luku.

latenleffahylly [04.02.2012 21:28:49]

#

echo $var_dump();

latenleffahylly [04.02.2012 21:29:06]

#

?

Metabolix [04.02.2012 21:30:54]

#

latenleffahylly kirjoitti:

Tarkoitus on aloittaa alkeista kun saan tämän kohdan tehtyä, mutta vasta sitten

Todella outo järjestys. Yleensä ensin opetellaan ja vasta sitten tehdään.

latenleffahylly kirjoitti:

Miten saisin tietää millaisen arvon $tulos pitää sisällään.

Luetko edes näitä vastauksia? Juuri kerroin:

Metabolix kirjoitti:

– – tulosta esimerkiksi var_dump-funktiolla muuttujien arvoja – –

Jos ei pysty itse edes etsimään tietoa var_dump-funktiosta, jokin on jo aika pahasti vialla.

PHP:n ohje kirjoitti:

Esimerkki 1:

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

latenleffahylly [04.02.2012 21:34:38]

#

var_dump($tulos);

latenleffahylly [04.02.2012 21:36:28]

#

Saan oikean tuloksen? ..huoh.. yritän nyt päästä eteenpäin. Luultavasti tarkistukseni on jotenkin outo..

if ($tulos < 1) {
                                                echo "Tapahtuma on taynna!";
                                            }

latenleffahylly [04.02.2012 21:40:32]

#

array(1) { [0]=> string(1) "2" }

..toivotonta

Macro [04.02.2012 21:58:50]

#

Kuten näet, funktio palauttaa taulukon. Sen ensimmäisessä solussa on string-tyyppinen arvo, nähtävästi numero 2. Jos haluat verrata sitä toiseen numeroon, tee näin.

if((int) $tulos[0] < 1)

latenleffahylly [04.02.2012 22:24:59]

#

Thänks Macro, auttaa kummasti kun oppii lukemaan tulostusta. Nyt nämä 2 tulostusta ovat juuri niin kuin pitää, mutta silti viimeisen vuoron jälkeen voi varata eli PHP-koodissa varmasti vika.

array(1) { [0]=> string(1) "0" }

array(1) { [0]=> string(2) "-1" }

makumaku [04.02.2012 23:27:51]

#

Täytyy mainita ettei tuossa koodissa ole paljoa mitään logiikkaa. Paljon myös sellaisia vikoja/puutteita joita tässäkin ketjussa on jo sanottu.
Ymmärrätkö itse mitä tuon koodin pitäisi tehdä, vai oletko kopioinut vain palasia sieltä sun täältä yhteen? Kirjoita vaikka kunnolliset kommentit itsellesi joka riville, niin ehkä se auttaisi hahmottamaan asiaa paremmin.

Melkein voisin suositella että keskeytät tämän koodauksen nyt vaikka viikoksi, ja käytät sen ajan esim Putkan oppaiden lukemiseen (php, mysql, pdo, jne..). Vaikka pari päivää per opas, ajatuksen kanssa niin että ymmärrät asiat ennekuin siirryt eteenpäin. Tämä voisi olla nopein ja paras tapa edetä.

Jos kysymykset ovat tasoa "kuinka saan selville muuttujan arvon?", niin se kertoo että et ole kunnolla edes rookie-tasolla, vaan nyt olisi aika opetella perusasiat kuntoon.

latenleffahylly [04.02.2012 23:39:41]

#

Noniin, nyt toimii. Vastaushan oli kirjoitettu eteeni -> thänks Macro vielä kerran :)

- Nyt osaan sitten hakea tulostuksen (esim. var_dump($tulos);)

---------------------------------

..juu makumaku, olet myös täysin oikeassa. Tarkoitus on tehdä tämä projekti loppuun ja sitten aloittaa tutkimaan mitä kaikkea Ohjelmointiputka tarjoaa ja pitää sisällä.

Valitettavasti en osaa PHP:tä. En ole myös niin koskaan väittänyt. Kun ohjelmointi taidoistani kysytään - kerron, että ymmärrän PHP:tä. Ymmärrän suunnilleen mitä koodissa tehdään missäkin kohdassa.

- Tietoturva (vaikeaa)
- Järkevin tapa käyttää IF, ELSEIF, ELSE (en osaa)
- Tietokannan käsittely PDO (kuulin ekaa kertaa tänään)
- Unique Key (käytin ekaa kertaa tänään)

..uskon kuitenkin että tällä menolla ja sillä että aloitan ihan putkan oppaista pääsen tasolle "Rookie". Jokatapauksessa olen itse koodannut ohjelman jonka voi laittaa nettiin ja sieltä varata työvuoroja. Koodia olen kopioinut sieltä täältä. Neuvoa olen kysellyt liikaa koska olen kärsimätön ja liian kiireinen.

..Toivon jatkossa että en vaivaisi väärillä kysymyksillä. Mutta esim. kun hain tietoa VAR DUMP -funktiosta, niin menin vain entistä sekaisemmaksi. Ilman putkaa en olisi saanut ohjelmointityötäni valmiiksi ikinä. Kiitos ylläpitäjille ja foorumisteille kärsivällisyydestä, avusta ja siitä että ette ala haukkumaan vaikka tiedätte taitoni (taidottomuuteni).

kiitos very much! <3

Olli [05.02.2012 13:15:49]

#

Tietoturva ei ole oikeastaan kovinkaan vaikeaa, varsinkaan PDO:ta käyttäessäsi. PDO tekee kyselyistä turvallisia. Muista kuitenkin, että muuttujat täytyy antaa PDO:lle vasta execute-funktion yhteydessä.

makumaku [05.02.2012 14:01:22]

#

latenleffahylly kirjoitti:

- Nyt osaan sitten hakea tulostuksen (esim. var_dump($tulos);)

Koska vertasit muuttujaa tyyliin if ($tulos == -1), niin oletit varmaan että muuttuja olisi ollut tyyppiä int. Tälläisen olisit tietenkin voinut "debugata" ihan tyyliin echo $tulos; Nyt tuo eo tietenkään toimi koska tyyppi ei ole int.

Kun osaat debuggauksen minimialkeet, niin koodin kokeilu ja virheiden löytäminen helpottuu huomattavasti.

Jos tiedät että muuttuja ja tyyppiä int, string, tai vastaava niin helpoiten sen tietenkin voi tarkistaa tulostamalla :

echo $muuttuja;
echo "Muuttuja X on : ".$muuttuja;

Jos haluat tarkistaa muuttujan arvon niin ettei koodi mene tiettyä kohtaa pidemmälle, vaan koodin suoritus loppuu, voit käyttää vaikka die()-funkitota.

die("Muuttuja X on : ".$muuutuja);

Sitten jos muuttujan tyypistä ei ole tietoa, tai se on taulukko tai vastaava, niin voit käyttäää joko var_dump(), print_r() tai jopa var_export().
Peruserot näissä on että var_dump antaa eniten tietoa (muuttujan tyypin että arvon), print_r antaa vain muuttujan arvon ja var_export() antaa tuloksen "php-formaatissa".
Pääsääntöisesti voit käyttää var_dump(), mutta jos muuttujan tyyppi ei kiinnosta niin esim print_r voi antaa aavistuksen selkeämmän tulosteen.
Tulostus selketyy vielä jos muotoilet tulosteen <pre>-tageilla, esim

echo "<pre>";
var_dump($a);
echo "</pre>";

Lisäksi testaus/koodausvaiheessa aina varoitukset päälle, esim tiedoston alkuun:

error_reporting(E_ALL ^ E_NOTICE);

Tämä siis ihan perus"debuggausta". Sitten jos halutaan tutkia koodia ammattimaisemmin niin opetellaan käyttämään oikeata debuggeria, jossa voit esim askeltaa koodia rivi kerrallaan ja seurata useata muuttujaa yhtä aikaa, jne...

Metabolix [05.02.2012 14:09:37]

#

makumaku kirjoitti:

E_ALL ^ E_NOTICE

Miksi ihmeessä näin? E_ALL | E_STRICT antaa enemmän.

latenleffahylly [05.02.2012 15:43:35]

#

Juu.. paljon hyvää tietoa -mm- ..tuota, tuota. Osaatteko sanoa miksi tietokanta yhteyteni ei sulkeudu lopussa.

Nyt kun varannut työvuoron voi päivittää selaimen ja vapaana olevista paikoista vähenee aina 1 eli koodi suoritetaan kokonaisuudessa uudestaan ja uudestaan.

--------------------------------------

HUOM! (tiedän että koodi on jotenkin täysin pielessä)

<?php
       if($_POST['submit'] && isset($_POST['submit'])) {

                       function check_input($value)
                           {
                               // Stripslashes
                               if (get_magic_quotes_gpc())
                                   {
                                       $value = stripslashes($value);
                                   }
                               // Quote if not a number
                               if (!is_numeric($value))
                                   {
                                       $value = "'" . mysql_real_escape_string($value) . "'";
                                   }
                                       return $value;
                            }

                               $con = mysql_connect("x","x","x");
                               if (!$con)
                                   {
                                       die('Could not connect: ' . mysql_error());
                                   }
                                       mysql_select_db("x", $con);

                                       // Make a safe SQL
                                       $tNimi = $_POST['tNimi'];
                                       $tSijainti = $_POST['tSijainti'];
                                       $tJarjestaja = $_POST['tJarjestaja'];
                                       $tPvm = $_POST['tPvm'];
                                       $tAlkaa = $_POST['tAlkaa'];
                                       $tLoppuu = $_POST['tLoppuu'];
                                       $Tarve = $_POST['Tarve'];
                                       $Vapaana = $_POST['Vapaana'];
                                       $tInfo = $_POST['tInfo'];
                                       $tKuva = $_POST['tKuva'];
                                       $annettuASNO = $_POST['A_Id'];
                                       $Tapahtuma_Id = $_POST['T_Id'];





                                       $sql_asiakas = "SELECT aNimi FROM Asiakas WHERE A_Id = '$_POST[A_Id]'";

                                                   if(!$haku = mysql_query($sql_asiakas))
                                                       {
                                                           die('kohta 2 - Could not connect: ' . mysql_error());
                                                       }


                                                           $animi = mysql_fetch_row($haku);

                                                           $sql_lauseke1 = "SELECT * FROM Asiakas WHERE A_Id = '$annettuASNO'";

                                                           $result = mysql_query($sql_lauseke1);

                                                           $count = mysql_num_rows($result);

                                                           if(!$count == 1)
                                                               {
                                                                   die('kohta 3 - Tarkista asiakasnumero: ' . mysql_error());
                                                               }
                                                           else
                                                               {
                                                                   $sql_lauseke3 = "UPDATE Tapahtuma SET Vapaana = Vapaana - 1 WHERE T_Id =" . $_POST['T_Id'] . "";
                                                               }


                                                           if (!mysql_query($sql_lauseke3,$con))
                                                               {
                                                                   die('kohta 4 - Could not connect: ' . mysql_error());
                                                               }
                                                           else
                                                               {
                                                                   $sql_haetietoja = "SELECT Vapaana FROM Tapahtuma WHERE T_Id = '$_POST[T_Id]'";
                                                                   if(!$hae = mysql_query($sql_haetietoja))
                                                                   {
                                                                       die('kohta 5 - Could not connect: ' . mysql_error());;
                                                                   }
                                                                   else
                                                                   {
                                                                       $tulos = mysql_fetch_row($hae);

                                                                       if((int) $tulos[0] < 0)
                                                                           {
                                                                               die('kohta 6 - Could not connect: ' . mysql_error());
                                                                           }
                                                                   }
                                                               }

                                                           $sql_lauseke2 = "INSERT INTO Varaus (Tapahtuma_Id, Asiakas_Id, varno, date) values('$_POST[T_Id]', '$_POST[A_Id]', '$_POST[varno]', '$_POST[date]')";

                                                           if (!mysql_query($sql_lauseke2,$con))
                                                               {
                                                                   die('kohta 7 - Could not connect: ' . mysql_error());
                                                               }
                                                           else
                                                               {
                                                                   echo "<h1>Tyovuoro varattu</h1>";

                                                               }


                                                   }
                                                   mysql_close($con);

                       ?>

Työvuoronvaraus ohjelmaa toimii kaikin puolin hyvin, mutta lopussa yhteys ei sulkeudu! Päivittämällä selaimen koodi suoritetaan uudestaan ja uudestaan!

qeijo [05.02.2012 16:10:47]

#

Scripti tulkitsee sivunlatauksen aina vain uutena latauksena, ja suorittaa komennot uudestaan.. Ohjaa käyttäjä uudelle sivulle kun komennot on suoritettu välttääkseen tätä efektiä. Tai lisää lomakkeeseen joku tarkistusarvo, joka muuttuu jos sivua päivitetään / tai back postataan.

Muista käsitellä virheet niin että käyttäjälle ei tule esim. mysql_error() virheitä koskaan näkyviin.

Metabolix [05.02.2012 16:14:24]

#

Lomakkeen käsittelysivun ei yleensä pitäisi tulostaa käyttäjälle muuta kuin tarvittaessa virheilmoitukset. Lomake pitäisi käsitellä omalla sivunlatauksellaan, ja käsittelyn lopuksi käyttäjä pitää ohjata uudelle sivulle (header("Location: osoite")), jossa näytetään tarvittaessa OK-viesti. Usein erillistä OK-viestiä ei tarvitse edes näyttää, vaan esim. varauslistasta näkee, että varaus meni perille.

tsuriga [05.02.2012 16:26:17]

#

Metabolix kirjoitti:

Usein erillistä OK-viestiä ei tarvitse edes näyttää

Hyvä käyttöliittymä viestii myös onnistuneista toiminnoista.

latenleffahylly [05.02.2012 16:28:30]

#

Tuota, tuota..

Tarkoitus ei ole näyttää lopullisessa versiossa erroreita vaan korvata ne tekstillä.

- Toinen juttu on se että on varaa.php (lomake)
- sekä varattu.php (php-koodi)

..eli jollain header -koodilla voisin ohjata käyttäjän ohi? varattu.php -sivun ja näyttää varaustiedot??

qeijo [05.02.2012 16:31:12]

#

tsuriga kirjoitti:

Metabolix kirjoitti:

Usein erillistä OK-viestiä ei tarvitse edes näyttää

Hyvä käyttöliittymä viestii myös onnistuneista toiminnoista.

Hyvä käytöliittymä ei myöskään näytä ylimääräisiä OK - sivuja, kun varauslista ajaa samaa asiaa.

latenleffahylly [05.02.2012 16:36:29]

#

Noniin riita poikki - kiitos taas - sain homman toimimaan:

Eli käyttäjä ohjataan tapahtuman omalle info sivulle jossa tarkat tiedot tapahtumasta.. esim. "ottakaa henkilökortti tai passi mukaan jne."

Metabolix [05.02.2012 16:38:03]

#

tsuriga kirjoitti:

Hyvä käyttöliittymä viestii myös onnistuneista toiminnoista.

Onko mielestäsi siis vaikkapa Ohjelmointiputkan keskustelun käyttöliittymä huono, kun viestin kirjoituksen päätteeksi ei tule näyttävää "Viestin lähetys onnistui!" -ilmoitusta? Minusta turhat ilmoitukset ovat tökeröitä, jos toiminnon seuraukset tulevat loogisella tavalla muutenkin esiin.

latenleffahylly [05.02.2012 16:54:32]

#

Hei vielä yksi nopea..

- Kun käyttäjä ensin varaa työvuoron -> kaikki ok

- Kun käyttäjä epähuomiossa syöttääkin oman asikasnumeronsa uudelleen (tapahtuma lomake) ja painaa ok -> tapahtuman vapaana olevista paikoista vähenee -1 kun selaimen päivittää vähenee taas 1

--------- Käyttäjä siis epähuomiossa käy varaamassa työvuoron 2 kertaa


..no yritän itse tätä miettiä, mutta huomaan kun saan yhden kohdan tehtyä tulee aina uusi ongelma jne. Headr-koodi pätkä toimii upeasta, mahtavaa!!

Metabolix [05.02.2012 16:56:39]

#

Varmaan tuo laskurisi vähentäminen tapahtuu väärässä paikassa. Kai nyt järkikin sanoo, että sitä pitää vähentää vasta samassa vaiheessa, kun varaus tallennetaan kantaan.

Laskuri on kyllä juuri tällaisten ongelmien takia aika hölmö ratkaisu, kannattaisi vain säilyttää tarvittava kokonaismäärä muuttumattomana ja verrata sitä kyseiseen tapahtumaan tehtyjen varausten määrään (SELECT COUNT(*) FROM Varaus WHERE ...).

latenleffahylly [05.02.2012 16:59:49]

#

totta.. metabolix, yritän korjata.

latenleffahylly [05.02.2012 19:07:37]

#

Hei taas,

Miten kannattaisi näyttää käyttäjälle että tapahtuma on varattu loppuu.

- eli minulla on lista Tapahtumat:

- Tapahtuma A
- Tapahtuma B
- Tapahtuma C
- Tapahtuma D (täynnä)

- Haluaisin näyttää "täynnä ilmoituksen" tapahtuman vieressä -> kun tapahtuman X varauksien ja tapahtuman X TARVE luku sama.

- Kysyn siksi että vaikka ymmärrän SQL-lauseen

$sql_haetietoja2 = "SELECT COUNT(Tapahtuma_Id) FROM Varaus WHERE Tapahtuma_Id = " . $Tapahtuma_Id . " ";

..niin tässä kohtaa olisi kiva tehdä jokin yksinkertaisempi ratkaisu??

tsuriga [05.02.2012 19:13:55]

#

Metabolix kirjoitti:

Onko mielestäsi siis vaikkapa Ohjelmointiputkan keskustelun käyttöliittymä huono, kun viestin kirjoituksen päätteeksi ei tule näyttävää "Viestin lähetys onnistui!"

Tarkoitin viestimisellä palautteen antamista. Joissakin tapauksissa, kuten mainitsitkin esimerkiksi viestin lähettämisen Putkassa, riittävä visuaalinen palaute saavutetaan yksistään toiminnon tekemällä muutoksella. Näin eritoten kun käytössä on Ajax-tekniikat ja palaute on välitön. Jos viesti tallennettaisiin toisella sivulla, en näkisi myöskään tuota "viestin lähetys onnistui!" -viestiä ongelmallisena. Palautetta antaessa palautteen pitää tulla käyttäjälle siten, että se on samalla käyttäjälle luonnollinen ja helposti havainnoitava, mutta myös sellainen, ettei se estä tai vaadi käyttäjältä ylimääräisiä toimintoja. Esimerkkinä vaikkapa Windowsin taskbarista laukeavat notifikaatiot: pientä animaatiota huomion saamiseksi, tietty värikoodaus, sekä automaattinen piilotus.

Toisena kriteerinä näkisin tässä toiminnon tuloksen merkityksellisyyden tai lopullisuuden: vähäpätöisistä välituloksista ei tarvitse ilmoittaa, vaan vasta lopputuloksesta. Esimerkiksi tapetin värin valinta rautakaupan webbisovelluksessa, jossa värejä voi esikatsella palettia painelemalla.

Kolmantena kriteerinä on toistuvuus: jos toiminto toistuu useasti peräkkäin, toistuva teksti-ilmoitus voi olla rasittava. Tällöin voi olla parempi käyttää juurikin esimerkiksi värikoodausta. Työvuorovarauslistan kanssa tämä tulee varmaan esille.

qeijo kirjoitti:

Hyvä käytöliittymä ei myöskään näytä ylimääräisiä OK - sivuja, kun varauslista ajaa samaa asiaa.

Ilmoituksen ei pidäkään olla ylimääräinen sivu, vaan jokin selkeä, mutta häiritsemätön palaute käyttäjälle suoritetusta toiminnosta. Varauslistan tapauksessa edellä mainittu riittävän havainnollisuuden kriteeri ei välttämättä täyty, riippuen toki varauslistan toteutuksesta.

Metabolix [05.02.2012 19:13:59]

#

latenleffahylly kirjoitti:

..niin tässä kohtaa olisi kiva tehdä jokin yksinkertaisempi ratkaisu??

Ei ole olemassa mitään maagista yksinkertaisempaa ratkaisua. Alkuun selvintä on ehkä hakea joka tapahtumalle erikseen tuo varausten määrä samalla, kun on tulostamassa kyseisen tapahtuman tietoja. Tehokkaampaa on hakea kaikkien tapahtumien varausmäärät samalla itse tapahtuman kanssa (sellaisilla tempuilla kuin JOIN ja GROUP BY), mutta sinun on parempi panostaa helppouteen, jotta ymmärtäisit koodiasi.

latenleffahylly [10.02.2012 17:14:11]

#

Hei kaikille,

Haluaisin kiittää etenkin ylläpitäjiä kaikesta avusta työvuoronvaraus ohjelman teko projektissa.

PROJEKTI STATUS: 90%
TYYPPI: INTRANET (yrityksen työntekijät)/ INFO-sivu (www)


ylläpitäjä
- lisää tapahtuma
- muokkaa tapahtumaa (update/delete)
- katso ketkä ovat osallistuneet tapahtumaan


käyttäjä
- selaa tapahtumia
- tapahtuman info-sivu (mm. google maps)
- tieto kun tapahtuma täynnä (loppuun varattu)
- mahdollisuus varata työvuoro
- jos epähuomiossa yrittää varata tapahtuman johon on jo varannut työvuoron (ei onnistu, ilmoitus!)


Tulossa:

- Työntekijöiden selaus, muokkaus, poisto


Suurkiitokset henkilöille, jotka auttoivat projektissa. Ja on sanottava, että Ohjelmointiputka on hieno idea - toivon että en ole väärin käyttänyt sitä projektini aikana.

Etenkin lämmin kiitos!
- Metabolix

..ja kiitos vielä!
- qeijo
- tsuriga
- XYZ
- Olli
- Macro
- makumaku
- Lebe80
- jimi-kimi
- Grez
- AkeMake
- Sienikasvusto

qeijo [10.02.2012 19:44:03]

#

Kiitos sinulle. Tsemppiä tuleviin projekteihin.!


Sivun alkuun

Vastaus

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

Tietoa sivustosta