Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: WordPress: metodin $wpdb->get_var paluuarvo

Sivun loppuun

latenleffahylly [11.04.2013 15:37:27]

#

Hei kaikille, voitteko selittää mitä tässä on takana:

SELECT a Variable:
The get_var function returns a single variable from the database. Though only one variable is returned, the entire result of the query is cached for later use. Returns NULL if no result is found.

WP-dokumentaatio

Nyt kutsun funktiota:

$chk_worker_booking = $booking->chk_worker_booking($event_id, $worker->id);

Metodi luokan sisällä:

// Onko käyttäjä jo varannut työvuoron
public function chk_worker_booking( $event_id, $worker_id ) {
$worker_booking = $this->wpdb->get_var("SELECT COUNT(*) FROM " . $this->booking . " WHERE e_id = " . $event_id . " AND w_id = " . $worker_id . "");
return $worker_booking;
}

(Unohdetaan SQL-injektiot hetkeksi)

- Nyt jos 1 varausrivi löytyy tietokannasta: string(1) "1"
- Jos 0: string(1) "0"

Mielestäni WP-dokumentaatio sanoo että haku palauttaa arvon NULL. Itse olin siinä uskossa että palauttaa arvot NULL ja nolla. Mutta hyödyllinen VAR_DUMP väittää että kyseessä STRING. Eli onko nyt oikein tehdä tällaisia tarkistuksia??

if ($chk_worker_booking != 0) {
  echo "varaus löytyy jo...";
}

Eli mielestäni nyt tarkistan INTEGERIÄ en STRINGIÄ... Mutta entä NULL? Pitääkö mieluiten uskoa mitä var_dump sanoo ja sen avulla tehdä tarkistuksia. Nyt siis tarkistan onko käyttäjä valinnut tietystä tapahtumasta työvuoroa. Huom! Yllä oleva koodi toimii, mutta WP:n dokumentaatio on vaikea selkoista, Myös PHP.netin...

vesikuusi [11.04.2013 15:52:42]

#

latenleffahylly kirjoitti:

-- WP:n dokumentaatio on vaikea selkoista, Myös PHP.netin...

Molemmille on oikein hyvät dokumentaatiot.

Jos haluat varmistaa tarkistuksessa, että myös tietotyyppi on sama (tai eri), käytä !== ja === -operaattoreita.

Lebe80 [11.04.2013 15:54:00]

#

Muuta returniin muodoksi vaikka (int), jos sen pitää olla numero:

return (int)$worker_booking;

Metabolix [11.04.2013 16:16:29]

#

latenleffahylly kirjoitti:

Mielestäni WP-dokumentaatio sanoo että haku palauttaa arvon NULL.

Olet täysin väärässä. Koska käytät haussa COUNT-funktiota, haku löytää aina tuloksen: onhan sekin tulos, että rivien määrä on 0. Dokumentaatiossa mainittu NULL tarkoittaa tilannetta, jossa yrität hakea jonkin tietyn arvon (esim. SELECT nimi ... WHERE id = 1) mutta hakemaasi riviä ei löydy.

Näyttääpä siltä, että uusi tietokoneesi ei ole vieläkään tehnyt sinusta taitavampaa.

(P.S. Tee jokaiselle kysymykselle erillinen keskustelu, jolla on järkevä otsikko.)

latenleffahylly [11.04.2013 16:35:39]

#

Kiitos kaikille kolmelle. Eli tämä vielä...?

Metabolix kirjoitti:

onhan sekin tulos, että rivien määrä on 0

Eli onko tulos INT 0 vai STRING 0 ? Eli vertaanko tuossa iffissä molempia vahingossa. Sitten Lebe.. eli kun kone laskee COUNT(*) niin eikö sen automaattisesti pitäisi palauttaa luvun? Nyt kuitenkin tuo VAR_DUMP kertoo että luku STRING. Tuntuu että luvun tyyppi on vaihtunut kummallisesti php-sivuilta toiselle siirryttäessä.

Ajattelin jopa että saattaisi olla johonkin tietokanta-asetukseen liittyvä. Tai MySQL tietokantaan liittyvä asia. Huom lasken rivit jos ei löydy palauttaa nollan jos rivi löytyy palauttaa 1. Työntekijä ei voi tehdä tupla varausta, joten 0 tai 1.

Tavallaan haluaisin tietää että miksi tuo metodi palauttaa string(1) "1" Mikä on tuo suluissa oleva luku, entä miksi hipsut ovat ilmestyneet ykkösen ympärille. Tavallaan siitä on tehty merkkijono. Toisaalta onko niin että palvelin pää muuttaa kaiken tiedon aina string-merkkiseksi jotta se voi sitä käsitellä. Totta muuten että WP-dokumentaatio on hyvä, mutta tosiaan taas ymmärsin väärin. Jossain asioissa ei vain tapahdu kehitystä. Nyt mietin olenko tulkinnut muitakin dokumentaation asioita väärin, esim. kaikki SQL-lauseet error-virheitä täynnä, kiitän.

Metabolix [11.04.2013 17:01:06]

#

SQL-kyselyssä COUNT-funktion tulos sinänsä on luku, mutta käyttämäsi tietokantarajapinta palauttaa sen PHP:lle tekstinä. Tämä ei ole teknisesti mitenkään välttämätöntä tai edes kannattavaa, mutta käyttämäsi rajapinta kuitenkin toimii näin.

Kun vertailet tekstiä ja lukua, PHP muuttaa tekstin luvuksi vertailua varten automaattisesti (järkevästi, esim. "2" < 3, mutta myös typerästi, esim. "a" == 0). Tällaiset perusasiat pitäisi jokaisen PHP-ohjelmoijan tietää.

Funktio var_dump ilmoittaa suluissa tekstin pituuden ja näyttää tekstin lainausmerkeissä. (Mikset vain kokeillut eri parametreja tai lukenut dokumentaatiota?) Jos haluat nähdä, miltä muuttujan arvo näyttää PHP-koodina, käytä funktiota var_export.

latenleffahylly [11.04.2013 17:31:33]

#

No luen kyllä paljonkin teoriaa, mutta nähtävästi en tajua edes mallista. WP:n dokumentaatio kertoo mm. näin:

"The get_var function returns a single variable from the database."

- Luulin että sieltä tulee muuttuja? Mutta tuleeko sieltä muuttuja on toinen asia.. ja miten se tutkitaan?

"Though only one variable is returned, the entire result of the query is cached for later use."

- Eli jääkö palautettu muuttuja johonkin välimuistiin?

"Returns NULL if no result is found."

- Mitä tarkoitetaan tässä ettei tulosta löytynyt? Ok.. ok.. tajusin.. eihän tuossa puhuta mitään laskemisesta, mutta alla ollut esimerkki sai minut luulemaan että tässä on oikea tapa käyttää WP:n get_var funktiota.

$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
echo "<p>User count is {$user_count}</p>";

---

Loppuun vielä todella typerä kysymys. Jos koodini toimii development ympäristössä niin toimiiko se myös palvelin ympäristössä (LIVE Internet). Eli onko jotenkin mahdollista, että MySQL-tietokanta, webhotelli tai PHP-versio vaikuttaisi siihen mitä koodi palauttaa. Tuo esimerkkisi ei auennut?

Metabolix kirjoitti:

(järkevästi, esim. "2" < 3, mutta myös typerästi, esim. "a" == 0)

Metabolix [11.04.2013 17:59:43]

#

latenleffahylly kirjoitti:

"The get_var function returns a single variable from the database."

- Luulin että sieltä tulee muuttuja? Mutta tuleeko sieltä muuttuja on toinen asia.. ja miten se tutkitaan?

Lainaamasi ilmaus on harhaanjohtava, eihän tietokannasta haeta muuttujia (kuten $a) vaan arvoja (kuten "1"). Jatkopohdintaasi ja -kysymystäsi en ymmärrä, PHP:ssä funktio palauttaa aina arvon, olipa se sitten NULL, 0 tai "1".

latenleffahylly kirjoitti:

"Though only one variable is returned, the entire result of the query is cached for later use."

- Eli jääkö palautettu muuttuja johonkin välimuistiin?

Lainaamasi tekstin mukaan koko kyselyn tulos jää johonkin välimuistiin, kuten on ihan tavallista tiettyjä MySQL-rajapintoja käytettäessä. Tämä tarkoittaa, että jos teet kohta saman kyselyn uudestaan, palvelimen ei ehkä tarvitse käydä läpi koko tietokantataulua vaan vastaus tulee muistista.

Älä hätäile, sinun ei tarvitse huomioida asiaa mitenkään. Unohda koko juttu.

latenleffahylly kirjoitti:

"Returns NULL if no result is found."

- Mitä tarkoitetaan tässä ettei tulosta löytynyt?

Selitin tämän jo ihan esimerkin kera.

latenleffahylly kirjoitti:

– – alla ollut esimerkki sai minut luulemaan että tässä on oikea tapa käyttää WP:n get_var funktiota.

$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
echo "<p>User count is {$user_count}</p>";

Ei kai kukaan ole sanonutkaan, että se olisi väärä tapa. Sanoin, että tuossa kyselyssä jokin tulos "löytyy" aina.

latenleffahylly kirjoitti:

Jos koodini toimii development ympäristössä niin toimiiko se myös palvelin ympäristössä (LIVE Internet).

Toimii, jos ympäristöt ovat samanlaiset. Tässä nimenomaisessa asiassa käytännössä aivan varmasti toimii samalla tavalla.

latenleffahylly kirjoitti:

Tuo esimerkkisi ei auennut?

Metabolix kirjoitti:

(järkevästi, esim. "2" < 3, mutta myös typerästi, esim. "a" == 0)

Menehän sitten miettimään sitä ja tutkimaan, mitä noista ja muista vastaavista vertailuista tulee tulokseksi (eli miten PHP on muuttanut tekstin luvuksi) ja ovatko tulokset järkeviä vai typeriä.

Ehkä kannattaisi myydä se mäkkisi ja palkata rahoilla yksityisopettaja tai mennä jollekin kurssille...

latenleffahylly [11.04.2013 21:06:11]

#

PHP Peruskurssi kiinnostaisi. Mutta sen verran sanon että kehitän Tapahtumapalvelua lähinnä oppimisen ja harrastamisen kannalta. Teen itse mm. Seuraavia asioita:

- ulkoasu, värimaailma, käyttöliittymä...
- kuvakäsittely, valokuvaus...
- koodaus, tietoturva, käyttäjäryhmät, sisäänkirjautuminen...
- teema, lapsiteema, plugin...
- jne. Jne.

Haluan oppia WP:tä, ottaa asiakkaan huomioon ja ylläpitää ohjelmaani.

The Alchemist [11.04.2013 22:11:01]

#

Korjaa nyt nuo selkeät tietoturvareiät ja opettele käyttämään prepared queryja. Ei ole pienintäkään syytä sille, miksi koodaat noin surkealla tasolla koko ajan.

tmub [11.04.2013 22:29:58]

#

latenleffahylly kirjoitti:

PHP Peruskurssi kiinnostaisi. Mutta sen verran sanon että kehitän Tapahtumapalvelua lähinnä oppimisen ja harrastamisen kannalta. Teen itse mm. Seuraavia asioita:

- ulkoasu, värimaailma, käyttöliittymä...
- kuvakäsittely, valokuvaus...
- koodaus, tietoturva, käyttäjäryhmät, sisäänkirjautuminen...
- teema, lapsiteema, plugin...
- jne. Jne.

Haluan oppia WP:tä, ottaa asiakkaan huomioon ja ylläpitää ohjelmaani.

Mulla on sellanen käsitys, että mm. peruskurssit käydään vittu ennen kun aletaan tekemään asiakastöitä. Yleensä myös oppimisen tai harrastuksen takia tehtävistä koodeista ei saada mitään iPad-palkkoja, ja jos saadaankin niin ne pitää tehdä kunnolla ja ITSE.

Onhan se helvetin hienoa, että jaksat olla aktiivinen harrastuksessasi, mutta lopeta nyt helvetti tällästen topikkien tekeminen ja ota asioista ite selvää.

Äläkä nyt helvetti tule kirjoittamaan tänne siitä että "teet mm. seuraavia asioita ..
..
..

tietoturva"

qeijo [12.04.2013 08:13:54]

#

Aika ajoin ohjelmoinnissa kuuluisi tulla eräänlaisia pohjakosketuksia, tai ehkä parempi sana on havahduksia, ”ei saatana” - tilanteita. Tällaisissa tilanteissa tapahtuu kehitystä. Late, ilmeisesti sinun kohdallasi niitä ei ole vielä tullut. Sinun täytyy välillä mennä itseesi, ja siitä jatkaa mahdollisesti parempana kehittäjänä. Hyväksyä että sinä teet joitain asioita väärin, ja sinun pitää saada parempi teoriapohja. Heitä se WP nyt hetkeksi hemmettiin ja opiskele ensin perusteellisesti perusasiat, esim.

Lisäys:

latenleffahylly kirjoitti:

Teen itse mm. Seuraavia asioita:

- ulkoasu, värimaailma, käyttöliittymä...
- kuvakäsittely, valokuvaus...
- koodaus, tietoturva, käyttäjäryhmät, sisäänkirjautuminen...
- teema, lapsiteema, plugin...
- jne. Jne.

Jumalauta..

The Alchemist [12.04.2013 09:22:10]

#

Kun ihmisellä on vaikeuksia ymmärtää WordPressin ja php:n api-dokumentaatiota ja jopa sql-kyselyn preparointi, niin en usko, että on järkevää ajatella ohjelmistosuunnittelun teorian olevan tällaiselle ihmiselle perusasioita. Perusasioita olisi ymmärtää dokumentaatiosta ja esimerkiksi merkkijonojen käsittelystä, mistä myös MySQL-kantojen kanssa käytettävässä prepare()-kutsussa on kyse.

Sanoin itsekin joskus Latelle, että kun perusasioiden (alkeiden) opiskelu ei itsessään kiinnosta, niin voisi olla parempi lähteä tekemään esimerkiksi WP:llä kamaa ja yrittää kehittyä siinä ohessa myös todellisissa perusasioissa. Late on kuitenkin todistanut kyvyttömyytensä minkäänlaiseen kehittymiseen millään minun tuntemillani metodeilla. Tosin olen edelleen sitäkin mieltä, että kyse on vain häiriintyneestä trollista.

Lebe80 [12.04.2013 09:33:51]

#

The Alchemist kirjoitti:

Late on kuitenkin todistanut kyvyttömyytensä minkäänlaiseen kehittymiseen millään minun tuntemillani metodeilla.

Argumenttisi on invalidi, koska Retina.

latenleffahylly [13.04.2013 09:59:19]

#

Noniin kovaa puhetta taas. Otetaan esimerkki siitä miten saa aloittelijan sekaisin WP dokumentaation avulla:

Run Any Query on the Database

Seuraavaksi ohjataan eteenpäin...

Protect Queries Against SQL Injection Attacks

Koska tässä vaiheessa alan olla täynnä tätä lue ensin tämä sitten tämä ja sitten vielä tämä ja tämä....

Database Data Validation

Data Validation


-----

Eli eikö näitä asioita voida dokumentaatiossa saada saman sivun alle. Sitten tuo $global wpdb; Siinäkin on taas sata eri tapa suorittaa noita SQL-lauseita. Jossain kerrotaan että PREPARE toimii, jossain taas että käyttäjä luulee että PREPARE toimii. JOKATAPAUKSESSA!! Aion nyt käyttää seuraavat 2-3 tuntia lukeakseni nuo asiat, siis kaikki nuo sivut. Aion sen jälkeen kirjoittaa ranskalaisin lausein mitä tajusin, kiitän.

Lisäys:

SQL-lauseiden täydellinen uudelleen tarkistus käynnissä... jo tässä vaiheessa suur kiitos Metabolix. VAR_DUMP() ja VAR_EXPORT() esimerkkisi/ ohjeistuksesi ovat juuri se miten pääsen tietoiseksi siitä mitä tapahtuu. Alla esimerkki oikea oppisesta SQL-lauseesta (WP).

Huom! Metodi 'booking' luokan sisällä:

// Poista varaus
$booking_chk = $booking->wpdb->query($booking->wpdb->prepare("DELETE FROM $booking->booking WHERE e_id = %d AND w_id = %d", $value->id, $worker_id));

var_dump($booking_chk); // int(1)
var_export($booking_chk); // 1
print_r($booking_chk); // 1
return;

Eli nyt sitten tarkistan niin että jos palauttaa numeron 1. Niin yksi rivi on ollut muutoksessa tietokannassa. Kerron käyttäjälle varaus poistettu. Nyt kysymys kuuluukin, miksi esimerkeissä on die() ja kuitenkin wp_die() mahdollinen. Entä milloin return? Eli yritän kysyä miten tuollainen uudelleen ohjaus on järkevin tehdä. Voisin tehdä näin kuin alla mutta se kuulemma väärä tapa.

if ($booking_chk > 0) {
    wp_die("Varaus poistettu!");
} else {
    return; // tai die() tai wp_die() jne.
}

Metabolix [13.04.2013 11:40:44]

#

En ymmärrä, mikä mielestäsi WP:n dokumentaatiossa on vikana. Ensimmäisellä linkittämilläsi sivulla ei näytä olevan yhtäkään väärin tehtyä kyselyä, vaan kaikissa käytetään prepare-metodia, jos kyselyyn laitetaan muuttujia parametreiksi. Yhtään enempää sivuja ei tarvitse lukea, vaan tuolla sivulla on jo hyvät esimerkit kaikista tarvittavista kyselytyypeistä. On oma syysi ja täysin käsittämätöntä törttöilyä, jos jotain ymmärrät tuolta sivulta väärin.

(Poikkeus muuttujiin on taulun nimi, joka myös on WP:ssä tungettu muuttujaan, mutta sen kohdalla ei ole vaaraa, koska muuttujan arvo on valmiiksi asetettu ja käyttäjä ei voi muuttaa sitä.)

Hauskasti tuolla tosiaan kerrotaan, että uudessa WP:ssä prepare-metodi vaatii vähintään kaksi parametria – juurikin sellaisten idioottien takia, jotka ovat aiemmin kuvitelleet (virheellisesti ja vastoin dokumentaation ohjeita), että prepare jotenkin maagisesti muuttaisi väärin tehdyn kyselyn turvalliseksi. Väärinkäsitys on seuraus täysin olemattomista ohjelmointitaidoista: kai nyt järkikin sanoo, että mikään funktio ei voi tunnistaa tekstistä "a = 1 OR b = 2", onko kysely tarkoituksella kirjoitettu näin vai onko tarkoitus ollut "a = $id", johon käyttäjä onkin syöttänyt id:ksi "1 OR b = 2".

latenleffahylly kirjoitti:

Entä milloin return? Eli yritän kysyä miten tuollainen uudelleen ohjaus on järkevin tehdä.

Tiedätkö, mitä return-lause tekee? Liittyykö se mielestäsi jotenkin sivun tulostamiseen tai käyttäjän ohjaamiseen?

latenleffahylly [13.04.2013 13:05:22]

#

Return liittyy siinä mielessä käyttäjän ohjaamiseen että voin ohjata käyttäjän toiselle sivulle tai pitää samalla sivulla, jolloin tulostan sivun ylä- tai alaosaan tekstin: "varaus poistettu".

Uudelleen ohjaus kiinnostaisi, mutta välillä tulee ilmoitus "HEADERS already sent tai vastaava"... WP:ssä myös oma tapa uudelleen ohjaukseen.

wp_redirect(home_url('/tapahtumat/tapahtumainfo/varaa-chk/?page_id=10')); exit;

Lisäys: Jokatapauksessa käyn nyt kaikki SQL-kohdat läpi ja tutkin mitä palauttaa, mitä tekee kannassa ja että tekemäni tapa löytyy dokkarista. Tämä on yllättävän opettavaa. Esim. ei minulle ole ennen neuvottu erittäin hyödyllistä VAR_EXPORT() käyttöä. Tuo on juuri se jota tarvitsen.

Lisäys: Ainiin.. muistaakseni RETURN lopettaa koodin toistamisen heti siinä kohdassa missä se lukee. Tavallaan koodin tulkitseminen keskeytyy. Sama kuin vetäisi imurin johdon irti seinästä, humina loppuu..

Teuro [13.04.2013 13:13:27]

#

latenleffahylly kirjoitti:

Return liittyy siinä mielessä käyttäjän ohjaamiseen että voin ohjata käyttäjän toiselle sivulle tai pitää samalla sivulla, jolloin tulostan sivun ylä- tai alaosaan tekstin: "varaus poistettu".

Return ei liity tuohon juuri mitenkään. Sen avulla ainoastaan lopetetaan funktion toiminta.

latenleffahylly kirjoitti:

Uudelleen ohjaus kiinnostaisi, mutta välillä tulee ilmoitus "HEADERS already sent tai vastaava"... WP:ssä myös oma tapa uudelleen ohjaukseen.

Tämä on aivan alkeellinen ongelma, jossa tulostat sivulle materiaalia, ennen kuin kaikki otsikot on lähetetty.

latenleffahylly kirjoitti:

Lisäys: Ainiin.. muistaakseni RETURN lopettaa koodin toistamisen heti siinä kohdassa missä se lukee. Tavallaan koodin tulkitseminen keskeytyy. Sama kuin vetäisi imurin johdon irti seinästä, humina loppuu..

Väärin ainoastaan funktion suoritus loppuu siihen. Koodin suoritus sen sijaan jatkuu aivan normaalisti funktion kutsukohdasta.

latenleffahylly [13.04.2013 13:19:48]

#

Teuro kirjoitti:

ennen kuin kaikki otsikot on lähetetty.

Mitä tuo tarkoittaa suomeksi. Otsikot? Liittyykö header() tähän mitenkään..

<?php get_header(); ?>

Teuro [13.04.2013 13:23:14]

#

get_header on wordpressin oma funktio, jolla haetaan sivupohjan yläosat. Esimerkiksi php:n header() funktio lähettää otikon, joten jos sitä ennen on tulostusta, niin tulee tuo varoitus. Tässä vaiheessa näiden asioiden tulisi olla kyllä aika lailla selviä.

Metabolix [13.04.2013 13:27:31]

#

Kyllä se sikäli liittyy, että ilmeisesti hämäävästä nimestään huolimatta WP:n get_header ei hae mitään vaan nimenomaan tulostaa tiettyjä osia sivusta, jolloin sen jälkeen ei voi käyttää enää PHP:n header-funktiota.

Miten voit Late olla noin hukassa, asiakastöitä tekevä ”developer”? Itse en ole ikinä käyttänyt WP:tä ja silti sain tämänkin asian selville netistä noin 10 sekunnissa. Lisäksi "headers already sent" on ehkä yleisin yksittäinen PHP-ongelma tälläkin foorumilla, joten suomenkielisiä selityksiä syystä ja korjauksesta ihan varmasti löytyy.

Eräs nettisivuohjelmoinnin perusperiaate on, että ensin pitää tehdä kaikki toiminnot ja vasta sitten aloittaa sivun tulostaminen. Toisin sanoen ensimmäisen get_header- tai echo-rivin tai ?>-merkinnän jälkeen ei pitäisi tehdä enää yhtään SQL-kyselyä (yksien näkemys) tai enintään SELECT-kyselyitä (toisten näkemys). Tätä periaatetta noudattamalla koko otsikko-ongelma on helppo välttää.

Lebe80 [13.04.2013 14:32:06]

#

Ehkä Laten olisi pitänyt käyttää laitteensa ihastelemiseen kulutettu aika ohjelmoinnin opetteluun. Amazing! Must buy!

latenleffahylly [13.04.2013 16:32:41]

#

Metabolix tiedät paljon asioita, mutta et osaa selittää niitä. Ensin pitää tehdä toiminnot ja sitten tulostaa... Just.. WP:ssä.. Käytän esim. Init-koukkua.. Eli wp on tehnyt toimintonsa on siis minun vuoroni. Ja muutenkin alan ihmettelemään että joka viestissä, muutatte asiat etten tajua / osaa mitään.

Miten itse rakentaisitte web-sivut + työvuoron varausohjelman? Sellainen johon asiakas voi kirjoittaa uutisia ja lisätä tapahtumia. Teen paljon erilaisia operaatioita, mutta en aina tiedä milloin kannattaa synnyttää uusi olio ja käyttää luokan ominaisuuksia.

Nyt olen esim. Jakanut oliot näin:

-wpdb
--main
---event
---worker
---booking

Sitten plugin olio hakee nämä oliot käyttöön, koukkua käyttämällä. Metodeista olen pyrkinyt tekemään mahd. Yksinkertaisia ja pieniä.

Lebe80 [13.04.2013 19:07:27]

#

latenleffahylly kirjoitti:

Metabolix tiedät paljon asioita, mutta et osaa selittää niitä.

Veikkaisin että vika on kyllä kuuntelijassa...

latenleffahylly [15.04.2013 15:25:07]

#

Hei, onko tämä nyt oikea tapa käyttää get_row -funktiota? Dokumentaation avulla päädyin tähän.

$id = 5;
$tulosta = $olio->wpdb->get_row($olio->wpdb->prepare("SELECT * FROM $olio->event WHERE id = %d" , $id));
print_r($tulosta);

/*
stdClass Object ( [event_id] => 5 [name] => Taidenäyttely Veistos avajaiset [date] => 2013-05-17 [start] => 12:00 [stop] => 15:30 [location] => Töölö [status] => 2 [info] => Lisätietoa tulossa myöhemmin... [map] => - [i_id] => 1 [boss] => 12 )
*/

Teuro [15.04.2013 15:37:37]

#

Itse kysely näyttää ihan hyvälle, mutta miksi oliolla on jäsenenä wpdb? Eihän nyt jokaisella oliolla voi olla omaa tietokantayhteyttä eihän? Tuosta '*' merkin käytöstä voi olla montaa mieltä. Itse pidän enemmän tyylistä, jossa luetellaan yksitellen kaikki haettavat kentät. Jotkut tosin pitävät tuosta enemmän. Päivämäärät voisi olla hyvä pitää yhdessä DATETIME muodossa, mutta noinkin se varmaan toimii ihan hyvin. Ongelmia saattaa tulla jos tapahtuma kestää yli päivän.

Lebe80 [15.04.2013 15:47:45]

#

Ehdottomasti start ja stop DATETIME:ksi ja koko date-kenttä pois sotkemasta. Jos tapahtumat ovat vain yhdellä päivällä, niin rajaa sen sitten käyttöliittymäsuunnittelulla pois, mutta tietokantaan ehdottomasti "päivämäärä+kello" -muodossa.

latenleffahylly [15.04.2013 20:00:36]

#

Huoh.. eli siis nyt tapahtumassa päivämäärä (date). Start ja Stop ovat muotoa CHAR esim. 10:00 tai 12:30.

Idea oli se että kun Datepickeristä valitaan päivämäärä niin sitten siinä on hieno graafinen näkymä. Aikaa on jotenkin vaikea saada siihen samaan.. Tulipas taas paljon huolia. Eli "...mutta miksi oliolla on jäsenenä wpdb?" eli itse tehdyssä tietokanta-luokassani on tuollainen prefix-juttu. Eli Wordpressissä määritellään tauluille etuliite. Tämän voi itse vaihtaa tieturvan parantamiseksi.

/**
 * WPDB
 *
 * Hierargia:       Yliluokka
 * Perintä:         -
 * Konstruktori:    3 kpl
 * Metodit:         -
 *
 * Muodosta tietokantayhteys
 * Virheilmoitukset
 * Määrittele tietokanta taulujen etuliitteet
 */

// WPDB
class WPDB {
    // Konstruktori
    public function __construct() {
        // WP:n WPDB-Olio
        global $wpdb;
        // Muodosta tietokantayhteys
        $this->wpdb = $wpdb;
        // Virheilmoitukset
        $this->errors = $this->wpdb->show_errors();
        // Määrittele tietokanta taulujen etuliitteet
        $this->booking = $wpdb->prefix . 'booking';
        $this->event = $wpdb->prefix . 'event';
        $this->worker = $wpdb->prefix . 'worker';
    }
}

Tuosta tähti (*) jutusta olen kuullut tasan 2 versiota, puolesta ja vastaan. Eli kaikki luokka-oliot perivät kahden yliluokan ominaisuudet. Yksi tälläinen asia on tuo tietokanta yhteys, jota kutsutaan tuossa yllä olevalla tavalla. Tämä on mielestäni oikea tapa. Ainakin olen jostain tällaisen käsityksen saanut. Hmm.. kiitos jos löydätte korjattavaa. Olen hieman hukassa mm. tuon DATETIME asian kanssa sekä sen miten tuollainen luokkarakenne koodataan.

Teuro [15.04.2013 20:13:53]

#

latenleffahylly kirjoitti:

Huoh.. eli siis nyt tapahtumassa päivämäärä (date). Start ja Stop ovat muotoa CHAR esim. 10:00 tai 12:30.

Ei siis et halua järjestellä tapahtumia päivämäärän ja ajan mukaan? Tämä tuntuu hiukan typerältä, mutta itsepä olet tiesi valinnut.

latenleffahylly kirjoitti:

Idea oli se että kun Datepickeristä valitaan päivämäärä niin sitten siinä on hieno graafinen näkymä. Aikaa on jotenkin vaikea saada siihen samaan.. Tulipas taas paljon huolia. Eli "...mutta miksi oliolla on jäsenenä wpdb?" eli itse tehdyssä tietokanta-luokassani on tuollainen prefix-juttu. Eli Wordpressissä määritellään tauluille etuliite. Tämän voi itse vaihtaa tieturvan parantamiseksi.

Käytät melko huonoa datepickeriä, jos siinä ei ole kellonaikaa ympätty samaan näkymään. Tosin käyttöliittymän surkeus ei saisi reflectoida taustajärjestelmään. Tässä yhteydessä niitä(kään) tuskin on tehty kovin hyvin.

latenleffahylly kirjoitti:

huonoa php-koodia

Tuo koodi on kaiketi lähinnä vitsiksi tarkoitettu niinhän? Ei ainakaan kannata luoda uutta wpdb luokkaa, kun wp kerran sellaisen tarjoaa oletuksena.

latenleffahylly kirjoitti:

Tuosta tähti (*) jutusta olen kuullut tasan 2 versiota, puolesta ja vastaan. Eli kaikki luokka-oliot perivät kahden yliluokan ominaisuudet. Yksi tälläinen asia on tuo tietokanta yhteys, jota kutsutaan tuossa yllä olevalla tavalla. Tämä on mielestäni oikea tapa. Ainakin olen jostain tällaisen käsityksen saanut. Hmm.. kiitos jos löydätte korjattavaa. Olen hieman hukassa mm. tuon DATETIME asian kanssa sekä sen miten tuollainen luokkarakenne koodataan.

Prefix ei paranna tietoturvaa pätkän vertaa, joten olet sen(kin) asian varmaankin ymmärtänyt väärin

The Alchemist [15.04.2013 20:16:30]

#

Kellonajan saa päivämäärän perään katenoimalla kaksi merkkijonoa. Tässähän ei ole siis mitään vaikeuksia. Voit vaikka edelleen pilkkoa olioon päivämäärän ja kellonajan erillisiin jäsenmuuttujiin kannasta lukemisen yhteydessä.

$datetime = sprintf('%s %s', $date, $time);

Vaan älä Late kuvittele, että taulujen etuliitteen vaihtamisella olisi jotain tekemistä tietoturvan kanssa. Se on tarkoitettu useamman WordPress-asennuksen tekemiseksi samaan tietokantaan. Monissa web-hotelleissa varsinkin ennen muinoin oli saatavilla vain yksi tietokanta, johon piti kaikki palvelimella ajettavat webbipalvelut saada sopimaan.

Mutta mitähän ihmettä sinä yrität taas tehdä? Sulla on WPDB-niminen luokka, jolle laitat jäsenmuuttujaksi viitteen johonkin WPDB-olioon? Sano nyt vielä, että yrität laittaa viitteen samaiseen olioon, jota konstruktorissa ollaan juuri luomassa?

Teuro kirjoitti:

latenleffahylly kirjoitti:

Idea oli se että kun Datepickeristä valitaan päivämäärä niin sitten siinä on hieno graafinen näkymä. Aikaa on jotenkin vaikea saada siihen samaan.. Tulipas taas paljon huolia. Eli "...mutta miksi oliolla on jäsenenä wpdb?" eli itse tehdyssä tietokanta-luokassani on tuollainen prefix-juttu. Eli Wordpressissä määritellään tauluille etuliite. Tämän voi itse vaihtaa tieturvan parantamiseksi.

Käytät melko huonoa datepickeriä, jos siinä ei ole kellonaikaa ympätty samaan näkymään. Tosin käyttöliittymän surkeus ei saisi reflectoida taustajärjestelmään. Tässä yhteydessä niitä(kään) tuskin on tehty kovin hyvin.

Kellonajalla ei välttämättä tee mitään, kun tietotyyppi on date. Jos käyttäjän pitää valita vain päivämäärä, niin kellonajan valinnan näyttäminen ohessa on tällöin väärin.

latenleffahylly [15.04.2013 20:19:45]

#

Nyt täytyy Teuro olla kanssasi eri mieltä lähes joka asiasta. Eli haen tapahtumia mm. date kentän mukaan. Tuo WPDB ei ole omassa koodissa ihan tuon niminen. Prefix idea on se että kun Wordpress asennetaan taulujen etuliite on wp_ prefixin avulla voi luoda omia etuliitteitä.

Wordpressissä on tullut uutena ominaisuutena date ja time -picker jutut. Niitä yritin opetella ja sainkin datepickerin hyvin toimimaan. Toki ärsyttää etten osaa koodata 1 kenttää kolmen sijaan (datetime). Nuo päivämäärät muutenkin yhtä myrkkyä.

Teuro [15.04.2013 20:21:56]

#

The Alchemist kirjoitti:

Kellonajalla ei välttämättä tee mitään, kun tietotyyppi on date. Jos käyttäjän pitää valita vain päivämäärä, niin kellonajan valinnan näyttäminen ohessa on tällöin väärin.

Mutta tässä tapauksessa kellonaikaa selkeästi kysytään, joten käyttäliittymän olisi sitä hyvä tukea. Samoin taustajärjestelmän olisi tällaista tukea sopivalla tietotyypillä.

latenleffahylly [15.04.2013 20:29:12]

#

Ei taida olla suomalaista kirjaa jossa olio-ohjelmointi + wordpress, olisin valmis maksamaan omaisuuden.

qeijo [15.04.2013 20:37:04]

#

latenleffahylly kirjoitti:

Ei taida olla suomalaista kirjaa jossa olio-ohjelmointi + wordpress, olisin valmis maksamaan omaisuuden.

Voi jumalauta.. Täytyy kyllä vakavasti harkita jospa sitä lopettaisi koko sivustolla käymisen.

The Alchemist [15.04.2013 20:37:34]

#

Teuro kirjoitti:

The Alchemist kirjoitti:

Kellonajalla ei välttämättä tee mitään, kun tietotyyppi on date. Jos käyttäjän pitää valita vain päivämäärä, niin kellonajan valinnan näyttäminen ohessa on tällöin väärin.

Mutta tässä tapauksessa kellonaikaa selkeästi kysytään, joten käyttäliittymän olisi sitä hyvä tukea. Samoin taustajärjestelmän olisi tällaista tukea sopivalla tietotyypillä.

Toki tällöin. En kylläkään ole itse nähnyt mitään hyvää widgettiä, johon olisi integroitu sekä päivämäärä että kellonaika. JQuery Datepickerin laajennus "Datetimepicker" yrittää olla sellainen, mutta tulos on mielestäni sekava ja toimii huonosti.

Säilyttäisin luultavasti itse kaksi erillistä valitsinwidgettiä, vaikka ne sitten syöttäisivätkin ajat samaan inputtiin.

latenleffahylly [15.04.2013 20:44:23]

#

Mikäköhän geijon ongelma on tällä kertaa. Olen usein toivonut että olisi kirja jossa suomeksi olio-ohjelmoinnista. WP:ssä olen löytänyt maksullisia video-tutoriaaleja joissa olioiden avulla rakennetaan plugineja. (tutt+ premium)

lebe voisi perustella tuon datetime, jutun eli miten se sitten toteutetaan yhdessä graafisessa käyttöliittymässä. Vai riittääkö että vain tietokannassa on kenttä datetime.

tarkoitan että tuossa ratkaisussa tarvittaisiin 2 datetime kenttää (alkaa, loppuu)

Teuro [15.04.2013 21:00:50]

#

latenleffahylly kirjoitti:

Mikäköhän geijon ongelma on tällä kertaa. Olen usein toivonut että olisi kirja jossa suomeksi olio-ohjelmoinnista. WP:ssä olen löytänyt maksullisia video-tutoriaaleja joissa olioiden avulla rakennetaan plugineja. (tutt+ premium)

Katso peiliin se olet sinä.

latenleffahylly kirjoitti:

lebe voisi perustella tuon datetime, jutun eli miten se sitten toteutetaan yhdessä graafisessa käyttöliittymässä. Vai riittääkö että vain tietokannassa on kenttä datetime.

tarkoitan että tuossa ratkaisussa tarvittaisiin 2 datetime kenttää (alkaa, loppuu)

No eikös tämä nyt ole ihan selkeä ja järkevä tapa laittaa kaksi kenttää, jos tarvitset kaksi aikaa? Sullahan menee nyt kolme kenttää tuolla omalla systeemilläsi.

latenleffahylly [15.04.2013 22:13:55]

#

Hmm.. Date ja time -picker pitäisi saada samaan graafiseen käyttöliittymään. Sieltä tallentuisi 2 datetime -arvoa. Mutta sitten kaikki tulostaminen ja päivämäärien muuntaminen olisi hankalampaa. Olette jokatapauksessa täysin oikeassa.

Logiikkani pettää jälleen. Syytän taitojani.

Lebe80 [15.04.2013 22:53:14]

#

latenleffahylly kirjoitti:

Hmm.. Date ja time -picker pitäisi saada samaan graafiseen käyttöliittymään. Sieltä tallentuisi 2 datetime -arvoa. Mutta sitten kaikki tulostaminen ja päivämäärien muuntaminen olisi hankalampaa. Olette jokatapauksessa täysin oikeassa.

Logiikkani pettää jälleen. Syytän taitojani.

Ei niitä tarvitse samaan laittaa, vaan sä yhdistät ne arvot yhdeksi "tallennusvaiheessa".


KISS

latenleffahylly [16.04.2013 11:46:06]

#

Ehkä tässä on se juttu että kun on esimerkiksi tapahtuma: "Digi-Messut" Nyt tapahtuma voi olla 3 päivää pitkä ja päivät 09:00-21:00. Näin ollen yksi työntekijä voisi varata työvuoron (päivä, aika) Vuorot olisivat jotenkin näin:

pe 09:00-17:00
pe 17:00-21:00
la 09:00-17:00
la 17:00-21:00
su 09:00-17:00
su 17:00-21:00

Näin ollen puhutaan lähinnä työvuoroista tapahtuman sisällä. Messut ovat 1 kolme päiväinen tapahtuma. Ei saa teettää työtä 09:00-21:00, 1 työntekijä väsyy, tarvitaan 2. Mutta loogisesti olet oikeassa koska olisi hyvä tallentaa tuollaiset asiat kahdelle sarakkeelle (datetime). Toisaalta kuten sanoin, minulle tuottaa sitten suurta vaikeutta saada sitä aikaa kahdesta kentästä järkevään muotoon.

Nyt olen huomannut että ajassa on joko 2 tai 3 tunnin viive. Eli varausaika voi näyttää 10:00 vaikka kello jo 13:00. Yleensä vielä on niin että päivämäärä on tiedossa ja aika tarkentuu vasta lähellä tapahtumaa. No eihän se tietenkään mitään muuta. Olen tavallaan ajatellut että jos uskaltaisi kehittää tulevaisuudessa version 3 niin nostaisi tasoa vielä entisestään. Sitten ehkä tekisin niin että tarkistuttaisin tekemäni ratkaisut täällä. Esimerkiksi tuon luokan rakentaminen, periyttäminen jne. tuntuu hankalalta. Esimerkiksi nuo luokan sisäiset muuttujat eivät nyt ole private, protected, public tai mitään.. huoh..

No joo. Yritän tässä samalla Tapahtumapalvelua rakentaessa keksiä harrastusta. Petyin elokuviin pahasti, joten luovuin kaikista. Nyt sen vuoksi joudun muuttamaan myös domain nimen (latenleffahylly). Elokuvat ovat menneet rajusti huonompaan suuntaan, kuten pelit ja musiikki. Eli tälle inhottavalle valtavirralle riittää ihan hyvä. Esimerkiksi Iron Man (2008) oli hyvä ja viihdyttävä elokuva. Nyt sitten osat 2 ja 3 tulevat ulos. Ja ihmiset hyväksyvät ne, vaikka ne pitäisi tuomita. Ei tuollaista roskaa saisi päästää ulos.

No tämä on yksi syy että elokuvat jäivät, pelit valitettavasti myös. Wii ei ole onnistunut tuomaan selkeästi mitään uutta. Tavallaan harrastan Wordpressiä, mutta kun on paljon koneella niin tekisi mieli tehdä jotain vastapainoksi. Joku keräily juttu...

No joo tämä topiicci lienee tässä. Pitää aloittaa jokin kesto-topiicci.

Lebe80 [16.04.2013 11:51:15]

#

latenleffahylly kirjoitti:

Ehkä tässä on se juttu että kun on esimerkiksi tapahtuma: "Digi-Messut" Nyt tapahtuma voi olla 3 päivää pitkä ja päivät 09:00-21:00. Näin ollen yksi työntekijä voisi varata työvuoron (päivä, aika) Vuorot olisivat jotenkin näin:

pe 09:00-17:00
pe 17:00-21:00
la 09:00-17:00
la 17:00-21:00
su 09:00-17:00
su 17:00-21:00

Näin ollen puhutaan lähinnä työvuoroista tapahtuman sisällä. Messut ovat 1 kolme päiväinen tapahtuma. Ei saa teettää työtä 09:00-21:00, 1 työntekijä väsyy, tarvitaan 2. Mutta loogisesti olet oikeassa koska olisi hyvä tallentaa tuollaiset asiat kahdelle sarakkeelle (datetime). Toisaalta kuten sanoin, minulle tuottaa sitten suurta vaikeutta saada sitä aikaa kahdesta kentästä järkevään muotoon.

Nyt olen huomannut että ajassa on joko 2 tai 3 tunnin viive. Eli varausaika voi näyttää 10:00 vaikka kello jo 13:00. Yleensä vielä on niin että päivämäärä on tiedossa ja aika tarkentuu vasta lähellä tapahtumaa. No eihän se tietenkään mitään muuta. Olen tavallaan ajatellut että jos uskaltaisi kehittää tulevaisuudessa version 3 niin nostaisi tasoa vielä entisestään. Sitten ehkä tekisin niin että tarkistuttaisin tekemäni ratkaisut täällä. Esimerkiksi tuon luokan rakentaminen, periyttäminen jne. tuntuu hankalalta. Esimerkiksi nuo luokan sisäiset muuttujat eivät nyt ole private, protected, public tai mitään.. huoh..

No joo. Yritän tässä samalla Tapahtumapalvelua rakentaessa keksiä harrastusta. Petyin elokuviin pahasti, joten luovuin kaikista. Nyt sen vuoksi joudun muuttamaan myös domain nimen (latenleffahylly). Elokuvat ovat menneet rajusti huonompaan suuntaan, kuten pelit ja musiikki. Eli tälle inhottavalle valtavirralle riittää ihan hyvä. Esimerkiksi Iron Man (2008) oli hyvä ja viihdyttävä elokuva. Nyt sitten osat 2 ja 3 tulevat ulos. Ja ihmiset hyväksyvät ne, vaikka ne pitäisi tuomita. Ei tuollaista roskaa saisi päästää ulos.

No tämä on yksi syy että elokuvat jäivät, pelit valitettavasti myös. Wii ei ole onnistunut tuomaan selkeästi mitään uutta. Tavallaan harrastan Wordpressiä, mutta kun on paljon koneella niin tekisi mieli tehdä jotain vastapainoksi. Joku keräily juttu...

No joo tämä topiicci lienee tässä. Pitää aloittaa jokin kesto-topiicci.

Yritä selkeyttää ne ajatukset ja tajuta, ettei se näytettävän datan tarvitse olla siellä kannassa samassa muodossa. Käytä dataa sellaisessa muodossa siellä tietokannassa millaisena se tietokanta pystyy sen järkevimmin tallentaa. Eli sä voit tehdä sen päivämäärän ihan omalla ui-kalenterikomponentilla (joita on valmiina pilvinpimein) ja kellon ajan vaikka kahtena alasvetovalikkona, joista toinen valinta on vuorokauden tunnit ja toinen minuutit. Tai vastaavasti vaikka kirjoitettavana kenttänä. Pääasia, ettei sillä ole mitään hiton väliä kuinka monta tuntia pitää viivettä olla, tai kuinka monta työntekijää sulla on, tai onko se Ironman susta hyvä vai ei!

Selkeytä ajatukset ja KISS!

edit:
Eli kun olet tallentanut tiedon järkevään muotoon, niin voit ihan vapaasti muuttaa käyttöliittymää myöhemmin ihan vapaasti.

Itse olen huomannut tällaisen ihan hyväksi päivämäärän ja ajan valintaan:
https://dl.dropboxusercontent.com/u/62178918/bg/kalenteri-ja-kello.png


Sivun alkuun

Vastaus

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

Tietoa sivustosta