Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Työvuoron varausohjelma

Sivun loppuun

latenleffahylly [11.09.2012 18:58:37]

#

Hei kaikille!

Teen parhaillaan Työvuoron varausohjelman versiota numero 2. Versio 1.0 oli siinä mielessä menestys, että sain sillä rahat uuteen iPadiin. Niin ja kokemusta sekä näkemystä.

--------------------------------------------------------------------------
Jos putkan ylläpidolle ok niin perustan tähän tämän topicin, koska sitten voin suunnata ongelmani yhden ketjun alle, kiitos.
--------------------------------------------------------------------------

Noniin.. eli aikaisempi taulujen järjestys oli hieman yksinkertaisempi nyt tauluja on useita:

- tapahtuma
- tyontekija
- varaus
- tarve
- status

Eli tarkoitus on hakea kaikki tapahtumat etusivulle. Tapahtumaan voi sitten varata työvuoron. Alla olevassa vanhassa tavassa "tapahtuma" taulussa oli sarake 'tarve' jossa luku.

// haetaan kaikki tapahtumat joiden status on 'Tapahtumat' päivämäärän mukaan
// lasketaan varattaujen työvuorojen määrä per tapahtuma
$query = "SELECT tapahtuma.*,
          COUNT(varaus.Tapahtuma_Id) AS maara
          FROM tapahtuma
          LEFT JOIN varaus On Tapahtuma_Id = T_Id
          WHERE tStatus = 'Tapahtumat'
          GROUP BY T_Id
          ORDER BY tPvm";

Erona aikaisempaan on se että nyt tarveluku (työvuorojen määrä/ tapahtuma) on piilotettu tauluun nimeltä "tarve". Eli minun pitäisi osata yhdistää yllä olevassa SQL-lausekkeessa mukaan taulu "tarve". En oikein tajua.

tapahtuma
-T_Id (PK)

tarve
T_Id (FK)
tTarve

- jos joku jaksaisi hieman auttaa että pääsisi edes alkuun. Eli haluan selvittää "tarve" taulussa kuinka monta kyseisen tapahtuman id-numeroa (T_Id) siellä on ja laskea ne yhteen, hmm.. tai pikemminkin laskea tarve luvut yhteen:


id
1

T_Id
1

S_Id
1

tTarve
2


Tässä tapauksessa T_Id viittaisi tapahtumaan 1. S_Id sen sijaan status tauluun jossa kerrotaan mitä numerot tarkoittavat. tTarve sen sijaan on luku kuinka monta tietyn tyyppistä työntekijää tarvitaan tapahtumaan.

----------------------------------------------
esim. 1 = poliisi, 2 = palomies, 3 = ensiapu
----------------------------------------------

Toivon että esimerkkini ei vaikeuttanut kysymystä. Kiitos niille jotka jaksavat auttaa projektin kanssa. Tarkoitus on tehdä mahd. paljon itse mutta nyt noin 1 kk työn jälkeen ajattelin perustaa tämän topiicin ja kysyä neuvoa.

Grez [11.09.2012 19:25:09]

#

Suosittelisin lämpimästi nimeämään status-taulun järkevämmin. Sana "Status" kuvaa äärimmäisen huonosti "tarpeen lajia".

Tämä kuitenkin hakisi tapahtuman 1 tarpeen määrät

SELECT
  S.Nimi,
  SUM(T.tTarve) Kpl
FROM
  tarve T JOIN
  status S ON T.S_Id=S.Id
WHERE
  T.T_Id=1
GROUP BY
  S.Id, S.Nimi

latenleffahylly [11.09.2012 19:46:28]

#

Okei, tutkin tuon. Eli status voisi olla esim. ryhmä. Työntekijä kuuluu johonkin ryhmään.

Lisäys:

Tuota, tuota.. tiesin että tämä on vaikea. En ihan tajua tuota FROM kohtaa. Eli tarve ja mikä tuo T on se jälkeen? Sama sitten alemmalla rivillä JOIN status ja mikä tuo S on sen jälkeen.

nyt taulut näin:

--tapahtuma--
T_Id (PK)

--tarve--
T_Id (FK)
R_Id (FK)
tTarve

--ryhma--
R_Id (PK)
rNimi

SELECT
 ryhma.rNimi,
 SUM(tarve.tTarve) Kpl
FROM
 tarve T JOIN
 ryhma S ON tarve.R_Id=ryhma.R_Id
WHERE
 tapahtuma.T_Id=1
GROUP BY
 ryhma.R_Id, ryhma.rNimi

Grez [11.09.2012 20:19:00]

#

T ja S on aliakset tauluille. Eli toki sen voi kirjoittaa yhtä hyvin

SELECT
  status.Nimi,
  SUM(tarve.tTarve) Kpl
FROM
  tarve JOIN
  status ON tarve.S_Id=status.Id
WHERE
  tarve.T_Id=1
GROUP BY
  status.Id, status.Nimi

Aliaksien käyttäminen on joinissa välttämätöntä ainoastaan jos samaa taulua käytetään useammin kuin kerran.

latenleffahylly [11.09.2012 20:42:43]

#

Grez, mitä pidät tästä ideasta:


SELECT SUM(tarve.tTarve) maara
FROM tarve
JOIN ryhma ON tarve.R_Id = ryhma.R_Id
GROUP BY T_Id


Ainakin phpmyadmin -hakutuloksessa osaa jaotella määrät oikein

3
2
4
7
jne.

- Seuraava jännitysnäytelmä onkin miten saan järkevimmin näkymään etusivulla tapahtumien määrän ja varaukset. 2 erillistä sql-lauseketta lienee järkevin. Thänks G. taas oppii uutta!!

Lisäys: UNION ei toimi koska taulun kolumnien määrä ei täsmää.

Lisäys:

Nyt koodi tämä. Eli ongelma. Minulla on 2 SQL-lausetta, mutta mikä olisi mahdollinen tapa saada $query2 osaksi sisältöä. Jotenkinhan nuo pitää saada yhdistettyä nuo SQL-lauseet. Vai onko täysin mahdoton. Miten tuonne sekaan edes voi echottaa??

ja huom! vältän tällaisia <?php echo="WTF!?" ?> html-koodin sekaan.

// haetaan kaikki tapahtumat joiden status on 'Tapahtumat' päivämäärän mukaan
// lasketaan varattaujen työvuorojen määrä per tapahtuma
    $query = "SELECT tapahtuma.*,
              COUNT(varaus.Tapahtuma_Id) AS varattu
              FROM tapahtuma
              LEFT JOIN varaus On Tapahtuma_Id = T_Id
              WHERE tStatus = 'Tapahtumat'
              GROUP BY T_Id
              ORDER BY tPvm";

// haetaan tarveluku tarve taulusta pienen laskutoimituksen avulla
$query2 = "SELECT SUM(tarve.tTarve) AS tarve
		   FROM tarve
		   JOIN ryhma ON tarve.R_Id = ryhma.R_Id
		   GROUP BY T_Id";

$result = $mysqli->query($query) or die ($mysqli->error.__LINE__);

// käsitellään haettu tieto
if($result->num_rows > 0) {

  // taulukon otsikot
  echo "<table id='taulukko'>
              <tr>
                <th>tapahtuma</th>
                <th>pvm</th>
                <th>klo</th>
                <th>sijainti</th>
                <th>tarve</th>
                <th>varat.</th>
              </tr>";

      // tietosisältö
      while($row = $result->fetch_assoc()) {
        echo "<tr>
                <td><a href='index.php?sivu=varaa&T_Id=" . stripslashes($row['T_Id']) . "'>" . stripslashes($row['tNimi']) . "</a></td>
                <td>" . stripslashes($row['tViikonpaiva']) . " " . stripslashes($row['tPvm']) . "</td>
                <td>" . stripslashes($row['tAlkaa']) . "-" . stripslashes($row['tLoppuu']) . "</td>
                <td>" . stripslashes($row['tSijainti']) . "</td>
                <td>" . stripslashes($row['tarve']) . "</a></td>
                <td>" . stripslashes($row['varattu']) . "</a></td>
              </tr>";
        }
        echo "</table>";
      }

Grez [11.09.2012 22:14:57]

#

Toki voit joinia useampiakin tauluja samaan kyselyyn. Myös alikyselyiden teko on mahdollista. Tosin joskus (usein) on järkevämpää yhdistellä useamman kysymyksen tuloksia ohjelman päässä kuin yrittää saada kaikki mahdollinen haettua yhdellä kyselyllä.

latenleffahylly [11.09.2012 22:29:44]

#

Noniin.. jos nyt tilanne on se että jätän nuo 2 eri SQL-kyselyä ennalleen, niin miten saisin ne tulostettua oikein? Koodi on ylläolevassa postauksessa.

Jos tilanne on se että ei pysty tulostamaan samaan tauluun, niin voiko esim. joku kokenut: Metabolix, alkemisti, grez jne. kertoa onko tämä ylipäätään mahdollista? Turhaan koluan tietoa netistä, kiitos!

latenleffahylly [15.09.2012 21:01:18]

#

Hei, nopea kysymys. Olen yrittänyt etsiä Googlen kautta tietoa miten hallita istuntoja (session control). Haluaisin oppia tutkimaan mille tasolle käyttäjä kuuluu ja mitä tässä tasossa olevalle henkilölle näytetään.

Onko kellään tietoa tutoriaalista tällaiseen, kiitän?

Macro [15.09.2012 21:13:46]

#

Käyttäjän taso pitää tietenkin tallentaa tietokantaan. Se myös haetaan tarvittaessa sieltä.

Käyttäjän tunnistautumiseen käy jokin satunnainen merkkijono, joka tallennetaan kirjautumisen yhteydessä sekä tietokantaan että istuntoon.

latenleffahylly [15.09.2012 21:34:48]

#

Tietokannassa on taulu työntekijät, jossa jokaisella työntekijällä on oma ryhmä id-numero. Eli käyttäjä: Testaaja, 1

Tasoja, tai noita ryhmiä on yhteensä 4 kpl. Tuota alempaa riviä en valitettavasti ymmärrä. Eli kun tallennan käyttäjän "tiedot" nimellä -> $_SESSION['id'] niin tuossa istunnossa on jokin merkkijono, eli käyttäjän tiedot. Esim. dvhisv434763jhrj ..jotenkin noin.

No tämä siis pitää käyttäjän sisällä suljetussa osiossa. Mutta miten erotella käyttäjä 1 ja 2 toisistaan, jotta eivät voi varata työvuoroja muuta kuin oman ryhmän tapahtumiin?

Tapahtuma 1
- vain ryhmä 1 työntekijät

Tapahtuma 2
- vain ryhmä 2 työntekijät

Miten teen tuon tarkistuksen ja missä vaiheessa. Eli kirjoitanko index.php tiedostoon tutki mihin ryhmään käyttäjä kuuluu sen jälkeen kun hän on kirjautunut sisään. Niin ja miten tämä tehdään. Tavallaan haluaisin tietää onko SESSION_SET_SAVE_HANDLER se funktio jota alan soveltamaan.

SESSION_SET_SAVE_HANDLER (sets user-level session storage function)

Lisäys:

Okei sen verran vielä että... minulla on $_SESSION['usr']

Haen siihen työntekijät taulusta seuraavat tiedot: id-numero, käyttäjänimi, ryhmä-id.

Eli nyt sitten tuossa istunto-muuttujassa on tallennettuna esimerkiksi:
id-numero = 1
käyttäjänimi = testaaja
ryhmä = 3

Noniin eli kaiketi työvuoron varaamisen yhteydessä tarkastelen tuota sessiota ja jos siinä ei ole ryhmän kohdalla sitä lukua jota löytyy tapahtumasta niin erroria peliin.

Tapahtuma A:
ryhmät: 1,2,4

Näin ollen tämän testaaja-käyttäjän kohdalla näytettäisiin että hän ei voi varata työvuoroa koska tämä tapahtuma on ryhmille 1,2,4. ?? Olenko lainkaan jäljillä..

Lisäys:

Tässä sessiot, jotka rakensin:

$_SESSION['id'] = $row['id'];
$_SESSION['usr'] = $row['usr'];
$_SESSION['ryhma'] = $row['ryhma'];

..eli tietokannasta haetaan työntekijät taulusta id-numero, käyttäjänimi, ryhmä-id. Varaa työvuoro sivun yläosassa teen näin:

if($_SESSION['id']) {

Eli tähänkö kohtaan pitäisi rakentaa ehto? Jos $_SESSION['ryhma'] = on eri kuin jokin tapahtuman ryhmä-id numeroista, älä avaa varaa työvuoro lomaketta? Hmm.. no tähän ei tarvitse vastata, mutta näin omalla logiikallani päättelen asiaa. Kiitos tuesta Macro.

Othnos [17.09.2012 01:12:41]

#

Kuten Macro jo aikaisemmin mainitsi niin tallenna istuntoon vain käyttäjän tunnistukseen tarvittava merkkijono kirjautumisen yhteydessä esimerkiksi

<?php
// kirjautuminen.php

$sql = mysqli->prepare("SELECT uniikkiTunnus FROM kayttajat WHERE kayttaja = ? AND salasana = ?");

// Kyselyn suorittamiset jne.

$_SESSION['kayttaja'] = $row['uniikkiTunnus'];

Kyseisen tunnuksen perusteella haet sitten joka kerta tarvitsemasi tiedot.

<?php
// varaatyovuoro.php

$sql = mysqli->prepare("SELECT id, kayttaja, ryhma FROM kayttajat WHERE uniikkiTunnus = ?");

// Kyselyn suorittamiset jne.
// Parametrina syötetään kyseinen $_SESSION['kayttaja']

$kayttaja['id'] = $row['id'];
$kayttaja['kayttaja'] = row['kayttaja'];
$kayttaja['ryhma'] = $row['ryhma'];

if (!in_array($kayttaja['ryhma'], $tapahtuma['ryhmat'])) {
   // Voidaan ohjata esimerkiksi virhesivulle tai tulostaa teksti ettei käyttäjä kuulu kyseiseen ryhmään, eikä näin ollen voi varata tapahtumaa
   header('location: virhesivu.php');
}

// Tulostetaan varauslomake

latenleffahylly [19.09.2012 21:17:56]

#

Noniin, Othnos sun muut. Tein omalla tyylilläni. Eli työvuoroa varatessa tarkistetaan mihin ryhmään kuuluu (session). Sitten kun menee ylläpitoon niin työntekijän oman numeron mukaan tsekataan onko ylläpitäjä (session).

kiitän.

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

Mutta aikaa kuluu.. eli olen nyt vaiheessa jossa rakennan ylläpito-osiota. Työntekijän tallentaminen tietokantaan toimii hyvin. Mutta nyt kun teen lomaketta, jossa idea on tehdä uusi tapahtuma, niin nostin hieman rimaa.

VAATIMUKSET:

Kaikissa lomakkeen kentissä joissa voi käyttää jQuerya niin myös tehdään. Eli tällainen Datepicker toimii, mutta Timepicker ei. Siksi olisinkin yleisesti kysynyt voisiko joku hieman selventää minulle miten tämä upea jQuery UI toimii!?

- eli Datepicker asennus onnistui
- Timepicker Add on tuottaa päänvaivaa eli asentaminen, mitkä tiedostot ja mihin kansioihin.

http://trentrichardson.com/examples/timepicker/#slider_examples

http://jqueryui.com/demos/

latenleffahylly [21.09.2012 09:50:52]

#

Hei haen tällaisen rivin tietoa tietokannasta: 2012-09-21

Nyt tapahtumat-sivulla näytetään tämä muodossa: 21.9.2012

Kun lisään merkin "D" niin saan esim. "Fri" <-Miten muuttaa nuo tietokannasta tulevat päivämäärät niin että saan muokattu englanninkieliset lyhenteet suomenkielisiin lyhenteisiin?

<td>" . date("D j.n.Y", strtotime($row['tPvm'])) . "</td>

Grez [21.09.2012 16:45:57]

#

Voisit käyttää date asemesta strftime

<?php
setlocale(LC_ALL, 'fi_FI');

echo strftime("%A %e.%B.%Y");
?>

latenleffahylly [22.09.2012 14:32:39]

#

Kiitän Grez, mutta ehkä selitin huonosti. Eli haluaisin muuttaa lyhenteet jotenkin näin:

$viikonpaivaLyhenne = array (
    "Mon" => "Ma",
    "Tue" => "Ti",
    "Wed" => "Ke",
    "Thu" => "To",
    "Fri" => "Pe",
    "Sat" => "La",
    "Sun" => "Su"
    );
// tietosisältö
while($row = $result->fetch_assoc()) {

  // tulostetaan...
  echo "<tr><td>" . date("D j.n.Y", strtotime($row['tPvm'])) . "</td></tr>";

Eli tuo iso "D" tuo tietokannasta nyt tällaisia tietoja: Fri, Mon, Tue jne. ne suomalaisiin muotoihin Pe, Ma, Ti jne.

The Alchemist [22.09.2012 14:51:33]

#

No otat jokaista date('D'):n tuottamaa arvoa vastaavan suomenkielisen käännöksen tuosta $viikonpaivaLyhenne-taulukostasi, y?

latenleffahylly [22.09.2012 19:34:32]

#

Miten niin otan.. while-silmukan jälkeen pitäisi saada käsittääkseni kaikki $row['tPvm'] -rivit käymään läpi jokin muutos? ja sitten vielä tulostaa ne.

Sinäänsä harmi että tuota "D" arvoa ei voi jotenkin lokalisoida, jolloin lyhenne Fri muuttuisi muotoon Pe

jalski [22.09.2012 19:51:06]

#

latenleffahylly kirjoitti:

Sinäänsä harmi että tuota "D" arvoa ei voi jotenkin lokalisoida, jolloin lyhenne Fri muuttuisi muotoon Pe

Ei kai tuo nyt niin kovin paljon asioita mutkistaisi, jos vaihtaisit "D" -> "N", laittaisit suomenkieliset viikonpäivät taulukkoon ja hakisit sitten taulukosta viikonpäivänumeroa vastaavan viikonpäivän?

The Alchemist [23.09.2012 10:09:08]

#

No edelleen tuo Grezin antama esimerkki on parempi kuin käsin hakata viikonpäiviä taulukkoon. Yritin vain saada Laten käyttämään vähän omia aivojaan mutta hukkaan meni. Paria juttua pitänee kuitenkin tarkentaa:

1) Lyhyen viikonpäivän nimen symboli on %a eikä %A.
2) Pelkkä "fi_FI" ei välttämättä toimi, riippunee käyttöjärjestelmästä.

Minulla toimi seuraavanlainen variantti:

setlocale(LC_ALL, 'fi_FI.UTF8');
print strftime('%a') . PHP_EOL;

latenleffahylly [23.09.2012 11:39:08]

#

Miten tuossa Grezin esimerkissä laitetaan muuttuja: $row['tPvm'] mukaan koodiin? Ja alkemistille terveisiä, että kyllä yritän näitä itse tajuta myös. Varmaan tuo koodin yhdistäminen vielä suurimpia heikkouksiani.

-----

1.) tietokannassa on sarake tPvm
2.) sieltä tulee merkkejä kuten: 2012-09-23
3.) nämä merkit sisältävät myös viikonpäivän englanniksi vaikka se ei näy tietokannan taulussa
4.) nyt tämä päivämäärä pitäisi muokata jotenkin suomenkieliseen muotoon jolloin "D" ei olisikaan "Sun" vaan "su"

5.) hmm.. tässä vaiheessa putosin, eli miten saada muuttuja tämän sisään-> echo strftime("%A %e.%B.%Y");

6.) Entä voiko set_locale funktiota käyttää jotenkin ennen tulostamista, vai jokaisen tulostus kohdan yhteydessä..

dartvaneri [23.09.2012 11:54:16]

#

Veikkaisinpa, että seuraavalla onnistuu:

setlocale(LC_ALL, 'fi_FI.UTF8');
echo strftime("%a %d.%m.%Y", strtotime($row['tPvm'])) . PHP_EOL;

https://www.php.net/manual/en/function.strftime.php

The Alchemist [23.09.2012 14:01:01]

#

latenleffahylly kirjoitti:

Miten tuossa Grezin esimerkissä laitetaan muuttuja: $row['tPvm'] mukaan koodiin? Ja alkemistille terveisiä, että kyllä yritän näitä itse tajuta myös. Varmaan tuo koodin yhdistäminen vielä suurimpia heikkouksiani.

No lue sitten edes vähän sitä manuaalia? Sieltä näkee välittömästi, että strftimelle voi antaa toisena parametrina kellonajan unix timestamppina. Tai olisihan sen hokaissut varmasti ilmankin.

latenleffahylly [23.09.2012 14:13:31]

#

Hei, yritän tallentaa tietoa Checkboxseista tietokantaan. Lomakkeelta hakeminen onnistuu, mutta miten SQL-lause muodostetaan?

$valittuTapahtuma = $_POST['T_Id'];
$_POST['chk'];

// 6.) tallennetaan
for($x=0; $x<count($_POST['chk']); $x++) {
  mysql_query("INSERT INTO varaus (
               Tapahtuma_Id,
               tyontekijanumero,
               varno,
               date
               )
               VALUES (
               '" . $valittuTapahtuma . "',
               '" . $_POST['chk'][$x] . "',
               '" . $_POST[varno] . "',
               '" . $_POST[date] . "'
               )");
}

latenleffahylly [04.10.2012 08:57:03]

#

Ehtiikö kukaan hieman katsoa tai kertoa miten-> $_POST['chk']; -muuttujasta otetaan tietoa ulos tietokantaan? (esim. for, foreach)

Othnos [04.10.2012 10:00:02]

#

<?php
foreach ($_POST['chk'] as $chk) {
   "VALUES (
   '" . $chk . "'
   )"

PHP.netistä olisit löytänyt tuon foreachin syntaksin, mutta heitin sinulle nyt valmiin esimerkinkin kyseiseen tapaukseen sen käytöstä.

Aikaisemmin käytit mysqli:tä, niin miksi nyt käytät mysql_-funktioita suoraan vaikka aikaisempi tapasi oli huomattavasti parempi?

Myöskin sinulta puuttuu nuiden $_POST[] sisältä '' -merkit.

latenleffahylly [04.10.2012 10:54:29]

#

Kiitän Othnos, for-silmukka myös mahdollinen. Yritän jatkossa siirtyä pdo:n käyttöön. Hulluinta on nyt se että tässä tapahtumapalvelu projektissa käytän 3 eri tietokanta mallia:

-pdo
-mysqli
-mysql

dartvaneri [04.10.2012 12:07:54]

#

latenleffahylly kirjoitti:

Kiitän Othnos, for-silmukka myös mahdollinen. Yritän jatkossa siirtyä pdo:n käyttöön. Hulluinta on nyt se että tässä tapahtumapalvelu projektissa käytän 3 eri tietokanta mallia:

-pdo
-mysqli
-mysql

Ei kannata yrittää, siitä ei paljoa ole iloa. Tee se, eläkä yritä. Ja tee se jo nyt heti, muuta kakki pdo:ksi, ei niitä kannata käyttää sekaisin, turhaa vain sekottaa. Ja jos siirrät sitä tuonnemmaksi, et sitä tule tehneeksi.

mysqli?

Grez [04.10.2012 12:36:09]

#

dartvaneri kirjoitti:

muuta kakki pdo:ksi

En tiedä oliko tämä tarkoituksella vai kirjoitusvirhe, mutta hymähdin.

latenleffahylly [04.10.2012 13:44:05]

#

Noniin.. eli toki muuttaisin itsenikin siinä samalla koodariksi jos pystyisin. Eli PDO on hieno mutta vaikea koodaus tapa. Minulla on vanhaa koodia eli vanha tapa tehdä, joten.. sen korvaaminen uudella tavalla ei ole aivan 1 -> yhteen.

Mutta toisaalta se on juuri näin, muutos on tehtävä heti ja lopettaa vanhan koodin suoltaminen. (PDO)

Lebe80 [04.10.2012 14:43:03]

#

latenleffahylly kirjoitti:

Eli PDO on hieno mutta vaikea koodaus tapa.

Wait wat?

Kyllä mä voin sanoa, että PDO on ihan samanlaisien kyselyiden kirjoittamista kuin "wanhalla tavallakin". Ainoa, että mysql_real_fckin_escapen tille tuleekin usein pelkkä kysymysmerkki.

Grez [04.10.2012 15:12:26]

#

latenleffahylly kirjoitti:

hieno mutta vaikea koodaus tapa

En kyllä ymmärrä miten se on "vaikea". Paljonko sulla nyt sitten niitä kyselyitä on? Jos yhden muuttamisen menee minuutti niin 60 kyselyä saa vaihdettua PDO:ta käyttäväksi tunnissa. Jos sulla on tollaisessa systeemissä paljon enemmän kuin 60 kyselyä, niin sattaa olla paikallaan tehdä muutakin refaktorointia.

Othnos [04.10.2012 15:25:37]

#

dartvaneri: PHP.net mysqli tai google mysqli. Kuitenkin hyvin samantyyppinen kirjasto, kuin PDO, mutta tarjoaa mahdollisuuden myös proseduraaliseen ohjelmointiin. Lisää voit lukea vaikka täältä.

dartvaneri [04.10.2012 22:31:31]

#

latenleffahylly kirjoitti:

Noniin.. eli toki muuttaisin itsenikin siinä samalla koodariksi jos pystyisin.

Tarvitseeko muuttaa? Minun käsitykseni mukaan olet jo koodari. Koodarihan on vain ihminen, joka kirjoittaa koodia, eikä mielestäni tarvitse edes tehdä sitä päivittäin.

latenleffahylly kirjoitti:

Eli PDO on hieno mutta vaikea koodaus tapa. Minulla on vanhaa koodia eli vanha tapa tehdä, joten.. sen korvaaminen uudella tavalla ei ole aivan 1 -> yhteen.

Mutta toisaalta se on juuri näin, muutos on tehtävä heti ja lopettaa vanhan koodin suoltaminen. (PDO)

Joo, ei se ihan yks yhteen ole, vaikka ei se kauaksi heitäkkään.

Grez kirjoitti:

dartvaneri kirjoitti:

muuta kakki pdo:ksi

En tiedä oliko tämä tarkoituksella vai kirjoitusvirhe, mutta hymähdin.

:) Pieni viba tullu siinä.

Othnos kirjoitti:

dartvaneri: PHP.net mysqli tai google mysqli. Kuitenkin hyvin samantyyppinen kirjasto, kuin PDO, mutta tarjoaa mahdollisuuden myös proseduraaliseen ohjelmointiin. Lisää voit lukea vaikka täältä.

Juu no toi 'mysqli?' jäi ihan vahingossa. Olin kirjottamassa jotain kysymystä ja sitten päätinkin jäättää kysymättä, kiireessä jäi sitten toi tohon loppuun.

tneva82 [05.10.2012 09:18:42]

#

Grez kirjoitti:

latenleffahylly kirjoitti:

hieno mutta vaikea koodaus tapa

En kyllä ymmärrä miten se on "vaikea". Paljonko sulla nyt sitten niitä kyselyitä on? Jos yhden muuttamisen menee minuutti niin 60 kyselyä saa vaihdettua PDO:ta käyttäväksi tunnissa. Jos sulla on tollaisessa systeemissä paljon enemmän kuin 60 kyselyä, niin sattaa olla paikallaan tehdä muutakin refaktorointia.

Noh pikainen tarkistus palvelimelta jonne on pääsy. 400+ tiedostoa. Ok kaikki ei oo php tiedostoja mutta aikamoinen osa noista on. Ja php tiedostoissa melkein kaikissa useampi kysely. Ei olisi pienin urakka vaihtaa sivuston alkuperäisen tekijän omaa sql wrapperia pdo:n. Ja kriittisempääkin urakkaa piisaa kuin vaihdella vanhaa toimivaa koodia.

Tosin varmaan jossainvaiheessa siirrytään kun on lisää aikaa mutta ny saa olla.

Grez [05.10.2012 09:47:25]

#

tneva82 kirjoitti:

Noh pikainen tarkistus palvelimelta

Jaa siis kyseessä on nimenomaan työvuoron varausohjelma, jossa on käytetty sekaisin mysql-, mysqli- ja pdo-kirjastoja? Jos ei, niin ei hirveesti liity mun viestiin.

tneva82 [05.10.2012 10:21:33]

#

Grez kirjoitti:

tneva82 kirjoitti:

Noh pikainen tarkistus palvelimelta

Jaa siis kyseessä on nimenomaan työvuoron varausohjelma, jossa on käytetty sekaisin mysql-, mysqli- ja pdo-kirjastoja? Jos ei, niin ei hirveesti liity mun viestiin.

Pointtina oli että ei se ole välttämättä niin nopeata vaihtaa PDO:n kuin annoit ymmärtää. Joo yhdestä tiedostosta sen tekee nopeasti mutta harvemminpa mikään systeemi on vain 1-2 php tiedostoa. Paitsi toki koulun harjoittelutyöt.

Grez [05.10.2012 12:36:00]

#

Viestissäni kirjoitin aika selkeästi että koska tuollaisessa työnvarausjärjestlemässä josa käytetään sekaisin eri tietokantakirjastoja tuskin on hirveästi yli 60 muutettavaa kyselyä, niin niiden muuttamisessa ei pitäisi kestää kovin kauaa. Kirjoitin että jos kyselyitä on sellaisessa hirveästi enemmän, niin sille luultavasti tekisi refaktorointi muutenkin hyvää.

En edelleenkään löydä mitään pointtia viestistäsi, jos siinä käsiteltiin jotain muuta järjestelmää.

The Alchemist [05.10.2012 20:11:36]

#

Jos sulla on satoja skriptitiedostoja ja JOKAISESSA käpistellään tietokantaa, niin sovelluksen arkkitehtuurissa on kyllä menty ihan metsään.

t0ll0 [06.10.2012 05:03:59]

#

The Alchemist kirjoitti:

Jos sulla on satoja skriptitiedostoja ja JOKAISESSA käpistellään tietokantaa, niin sovelluksen arkkitehtuurissa on kyllä menty ihan metsään.

Että kun olis tykkää nappula.. Tuo on ihan perseestä ja kauheeta korjata jos tommoseen projektiin jostain jumalan ihmeestä joutuu.

latenleffahylly [06.10.2012 22:14:11]

#

Noniin.. arvausputkalaiset.. elikkä ongelma on että kun yhdistää pdo:lla tai hakee tietoa ja tulostaa sitä niin se on erilainen tapa kuin esim. mysqli ja mysql, mutta ei selityksiä, kaikki muutetaan aikanaan.

The Alchemist [06.10.2012 22:39:30]

#

Ei siinä ole mitään erilaista mihinkään muuhun verrattuna. Suoritat SQL-kyselyn ja sitten iteroit tulosjoukkoa. Jos näet tässä jonkin ongelman, niin sitten sinun täytyy opetella käyttämään PDO:ta kunnes hallitset sen. Lopetat vaikka kaiken muun koodaamisen ja keskityt erilaisiin PDO-esimerkkeihin, kunnes ymmärrät täysin, mistä asiassa on kyse ja miten homma toimii. Ja saman saisit toistaa kaikkien muidenkin asiakokonaisuuksien kohdalla.

Et yksinkertaisesti voi sulkea silmiäsi ongelmilta ja yrittää pyristellä pelkän copy-pasten varassa. Se on sekä säälittävää että vaarallista, kun et ymmärrä "tekemistäsi" järjestelmistä yhtään mitään.

latenleffahylly [06.10.2012 23:15:14]

#

Hmm.. mielestäni en vain copy-paste -taa. Olen rakentanut järjestelmän itse materiaalista jota olen netistä kerännyt. Myönnän että en osaa oikeastaa php:tä koodata ihan tyhjästä tiedostosta, se harmittaa.

Nyt muutin Tapahtumat -sivun joka oli tehty Mysqli tyylillä PDO- tyyliseksi. Mutta kun siirryn seuraavaan tiedostoon varaa.php, niin alkuun tulee heti eteen if else rakenteet..

Ohjelmointiputkan oppaissa PDO:ta käsitellään lyhyesti ja siitä on ollut apua, mutta missä suurempi pdo opas?

dartvaneri [06.10.2012 23:18:40]

#

latenleffahylly kirjoitti:

Hmm.. mielestäni en vain copy-paste -taa. Olen rakentanut järjestelmän itse materiaalista jota olen netistä kerännyt. Myönnän että en osaa oikeastaa php:tä koodata ihan tyhjästä tiedostosta, se harmittaa.

Nyt muutin Tapahtumat -sivun joka oli tehty Mysqli tyylillä PDO- tyyliseksi. Mutta kun siirryn seuraavaan tiedostoon varaa.php, niin alkuun tulee heti eteen if else rakenteet..

Ohjelmointiputkan oppaissa PDO:ta käsitellään lyhyesti ja siitä on ollut apua, mutta missä suurempi pdo opas?

Heitä koodia, missä kohtaa tule ongelma, ja kerro mikä ongelma, niin kyllä me kerrotaan miten se kannataa tehdä.

Lisäys: Tuolla oppaalla, mikä putkassa on, saa kyllä varmasti kaiken perusjutun tehtyä, eli pärjäät sillä kyllä.

latenleffahylly [06.10.2012 23:30:00]

#

Tässä on netistä PDO:ta

$sql = "SELECT COUNT(*) FROM folks";
if ($STH = $DBH->query($sql)) {
    # check the row count
    if ($STH->fetchColumn() > 0) {
    # issue a real select here, because there's data!
    }
    else {
        echo "No rows matched the query.";
    }
}

Nyt tässä on MYSQL tapa, joka on karmeaa katsottavaa

// otetaan talteen tapahtuman numero
$T_Id = $_REQUEST['T_Id'];

// haetaan tapahtuman tarveluku
$sql_haetietoja = "SELECT SUM(tarve.tTarve) AS tarve
				   FROM tapahtuma
				   JOIN tarve ON tapahtuma.T_Id = tarve.T_Id
                   WHERE tapahtuma.T_Id = " . $T_Id;

  if (!$hae = mysql_query($sql_haetietoja)) {
	die('Error: ' . mysql_error());
  }
  // $tulos muuttujaan tallennetaan tarveluku
  else {
    $tulos = mysql_fetch_row($hae);


    jne.

dartvaneri [06.10.2012 23:44:51]

#

Mikä siis on ongelma? Saada tuo koodi muutettua PDO:ksi?

Lisäys:
Jos se siis oli onglema niin:

$T_Id = $_REQUEST['T_Id'];
$sql = "SELECT SUM(tarve.tTarve) AS tarve
				   FROM tapahtuma
				   JOIN tarve ON tapahtuma.T_Id = tarve.T_Id
                   WHERE tapahtuma.T_Id = ?";

$kysely = $yhteys->prepare($sql);
$kysely->execute(array($T_Id));

$tulos = $kysely->fetch();
$hakutulos = $tulos[$hae];

The Alchemist [07.10.2012 08:47:54]

#

latenleffahylly kirjoitti:

Hmm.. mielestäni en vain copy-paste -taa. Olen rakentanut järjestelmän itse materiaalista jota olen netistä kerännyt. Myönnän että en osaa oikeastaa php:tä koodata ihan tyhjästä tiedostosta, se harmittaa.

Tämä on aidon copy-paste-koodarin täydellinen määritelmä.

latenleffahylly kirjoitti:

Ohjelmointiputkan oppaissa PDO:ta käsitellään lyhyesti ja siitä on ollut apua, mutta missä suurempi pdo opas?

PDO:n manuaalin löydät luonnollisesti PHP.netistä.

latenleffahylly [07.10.2012 11:54:46]

#

okei kiitos, eli yritän tulostaa koodia ja tarvitsen noita if- else- rakenteita. Eli siis miten tulostaa kokonainen SQL-lause, jossa mukana useita sarakkeita ja useita rivejä...

latenleffahylly [07.10.2012 14:37:26]

#

Minulla on nyt tällaista tyyliä käytössä, onko ihan hyvä tapa?

$haeTapahtumat = $yhteys->query("SELECT T_Id FROM tapahtuma");

// alempana

while ($row = $haeTapahtumat->fetch(PDO::FETCH_ASSOC)) {
  echo '<tr>
		  <td><a href="index.php?sivu=muokkaa_tapahtuma&T_Id=' . $row['T_Id'] . '">' . $row['tNimi'] . '</a></td>
		</tr>';
}

Pitäisikö esim. while käskyn alla olla: $T_Id = $row['T_Id'];

The Alchemist [07.10.2012 16:02:12]

#

latenleffahylly kirjoitti:

okei kiitos, eli yritän tulostaa koodia ja tarvitsen noita if- else- rakenteita. Eli siis miten tulostaa kokonainen SQL-lause, jossa mukana useita sarakkeita ja useita rivejä...

Kerrohan nyt ihan kunnolla, selkeästi ja ajateltuna, että mitä sinä nyt haluat?

Voit tulostaa SQL-kyselyitä aivan kuin mitä tahansa muutakin tekstiä: käyttämällä esim. printiä, echoa tai printf:ää.

SQL-kyselyitä voit generoida ajonaikaisesti ihan kuten generoisit mitä tahansa muitakin merkkijonoja. Ne ovat vain tavallista tekstiä. Merkkijonoja voit katenoida toisiinsa käyttämällä esim. pisteoperaattoria ('.') tai funktiota sprintf.

Mikäli haluat tulostaa SQL-kyselyn tuottaman tulosjoukon, niin sen voi tehdä yksinkertaisimmillaan funktiolla print_r:

$rows = $smt->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);

Mikäli tarvitset paremmin muotoillun tulosteen, niin fetch() ja fetchAll() palauttavat ihan tavallisen taulukon (array), joita voit käpistellä kuten käpistelisit mitä tahansa muitakin taulukoita.

dartvaneri [07.10.2012 17:31:56]

#

latenleffahylly kirjoitti:

Minulla on nyt tällaista tyyliä käytössä, onko ihan hyvä tapa?

$haeTapahtumat = $yhteys->query("SELECT T_Id FROM tapahtuma");

// alempana

while ($row = $haeTapahtumat->fetch(PDO::FETCH_ASSOC)) {
  echo '<tr>
		  <td><a href="index.php?sivu=muokkaa_tapahtuma&T_Id=' . $row['T_Id'] . '">' . $row['tNimi'] . '</a></td>
		</tr>';
}

Miksi ei vain suoraan $query->fetch()?

$getEvent = $connect->prepare("SELECT T_Id, tNimi FROM events");
$getEvent->execute();

while($result = $getEvent->fetch()){
	echo '
		<tr>
			<td>
				<a href="index.php?sivu=muokkaa_tapahtuma&T_Id='.$result['T_Id'].'">'.$result['tNimi'].'</a>
			</td>
		</tr>
	';
}

latenleffahylly kirjoitti:

Pitäisikö esim. while käskyn alla olla: $T_Id = $row['T_Id'];

Ei taida olla tässä tapauksessa mitään hyötyä.

Edit. Koodia korjattu.

latenleffahylly [07.10.2012 18:25:22]

#

Noniin nyt PDO:ta harjoiteltu. PHP-kirja + putkan opas. Ihan helppoja nämä perus haut ja viennit (update,insert,delete).

Tuota htmlspecialchar merkintää jokaisen tietopaketin edessä ihmettelen. Itse muuten käytän PDO-yhteyden luonnissa utf8-merkistöä, hyvin toimii.

Turso [08.10.2012 14:53:57]

#

The Alchemist kirjoitti:

Jos sulla on satoja skriptitiedostoja ja JOKAISESSA käpistellään tietokantaa, niin sovelluksen arkkitehtuurissa on kyllä menty ihan metsään.

Hei, kerrotko lisää tästä, tai annatko vinkin mistä löytyy lisää tietoa? Mikä on oikea tapa / miten PHPssä toteutetaan tietokantakerros, vaatiiko olion?

Metabolix [08.10.2012 15:19:17]

#

latenleffahylly kirjoitti:

Tuota htmlspecialchar merkintää jokaisen tietopaketin edessä ihmettelen.

Minun on vaikea käsittää, miten voit ihmetellä jatkuvasti kaikkia sellaisiakin asioita, jotka selitetään oppaissa oikein esimerkkien kanssa.

Kokeilepa tallentaa vaikka tapahtuman nimeksi "<script>alert(location)</script>" tai edes "a<b ja b>a" ja katso, mitä sivulla näkyy htmlspecialchars-funktion kanssa ja ilman sitä.

The Alchemist [08.10.2012 17:25:28]

#

Turso kirjoitti:

The Alchemist kirjoitti:

Jos sulla on satoja skriptitiedostoja ja JOKAISESSA käpistellään tietokantaa, niin sovelluksen arkkitehtuurissa on kyllä menty ihan metsään.

Hei, kerrotko lisää tästä, tai annatko vinkin mistä löytyy lisää tietoa? Mikä on oikea tapa / miten PHPssä toteutetaan tietokantakerros, vaatiiko olion?

En koe itseäni minkäänlaiseksi auktoriteetiksi tämän suhteen. Oma politiikkani on kuitenkin se, että noudatan mahdollisimman pitkälle MVC-paradigmaa: tietokantaan yhteydessä ovat ainoastaan malleiksi (models) miellettävät luokat. Ne muodostavat kaikki SQL-kyselyt ja antavat ne suoritettavaksi erilliselle tietokantaoliolle. Mikään muu järjestelmän osa ei näe SQL:ää lainkaan.

Lisäksi yritän järjestellä koodin siten, että yhtä tietokantataulua käpistellään mahdollisimman harvassa tiedostossa. Näin tietokantamuutokset on helppo päivittää koodiinkiin, kun ei tarvitse arpoa, että mikä kaikki hajoaa, jos lisää tai poistaa jonkin sarakkeen taulusta X.

Itse olen viime aikoina käyttänyt paljon Doctrinea, joka soveltuu hyvin oliojärjestelmiin. Siinä abstraktiot on viety niin pitkälle, ettei ko. kirjastoa käyttävän koodarin tarvitse oikeastaan itse kirjoittaa riviäkään SQL:ää, koska se on piilotettu muiden mekanismien sisään.

Doctrinen kanssa perustapaukset (olioiden lukeminen ja tallentaminen tietokantaan) menee täysin automaattisesti, monimutkaisempia keissejä varten on SQL:stä jalostettu "olioversio" DQL (Doctrine Query Language), joka on mielestäni helppoa oppia kenen tahansa, joka taitaa SQL:n perusteet.

Olioitahan ei ole mikään pakko käyttää, mutta mielestäni ne tekevät PHP-koodaamisesta mukavampaa ja kätevämpää varsinkin yhdistettynä autoloadiin.

latenleffahylly [11.10.2012 09:14:32]

#

Hei, nopea kysymys.. minulla on lomake johon syötetään:

- Etunimi
- Sukunimi

//tuossa ovat sallitut merkit mitä tekstikenttiin voi lomakkeella syöttää

[^A-Za-z\-\Ä\ä\Ö\ö\Ü\ü\Å\å\ ]

Nyt sitten yritän muodostaa käyttäjänimen Etunimi + Sukunimi = käyttäjänimi

- Eli millä funktiolla kannattaa käsitellä merkkijonoa.

Ä    ->  A
å    ->  a
" "

-> ""
jne.

Käyttäjänimi pitäisi olla pienellä, yhteen, ja nk. erikoismerkit tavallisina merkkeinä.

str_replace (" ", "", $sukunimi);
strtolower($sukunimi);

Lisäys:

..noniin

Luulen että teenkin niin että käyttäjän sähköpostiosoitteesta tulee hänen käyttäjänimensä. Ne käyttäjät joilla ei ole sähköpostia, muuttuvat ulkopuolisiksi työntekijöiksi joiden työvuorot varaa ylläpitäjä.

kiitän!

jaketsu [11.10.2012 18:17:22]

#

latenleffahylly kirjoitti:

Eli millä funktiolla kannattaa käsitellä merkkijonoa.
Ä -> A
å -> a
" " -> ""
jne.

En tiedä tuolle mitään valmista funktiota, mutta itse olen käyttänyt esim. tällaista:

$korvattavat = array("ä", "ö", "å", "Ä", "Ö", "Å");
$korvaavat = array("a", "o", "a", "a", "o", "a");
$käyttäjänimi = str_replace($korvattavat, $korvaavat, $käyttäjänimi);

Tuosta osannet soveltaa tarvittaessa.

Macro [11.10.2012 18:45:20]

#

jaketsu kirjoitti:

En tiedä tuolle mitään valmista funktiota, mutta itse olen käyttänyt esim. tällaista:

....

Miksei Ä, Ö ja Å saisi olla korvauksen jälkeen isoja? "Åbo" -> "abo"

The Alchemist [11.10.2012 18:47:27]

#

No vaikka siksi, että käyttäjänimet oli speksattu olevan pelkästään pieniä kirjaimia.

Lebe80 [11.10.2012 18:50:44]

#

Eikö noista epäkelvollisista merkeistä voisi mieluummin huomauttaa käyttäjää virheilmoituksella, kuin mennä käpistelemään merkkejä automaattisesti hissun kissun?

Siis ymmärrän, että nykyaikana on hyvä että järjestelmät tekevät asioita automaattisesti antaen sujuvamman kuvan järjestelmän toiminnasta, mutta ymmärsin että tässä tapauksessa puhutaan kuitenkin käyttäjätunnuksesta, jonka käyttäjä itse haluaa asettaa.

Edit:
viesti ei ole suunnattu Alkemistille. Näemmä kirjoitettiin viestit samaan aikaan

The Alchemist [11.10.2012 18:54:57]

#

Mjoo, enpä ole jaksanut tämän kaverin tekemisiä enää pitkilleen vakavasti ottaa, niin en itsekään tuota älynnyt ajatella. Käyttäjätunnuksia tai salasanoja ei tietenkään saa mankeloida sen jälkeen, kun käyttäjä on tiedot antanut ja järjestelmä ne hyväksynyt. Eikä kyllä mitään muitakaan tietoja saa "korruptoida" niiden hyväksymisen jälkeen.

latenleffahylly [12.10.2012 12:45:41]

#

Alkemistille sen verran tiedoksi että alunperin idea oli että ylläpitäjä luo työntekijän koska kyseessä extranet.

Etunimi
Sukunimi

muuttuvat käyttäjänimeksi-> (etunimisukunimi).

..Mutta sitten pohdinnan jälkeen sain neuvon että sähköpostiosoite voisi toimia uniikkina käyttäjänimenä. Käyttäjän sähköposti näkyy vain hänelle itselleen.

The Alchemist kirjoitti:

Mjoo, enpä ole jaksanut tämän kaverin tekemisiä enää pitkilleen vakavasti ottaa

Miksi?

The Alchemist [12.10.2012 14:44:42]

#

Esimerkiksi sen takia, että olet muutaman kerran sanonut, että aiot ensin opetella ohjelmoimaan php:llä ennen uusien projektien ottamista. Sitten kuitenkin lähdet räpeltämään, etkä ole tainnut vaivautua perehtymään kieleen yhtään. Edelleen vain kopioit muiden koodia.

latenleffahylly [13.10.2012 16:11:00]

#

Hmm.. taidat olla oikeassa siinä että en ole perehtynyt tarpeeksi kovalla motivaatiolla PHP:hen. Hankin iPadiin kirjan: "Beginning PHP and MySQL From Novice to Professional" joka on ollut hyvä. Mutta oikeiden esimerkkien löytäminen on minulle vaikeinta.

Olen miettinyt sellaista että jos käytän usein esim. tiedon hakemista tietokannasta PDO:lla. Esim. näin:

$kysely = $yhteys->prepare("SELECT * FROM tuotteet");
$kysely->execute();

Niin sen sijaan että (Copy Paste) minun tulisi osata kirjoittaa nuo 2 riviä koodia tyhjästä? Entä kun koodia on paljon, oppiiko ihminen muistamaan lukuisia eri rivejä?

Tavallaan vaikeinta on hahmottaa se miten aloitatte koodaamaan tyhjälle tiedostolle. Teettekö ensin HTML5 tyylisen rakenteen. Body osaan PHP tagit ja erilliseen tiedostoon esim. tietokantaan yhdistämisen, jota ei tarvitse kutsua koska tiedosto includataan header.php tiedostossa... Olen miettinyt että minulla ei välttämättä ole kykyä oppia koodaamaan PHP:tä korkeammalla tasolla.

Olen aloittanut liian vaikeista projekteista tai jotain.

Nyt muutan vanhaa koodia PDO tyyliseksi. Kaikki sivut käyn läpi ja yritän samassa miettiä mitä teen. Ja alkemisti, en pelkästää kopioi muiden koodia. Usein teen niin että testi.php tiedostoon alan lähes tyhjästä rakentamaan jotain toimintoa ja jokaisen rivin jälkeen tutkin mitä koodi tulostaa.

Kylläkin projektissani useat asiat toistuvat ja tavallaan pysyn lähes koko ajan mukavuusalueellani. Jokatapauksessa haluan sanoa, että panostaminen kalliiseen PHP kirjaan on hyvä. Minulta löytyy aitoina kirjoina: "Web-ohjelmointi, Ari Rantala" ja "HTML 5 uudet ominaisuudet, Jukka K. Korpela" - Sähköisinä kirjoina iPadissa on mm. "Steve Jobs", "Redesigning the Web + lisäosa", "User Experience", "CSS3", "Responsive Design" ...

Näitä yritän lukea aktiivisesti ja samalla koodata omia projektejani "Tapahtumapalvelu versio 2" ja "omat kotisivut versio 5".

- Jokatapauksessa ymmärrän alkemistin turhautumisen ja minun on opeteltava koodaamaan aivan eri tasolla eli alkaa muistamaan noita rivejä ja ymmärtämään niitä paremmin. Suhtaudun intohimoisesti webbiin ja toivon oppivani jonkin tekniikan todella hyvin. PHP:n korkea ymmärtäminen on minulle liikaa. Siihen tarvitaan ihminen joka on rauhallinen, kärsivällinen ja ymmärtää matematiikkaa ja laskemista, sellaista että ymmärtää suuria kokonaisuuksia ja osaa pilkkoa ne osiin. Ymmärtää oman kehitysympäristönsä merkityksen ja tajuaa asiota palvelimesta ja miten selaimet toimivat. Ennen kaikkea tällainen ihminen osaa yhdistää netistä löytämänsä koodin pätkän oman koodinsa sekaan, tai tajuaa ainakin mallista miten joku kohta koodataan??

Noniin.. toivon myös tähän kirjoittamaani teidän mielipiteitä. Olenko unohtanut jonkun tärkeän asian. Jos kirjoittamiseni (projekti) ärsyttää niin olen valmis lähtemään pois täältä. Mutta silloin menettäisin parhaan tietämäni suomalaisen foorumin. Sen ansiosta olen pystynyt, siis kaikkien teidän ansiosta, ..olen pystynyt ratkomaan ongelmia siis ihan keskustelun tasolla. Eli tavallaan kun kirjoitan koodausongelmani tänne, niin se saa minut ymmärtämään ongelman.

Tai joku kertoo taikasanan -> ota selvää tuosta.. jne. kiitos huomiostanne.

The Alchemist [13.10.2012 16:53:57]

#

Minä en puhu nyt mistään syvällisestä PHP:n osaamisesta vaan ihan perusteista. Kuten tuossa edellä vähän aikaa sitten kyselit, että mikä olisi paras tapa korvata merkkijonoista merkkejä toisilla merkeillä. Tai kun takeltelet yksinkertaisten silmukoiden kanssa. Tai kun sanot PDO:n olevan jotenkin vaikea käyttää.

Jos sinulla on ongelmia ymmärtää, miten PDO toimii, niin sitten koodailet itseksesi ihan yksinkertaisia PDO-skriptejä. Aloitat esimerkiksi siitä, että avaat ensin yhteyden PDO:lla, sitten suoritat yksinkertaisen SELECT-kyselyn ja tulostat löydetyt rivit esim. simppeliin listaan (<ul>) tai taulukkoon (<table>).

Tuollaisia yksinkertaisia harjoitteita toistat tasan niin kauan, et yhtään vähempää, kunnes ymmärrät täydellisesti, mitä missäkin kohtaa tapahtuu ja kunnes osaat PDO:n rajapinnan riittävän hyvin.

Ja täsmälleen samalla tavalla toimit kaikkien muidenkin asioiden kanssa, kun kohtaat jotain vaikeaa.

Kirjojen kahlaaminen tässä tilanteessa on mielestäni aivan turha juttu ja kenties jopa haitallista. Ainakaan itse en kirjoja lue oppiakseni perusasioita vaan laajentaakseni teorian tuntemusta. Teoriaa ei voi oppia, jossei osaa ensin ohjelmoida niillä työkaluilla, mitä kirjassa käsitellään.

Kyse ei ole eikä saa olla koodin ulkoa opettelemisesta. Olet edelleen vain copy-paste-koodari, josset osaa tuottaa omaa koodia. On aivan yksi hailee, kopioitko esimerkit suoraan jostain nettisivulta vai opetteletko ne päähäsi ja kopioit muistikuviasi, et edelleenkään osaa ohjelmoida yhtään mitään.

Sinun täytyy ainoastaan oppia rajapinnat. Sinun täytyy tietää lunttaamatta, mitä funktioita esim. PDOStatement-luokka sisältää, mitä parametreja mikäkin funktio ottaa ja minkä tyypin arvoja funktio voi palauttaa. Ja ennen kaikkea sinun täytyy ymmärtää, mitä mikäkin funktio tekee. Copy-pasteamalla koodia et koskaan tule ymmärtämään yksittäisten rivien arvoa koodin toiminnan kannalta, joten et voi ikinä oppia tuottamaan omaakaan koodiasi.

Grez [13.10.2012 17:04:40]

#

The Alchemist kirjoitti:

Sinun täytyy tietää lunttaamatta, mitä funktioita esim. PDOStatement-luokka sisältää, mitä parametreja mikäkin funktio ottaa ja minkä tyypin arvoja funktio voi palauttaa.

Mitä nyt sitten tarkoittaa että osaa "lunttaamatta". Omasta mielestäni on jokseenkin turhaa opetella kaikkea ulkoa ja käyttämäni kehitysympäristöt kyllä täydentää esim. funktioiden nimet kun vähän sinne päin alkaa näpytellä ja kertoo mitkä parametrit sille pitäisi antaa (onko se lunttaamista). Olen kyllä siitä samaa mieltä, että pitäisi muodostua käsitys mitä milläkin voi tehdä, niin ei tarvitse tehdä ihan hölmöllä tavalla.

Mielestäni ei ole järkevää opetella esimerkiksi parametreja ulkoa, koska tietokoneetkin on jo keksitty. Tietenkin yleisellä tasolla tiedän että replace funktio tyypillisesti ottaa ainakin lähdetekstin, etsittävän arvon ja korvattavan arvon, mutta ei todellakaan kiinnosta opetella ulkoa missä järjestyksessä ne missäkin kielessä annetaan tai ottaako esim. joku kieli niitä useita kerralla taulukkoina vai vain yhden tai voiko funktiolle antaa jotain parametreja. Mielestäni tuollaisten asioiden opettelu olisi turhaa ajan haaskausta. Toki ne käytännössä alkaa tulla "selkäytimestä" kun on jonkin aikaa koodaillut.

The Alchemist [13.10.2012 17:13:02]

#

No en tiedä, ehkä se sitten on modernia olla riippuvainen siitä, että ide osaa näyttää tooltipissä funktion parametrilistauksen. Minua se jatkuva odottelu kyllä alkaisi tympiä. Enkä nyt jaksa alkaa purkautua tähän siitä, miten on täysin itsestäänselvää, ettei kaikkea tarvitse osata 100,0000-prosenttisesti eikä varsinkaan muistaa kaikkea aukottomasti. Tämä on itsestäänselvyys eikä siten kaipaa selittelyitä.

Ehkä minä sitten vain olen niin hemmetin täydellinen, että voin koodata tuhansia rivejä monimuotoista koodia turvautumatta siinä välissä php:n "standardikirjaston" manuaaliin kertaakaan vaikkei kukaan muu tällä planeetalla kykene samaan, mutten oikeasti halua uskoa sitä.

Ja kun sanoin "täytyy opetella", tarkoitin lähinnä, että aluksi painopiste on juurikin opettelussa eikä käyttämisessä. Ensin opetellaan asioita jossain määrin selkäytimeen, myöhemmin voi alkaa shiftata hauki on kala -iteraatiosta ihan siihen, että vähän vilaisee ensin manuskaa ja sitten koodaa taas villinä. Jos kirjojen lukeminen on turhaa, niin on myös pelkästään php.netissä surffailu pidättäytyen kokonaan koodin kirjoittamisesta.

Grez [13.10.2012 17:24:20]

#

The Alchemist kirjoitti:

Minua se jatkuva odottelu kyllä alkaisi tympiä.

Olen sit ehkä vaan tottunut liian hyviin työkaluihin, mutta ei siinä nyt yli 1/100 sekuntia joudu odottamaan. Ja kuten sanoin, niin ne kyllä oppii tehdessä käytännössä ulkoa, eli pidemmän päälle ei joudu odottelemaan. Kommentoin lähinnä sitä, että mielestäni olisi turhaa käyttää erikseen aikaa noiden ulkoa opetteluun, kun se hoituu itsestään koodaamisen ohessakin.

Mun pointti nyt ehkä oli, että kun ihmisen kyky oppia on rajallinen tiedon ja opetteluun käytetyn ajan suhteen, niin olisi hedelmällisempää opetella esim. mitä kannattaa tehdä milläkin funktiolla, kuin mitkä ne parametrit nyt tarkalleen ottaen olikaan. Ensimmäiseen kun ei voi käyttää IDEä tehokkaasti apuna ja jälkimmäiseen voi.

The Alchemist kirjoitti:

Ehkä minä sitten vain olen niin hemmetin täydellinen, että voin koodata tuhansia rivejä monimuotoista koodia turvautumatta siinä välissä php:n "standardikirjaston" manuaaliin kertaakaan

No tuskin olet ainoa, mutta olitko muka tuollainen jo ennen kuin teit ensimmäisen vakavamman projektisi?

latenleffahylly [13.10.2012 18:28:49]

#

Hyviä pointteja, kiitos. Alkemisti on varmasti oikeassa monessa kohtaa ja noudatan hänen neuvoja, mutta Grez kiitos että otit tuon esille eli Netbeans auttaa minua koodaamisessa.

"..käyttämäni kehitysympäristöt kyllä täydentää esim. funktioiden nimet kun vähän sinne päin alkaa näpytellä ja kertoo mitkä parametrit sille pitäisi antaa.."

Jokatapauksessa yritän jatkossa olla esittämättä typeriä kysymyksiä, jotka voisin itse jotenkin selvittää. Ja luin juuri PDO:sta tämän joka auttoi valtavasti:

Mod. huom: Älä kopioi toisten tekstejä (varsinkaan noin pitkiä) vaan anna linkkejä.

Patrik Bexar: NextCall Pro Livescreen -näyttösovellus, kappale 2.6, PDO.

Crodesoft tietotekniikkablogi, PDO vs MySQLi

Metabolix [13.10.2012 18:46:26]

#

latenleffahylly kirjoitti:

Mutta oikeiden esimerkkien löytäminen on minulle vaikeinta. – – Usein teen niin että testi.php tiedostoon alan lähes tyhjästä rakentamaan jotain toimintoa ja jokaisen rivin jälkeen tutkin mitä koodi tulostaa.

Tämä johtuu varmasti siitä, että et ymmärrä koodia. Jos ymmärtäisit paremmin, saisit lähes kaikki vastauksesi suoraan Putkan oppaista ja voisit kirjoittaa kokonaisen sivun järkevästi kokeilematta joka välissä.

latenleffahylly kirjoitti:

Entä kun koodia on paljon, oppiiko ihminen muistamaan lukuisia eri rivejä?

Ei tarvitse muistaa "lukuisia eri rivejä", vaan tarvitsee muistaa alkeet ja osata soveltaa niitä. Miten esimerkiksi pystyt laskemaan lausekkeen 1+(2*3*4*5)/15-123/3+9? Et varmasti muista tätäkään riviä, mutta osaat laskea sen, koska ymmärrät numerot ja viisi merkintää: +, -, *, / ja sulut.

Ei tarvitse osata kuin parikymmentä tällaista yksinkertaista asiaa PHP:stä, niin pystyy jo ratkaisemaan koko PHP-haasteen – jos järki riittää. Järki onkin ohjelmoinnissa tärkeämpää kuin tieto. Mikään tietomäärä ei auta, jos sitä ei osaa käyttää. Tieto vain nopeuttaa ohjelmointia sitten, kun järki on päätellyt, mitä ylipäänsä pitäisi tehdä.

Ohjelmoinnissa – kuten myös matematiikassa – tarvitaan melko pieni määrä erilaisia merkintöjä ja sanoja verrattuna luonnolliseen kieleen, eli jos pystyy oppimaan kohtuullisesti vaikka ruotsia tai ranskaa, PHP:n ei pitäisi olla muistikapasiteetista kiinni. Uskon, että useimmilla oppimisen esteenä on nimenomaan puutteellinen ymmärrys.

latenleffahylly kirjoitti:

Tavallaan vaikeinta on hahmottaa se miten aloitatte koodaamaan tyhjälle tiedostolle.

Itse ainakin aloitan siitä, mitä on tarkoitus tehdä. Jos sivun pitää näyttää käyttäjän X kaikki tapahtumat, tarvitaan loogisesti ensin tietokantayhteys, sitten se käyttäjä X ja sitten tapahtumat, ja vasta sen jälkeen voi miettiä, miten ne tulostetaan HTML-muotoon. Yleensä on järkevää myös koodissa ensin hakea kaikki tiedot ja vasta sitten aloittaa HTML:n tulostaminen. Silmukoista tulee silloin lyhyempiä ja helpompia lukea.

latenleffahylly [13.10.2012 20:28:40]

#

Pahoittelut aikaisemman postaukseni aiheuttamasta vaivasta. (Jatkossa linkitän). Metabolix suurkiitokset rohkaisusta ja järkevästä lähestymistavasta koodaamiseen, tosi hienoa tekstiä ja hyvin pystyy ymmärtämään punaisen langan.

Tämä alla oleva koodi on omistettu alkemistille, grezille ja metabolixille, koska:

- teidän innoittamana koodasin tyhjästä tiedostosta alla olevan koodin
- käytin apuna putkan opasta (pdo)
- nyt tämän päivän aikana opin muistamaan rivejä koodia mm. "prepare", "execute", "fetch" jne.
- se miksi SQL-lauseissa käytän-> "AS" merkintää, on tulevaisuutta varten eli jos seuraavassa versiossa halutaankin jokin noista tiedoista nopeasti näkyville (tarve, varaus, jvTarve)
- kommentointi tyyli on erikoinen mutta omalle tasolleni täydellinen

VARAA TYÖVUORO LOMAKE:

<?php
if ($_SESSION['id']) {

  // 1.) tarve
  // haetaan tapahtuman tarve
  $kysely = $yhteys->prepare("SELECT SUM(tarve.tTarve) AS tarve
 				              FROM tapahtuma
							  JOIN tarve ON tapahtuma.T_Id = tarve.T_Id
						      WHERE tapahtuma.T_Id = ?");
  // suoritetaan kysely
  $kysely->execute(array($_GET["T_Id"]));
  // tarve
  $tarve = $kysely->fetch();


  // 2.) varaus
  // haetaan tapahtuman varausten määrä
	$kysely = $yhteys->prepare("SELECT COUNT(Tapahtuma_Id) AS varaus
						        FROM varaus
							    WHERE Tapahtuma_Id = ?");
	// suoritetaan kysely
  $kysely->execute(array($_GET["T_Id"]));
  // varaus
  $varaus = $kysely->fetch();

  // jos tarve ja varaus ovat identtiset-> linkkiä ei avata tapahtumat-sivulla
	if ($tarve[0] == $varaus[0]) {
		header('Location: index.php?sivu=tapahtumat');
	}


  // 3.) T_Id, tNimi
  // haetaan tapahtuman numero ja nimi
  $kysely = $yhteys->prepare("SELECT T_Id, tNimi
							  FROM tapahtuma
							  WHERE T_Id = ?");
	// suoritetaan kysely
	$kysely->execute(array($_GET["T_Id"]));
	// T_Id, tNimi
	$tieto = $kysely->fetch();


  // 4.) varausaika
  // date
  $date = mktime(0,0,0,date("m"),date("d"),date("Y"));

  // 5.) työvuoronvarauslomake
  // tyontekijanumero, chk[], T_Id, tNimi, date
  echo '<div class="container">
		  <h2>&larr; <a href="index.php?sivu=tapahtumat">Takaisin</a><span class="vali">|</span>' . htmlspecialchars($tieto["tNimi"]) . '</h2>
		</div>';

  echo '<div class="container">
		  <form method="post" action="index.php?sivu=varaa_chk" class="varaaLomake" id="varaa">
			<dl>
			  <dd>
				<input type="text" name="tyontekijanumero" id="tarkistus" maxlength="4" class="tekstikentta" />
                <input type="submit" name="submit" value="varaa työvuoro &raquo;" class="painike" />
              </dd>
			  <dd>
				<input type="checkbox" name="chk[]" checked="checked" /> Hyväksyn yrityksen <a href="#">käyttäjäehdot</a> ja <a href="#">työohjeet</a>
              </dd>
                <input type="hidden" name="T_Id" value="' . $tieto["T_Id"] . '" />
                <input type="hidden" name="tNimi" value="' . htmlspecialchars($tieto["tNimi"]) . '" />
                <input type="hidden" name="date" value="' . date("Y-m-d", $date) . '" />
            </dl>
          </form>
        </div>';


  // 6.) lisäinfo
  // järjestyksenvalvojien tarveluku
	$kysely = $yhteys->prepare("SELECT tTarve AS jvTarve
								FROM tarve
								WHERE T_Id=?
								AND R_Id=1");
	// suoritetaan kysely
	$kysely->execute(array($_GET["T_Id"]));
	// jvTarve
	$jvTarve = $kysely->fetch();
	// jos haettu luku on nolla näytetään lisäinfo
	if ($jvTarve[0] == 0) {
		echo "<div class='container'><h2><span class='red'>Huom! Vain toimintaryhmä</span></h2></div>";
  }

	// extra tyylit2
	include("assets/html/extrastyle2.html");

} else {
	echo '<h1>Please, <a href="index.php?sivu=etusivu">login</a> kirjaudu sisään nähdäksesi sisältö!</h1>';
}
?>

- toivottavasti koodista on hyötyä aloittelijoille, toivon ettei ylläpito poista tätä malliesimerkkiä. 1. puhtaalta pöydältä koodattu tiedostoni.

Lisäys:

Itseasiassa ainoa joka ei vielä toimi aina oikein on HEADER LOCATION. Sanoo että header on jo lähetetty.. tutkin asiaa, miten kannattaisi parhaiten ohjata käyttäjä takaisin sille sivulle missä hän on.

En avaa linkkiä jos tapahtuma jo buugattu täyteen!

Metabolix [13.10.2012 20:48:49]

#

\o/ Hurraa!

Yksi helppo ratkaisu header-ongelmaan on, että lisäät ennen HTML-koodin alkua (eli ennen riviä <!DOCTYPE html>) PHP-koodin ob_start(). Pidemmän päälle parempi ratkaisu on, että muutat koodin rakennetta niin, että kaikki HTML-koodi ihan <!DOCTYPE html> -rivistä alkaen tulostetaan vasta myöhemmin, kun header-funktiota ei enää tarvita.

latenleffahylly [13.10.2012 21:46:36]

#

Kiitos, tutkin asiaa. Eli tuo pidemmän päälle ratkaisu.. Valitettavasti en ihan tajunnut. Minulla nyt index.php sivu jossa yhdistän header.php sivun ja luettelen php sisältö sivut.

Lisäys: Välillä minulla on useita header funktioita koodin joukossa jotka ohjaavat erilaisille virhesivuille.

latenleffahylly [14.10.2012 10:47:39]

#

Tämä lienee mahdoton omalla kohdallani koska käytän komentotulkkia-> "svn" ja "Apache" kehitysympäristöä.

<?php ob_start() ?>

Some web servers (e.g. Apache) change the working directory of a script when calling the callback function. You can change it back by e.g. chdir(dirname($_SERVER['SCRIPT_FILENAME'])) in the callback function.

- Eli käsitän että koska käytän SVN varmuuskopiointi menetelmään jatkuvasti koodatessa, niin tuo funktio saattaisi sekoittaa hakemistoja jotenkin. Muutenkin olisi kiva tietää että jos koodin joukossa on useita HEADER LOCATION merkintöjä niin onko se ylipäätään hyvä tapa. Pitäisikö minun enemmän yrittää tehdä JavaScript validatiota:

eli lomakkeella, tee näin, tee noin, muista se, muista tuo jne. JA Ennen kaikkea "pakottaa" käyttäjä käyttämään JavaScriptiä. Minusta sellaiset web-sivut olisivat mukavat että kaikkien pitää käyttää JS koska silloin käyttömukavuus hyvä-> mm. virheilmoitukset.

Metabolix [14.10.2012 11:19:02]

#

Mainitsemasi kohta ob_start-funktino dokumentaatiosta ei vaikuta sinuun millään tavalla, ja varsinkaan se ei missään tilanteessa sekoita mitään fyysisiä tiedostoja vaan enintään vaihtaa työhakemistoa, siis aivan kuin vaikka itse tuplaklikkaisit kansiokuvaketta Windowissa.

Älä koskaan tee tarkistuksia pelkästään JavaScriptilla, koska hakkeri voi silloin ohittaa ne. Voit tehdä tarkistukset sekä JS:llä että PHP:llä, jolloin käyttömukavuus on JS-käyttäjille hyvä mutta myös muilla kaikki toimii oikein.

latenleffahylly kirjoitti:

Minulla nyt index.php sivu jossa yhdistän header.php sivun ja luettelen php sisältö sivut.

Se on huono ratkaisu monestakin syystä (ellei käytetä paljon hienompaa tekniikkaa kuin sinulla nyt). Usein on fiksumpaa käyttää erillisiä sivuja, joiden osoitteet ovat järkeviä (esim. ei index.php?sivu=abc vaan suoraan abc.php). Sivut voi silloin koota vaikka näin:

<?php
// Includella haetaan kaikki funktiot, tietokantayhteys ym.
require_once "funktiot.php";

// Haetaan sivun tiedot tietokannasta, kuten äsken puhuttiin.
// Tähän väliin kuuluvat myös tarkistukset, header-jutut jne.
$tieto = KYSELYITÄ_TIETOKANNASTA;

// Kun tiedot on haettu, tulostetaan sivun alku, sisältö ja loppu.
sivun_alku($otsikko);

echo "<p>Sivun sisältö</p>";

sivun_loppu();

Tässä ei tule mitään ongelmia header-funktion kanssa, koska sitä kutsutaan pelkästään ennen HTML-koodin tulostamista.

Nuo tulostusfunktiot voisivat olla idealtaan tällaiset:

<?php
function sivun_alku($otsikko) {
	echo "<!DOCTYPE html>";
	$otsikko = htmlspecialchars($otsikko);
	echo "<html><head><title>{$otsikko}</title></head>";
	echo "<body>";
}
function sivun_loppu() {
	echo "</body></html>";
}

latenleffahylly [14.10.2012 11:37:46]

#

Huh huh.. olen opetellut hyvin erilaisen tavan koska minulle vakuuteltiin että se on hyvä tapa. Onko lainkaan mahdollista että Ohjelmointiputka tekisi mainitsemasi mallin mukaisen "Näin koodaat järkevän web-sivu rakenteen" -oppaan?

Mielestäni kaikki mainitsemasi pitäisi kuulua ohjelmoinnin perusteisiin. Toisaalta jos tuo kaikki on korkeammantason koodausta niin silloin on itse tajuttava.

Tarkoitan sitä, että opettelen PDO:n käyttöä näistä syistä:

- Ohjelmointiputka suosittelee
- PHP kirjassa törmäsin PDO:hon
- Haluan oppia nykyaikaisimman tavan

Nyt jos täällä opetettaisiin moderni ja hieno tapa rakentaa PHP-sivu, niin se olisi hyvä. Tavallaan ADVANCED opas. Tarkoitan myös sitä että minua turhauttaa kaikista eniten se että haluan luottaa 100% neuvoosi. Minusta tuo tapa on hyvä ja varmasti toimiva. Mutta kohta joku kertoo ei noin jne.

Jos Ohjelmointiputkan oppaassa olisi tuollainen jakso sen voisi ottaa käyttöön luotettvasti, kuten PDO. Miksi ikänä tuhlasin koulussa aikaa opetellakseni MySQL-tavan, työssä MySQLi-tavan ja vasta nyt PDO-tavan.

MIELIPITEITÄ:

Webmaailman tulisi olla yhtenäinen. Meillä pitäisi olla yhteiset standardit jota kaikki haluaisivat noudattaa. Meillä olisi näihin "perus" asioihin valmiit mallit, mutta kaiken sen jälkeen pitäisi itse syventyä oppimaan.

Jos opettelen mainitsemasi tavan niin olisi vielä hienompaa jos se olisi standardi tapa PHP:ssä. Siis kunnon perustelujen kanssa. Tuntuu että taas opettelen jotain välitapaa matkalla oikeaan tapaan tehdä asioita. No.. kommenttini varmaan kertoo että olen noviisi. Mutta näin ajattelen reilu 3 vuotta vanhana koodarina, joka osaa HTML,CSS.. ymmärtää PHP,MySQL.. soveltaa omiin projekteihin JavaScript,(jQuery),(Ajax),(Photoshop CS 6).. huoh..

Metabolix [14.10.2012 15:38:45]

#

latenleffahylly kirjoitti:

Huh huh.. olen opetellut hyvin erilaisen tavan koska minulle vakuuteltiin että se on hyvä tapa.

Missä niin on vakuutettu?

lainaus:

Onko lainkaan mahdollista että Ohjelmointiputka tekisi mainitsemasi mallin mukaisen "Näin koodaat järkevän web-sivu rakenteen" -oppaan?

PHP-oppaassa käytetään hieman vastaavaa tapaa, mutta oppaan kirjoittajan mieltymysten takia siinä käytetään rumasti include-komentoa eikä funktioita. (Alla lisää tämän ongelmista.)

latenleffahylly kirjoitti:

Jos opettelen mainitsemasi tavan niin olisi vielä hienompaa jos se olisi standardi tapa PHP:ssä. Siis kunnon perustelujen kanssa.

Ei ole mitään yhtä oikeaa tapaa tehdä asioita. Eri tavoissa on erilaisia hyviä puolia ja erilaisia ongelmia, tosin aivan huonoimpien tapojen jälkeen "hyvät puolet" ovat uusia ominaisuuksia ja "huonot puolet" ovat koodin mutkikkuus verrattuna edelliseen portaaseen ja puuttuvat ominaisuudet verrattuna vielä hienompaan tapaan.

Esimerkiksi tuon aiemman tapasi eräs ongelma on, että header-funktiota ei pysty helposti käyttämään. Lisäksi koodi on turhan mutkikas ja siinä on usein vakavia tietoturva-aukkoja. En keksi tästä tavasta oikeastaan yhtään hyvää puolta.

PHP-oppaan include-tavan eräs ongelma on, että yla.php voi vahingossa muokata kaikkia sivun muuttujia, jolloin voi tulla ongelmia, joita on vaikea löytää. Toisaalta tämä tapa on erittäin yksinkertainen toteuttaa, kuten PHP-oppaasta nähdään.

Ehdottamiini funktioihin ei liity näitä ongelmia, ja ne on myös helppo toteuttaa. Itse asiassa nyt ollaan minun mielestäni siinä vaiheessa, jossa ainoa "ongelma" on, että joskus tarvitaan paljon enemmän ominaisuuksia.

Toki funktiolle voi lisätä paljon parametreja, mutta se on vaikeaa. Toinen ratkaisu on käyttää globaaleja muuttujia tai muuta mystistä, mutta se on taas askel taaskepäin: tulee samoja ongelmia kuin äsken include-komennon kanssa. Helpoin ratkaisu onkin vaihtaa funktiot luokkaan ja viestiä jäsenmuuttujien avulla (tai luomalla uusia alaluokkia):

$sivupohja = new Sivupohja();
$sivupohja->jokin_asetus = "jokin arvo";
$sivupohja->aloita("Otsikko"); // sivun_alku("Otsikko");
echo "Sisältö";
$sivupohja->lopeta(); // sivun_loppu();

Tässä tavassa on taas entistä vähemmän puutteita. Toisaalta koodikin on jälleen vähän pidempi. On olemassa vielä monia hienompia tapoja, joissa kussakin on entistä enemmän ominaisuuksia mutta myös omat kiemuransa.

Suunnittelussa pitää tehdä valintoja sen mukaan, mitä ominaisuuksia tarvitaan. Jos tarkoitus on tehdä vain yksi ainoa sivu, on ihan turha hienostella, vaan voi kirjoittaa sivun yhteen tiedostoon ihan mielensä mukaan. Toisaalta esimerkiksi monikielisyys dynaamisesssa sovelluksessa on ominaisuus, joka vaatii aivan erilaisen lähestymistavan; silloin nämä yksinkertaiset yläosa-alaosa-viritelmät voi saman tien heittää roskakoriin.

latenleffahylly [14.10.2012 18:28:24]

#

Metabolix kirjoitti:

Toisaalta esimerkiksi monikielisyys dynaamisesssa sovelluksessa on ominaisuus, joka vaatii aivan erilaisen lähestymistavan; silloin nämä yksinkertaiset yläosa-alaosa-viritelmät voi saman tien heittää roskakoriin.

Käsitykseni mukaan ammattilainen välttää kirjoittamasta eri koodi kieliä samaan. Mutta yhdistää kuitenkin koodia Includen avulla.. vai kutsutaanko sittenkin jotain funktiota. Entä luokat (olio-ohjelmointi).

Nämä eivät olleet kysymyksiä, olen noviisi, mutta aion opetella PHP:tä paljon korkeammalle tasolle. Kiitos ideoistasi Mb. Kysyn vielä nopeasti yhden jutun, onko standardi tapaa dokumentoida php-tiedoston alussa? Nyt minulla esim:

	  /** DOKUMENTAATIO:
	   *
	   * YLEISTÄ:
	   * Työntekijä varaa työvuoron, Tapahtumat-sivulla valitsemaansa tapahtumaan.
	   *
	   * TIEDOSTOT:
	   * tapahtumat.php---> varaa.php---> varaa_chk---> varaa_ok.php---> (tapahtumat.php)
	   *
	   * TÄRKEÄÄ:
	   * Käydään läpi työvuoronvarauslomakkeelta lähetetty tieto. Huomioitavia asioita ovat
	   * mm. työntekijän ryhmä ja työntekijänumero joka syötetään lomakkeella. Työvuoroa
	   * varatessa käytetään apuna lisäksi tapahtuman id-numeroa sekä istuntomuuttujiin
	   * tallennettua tietoa.
	   *
	   * RYHMÄT:
       * ...
	   *
	   * SISÄLTÖ:
	   * A.) Työntekijän tunnistaminen
	   * B.) Verrataan tarve <---> varaus
	   * C.) Tarkistetaan onko työntekijä jo varannut työvuoron
	   * ...
	   *
	   * MUUTA:

Metabolix [14.10.2012 22:20:29]

#

latenleffahylly kirjoitti:

Käsitykseni mukaan ammattilainen välttää kirjoittamasta eri koodi kieliä samaan.

Olet aivan oikeassa, ja juuri siksi "monikielisyys" tarkoittaakin luonnollisia kieliä kuten suomi, ruotsi ja englanti. Jos jostain syystä puhuttaisiin monesta eri ohjelmointikielestä, tämä varmasti myös sanottaisiin selvästi.

latenleffahylly kirjoitti:

onko standardi tapaa dokumentoida php-tiedoston alussa?

Yleisesti käytettyjä apuvälineitä ovat phpDocumentor ja Doxygen, jotka vaativat omat vakiintuneet merkintätapansa.

latenleffahylly [15.10.2012 08:44:54]

#

Okei.. hyvä. Tutkin tuon Doxygenin. Tällä hetkellä käyn kaikki tiedostot läpi jaa muutan PDO-muotoon. Sitten tutkin connect.php tiedoston ja laitan sinne vain 1 tavan yhdistää tietokantaan, en 3 eri tapaa.

Lisäys:

NOTICE:

Onko opasta missä kerrotaan miten indeksi määritetään, eli miten pääsen eroon Notice ilmoituksista?

Notice: Undefined variable: id in /tapahtumapalvelu/tapahtumat.php on line 56

dartvaneri [15.10.2012 11:39:09]

#

latenleffahylly kirjoitti:

Tällä hetkellä käyn kaikki tiedostot läpi jaa muutan PDO-muotoon.

Jep. Tuossa oli aikasemmin puhetta siitä, että ne koodit/koodirivit tulevat jossain vaiheessa selkäytimestä. Lisäisin(ellei filtterini sitä ohittanut) tähän, että selkäytimeen nämä tulevat ainostaan toistojen avulla.


Edit. 
Jaa, näytti tuolla olevan kohta, jossa Alchemist sivusi asiaa.

The Alchemist kirjoitti:

Tuollaisia yksinkertaisia harjoitteita toistat tasan niin kauan, et yhtään vähempää, kunnes ymmärrät täydellisesti, mitä missäkin kohtaa tapahtuu ja kunnes osaat PDO:n rajapinnan riittävän hyvin.

latenleffahylly kirjoitti:

Lisäys:

NOTICE:

Onko opasta missä kerrotaan miten indeksi määritetään, eli miten pääsen eroon Notice ilmoituksista?

Notice: Undefined variable: id in /tapahtumapalvelu/tapahtumat.php on line 56

On yksi tapa päästä tuosta eroon; määrittelet muuttujan id.

Edit. Ja jos tarkoitat, että miten saisit virheilmoitukset pois näkyvistä, niin ottamalla sen koodin alusta pois, joka näyttää ne virheilmoitukset.
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=php_18#virheilmoitukset

<?php
ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL | E_STRICT);
// koodi tulee tähän
?>

qeijo [15.10.2012 12:17:37]

#

latenleffahylly kirjoitti:

Onko opasta missä kerrotaan miten indeksi määritetään, eli miten pääsen eroon Notice ilmoituksista?

Ei ainakaan kannata piilottaa virheilmoituksia vielä kehitysvaiheessa.

if(isset($id)) {
     //Asetettu on
}
if(!isset($id)) {
     //Ei asetettu
}
$id = isset($id) ? $id : "oletusarvo"; //Lisätään oletusarvo jos ei ole vielä asetettu

The Alchemist [15.10.2012 16:58:49]

#

latenleffahylly kirjoitti:

Onko opasta missä kerrotaan miten indeksi määritetään, eli miten pääsen eroon Notice ilmoituksista?

Notice: Undefined variable: id in /tapahtumapalvelu/tapahtumat.php on line 56

Ei ole. Asia on hyvin yksinkertainen: et saa yrittää lukea muuttujaa tai taulukon indeksiä, johon et ole ensin kirjoittanut jotain. Tämä olisi selvinnyt yksinkertaisesti googlettamalla tuolla virheilmoituksella.

<?php

$data = array(
  'a' => 1,
  'b' => 2,
);

// Väärin, koska indeksiä 'c' ei ole olemassa.
$c = $data['c'];

// Väärin, koska muuttujaa $foo ei ole vielä esitelty.
print $foo;

// Oikein:
$data['c'] = 'testi';
$c = $data['c'];

$foo = 'bar';
print $foo;

Noin yksinkertaista. Tässä vielä hieman hämärämpiä esimerkkejä:

<?php
$data = array(
  'a' => array(),
);

// Väärin, koska indeksiä 'b' ei ole alustettu.
$data['b'][] = 'foo';

// Väärin, koska muuttujaa $foo ei ole vielä olemassa.
$foo[] = 'bar';

// Oikein:
$data['b'] = array();
$data['b'][] = 'foo';

$foo = array();
$foo[] = 'bar';

// Ei heitä noticea vaikkei $data-muuttujaa ole olemassa ensimmäisellä
// kierroksella, koska kirjoitettava indeksi on määrätty.
// Ei ole silti hyvä tapa olla alustamatta muuttujaa silmukan edessä,
// koska koodista ei välttämättä käy ilmi, onko $data-muuttuja määritetty
// jo aiemmin vai ei. Lisäksi taulukkoon voi jäädä vanhaa roskaa, jos se
// olikin jo olemassa...
for ($i = 0; $i < 10; $i++) {
  $foobar[$i] = 'a';
}

print_r($foobar);

// Tämäkään ei heitä noticea, vaikkei $doo-muuttujaa saati sen alitaulukoita
// ole olemassa vielä.
$doo['a']['b']['c'] = 'd';

Edellä mainitut asiat pätevät myös funktioiden kanssa:

<?php

// Heittää noticea, jos $_GET-taulukossa ei olekaan indeksiä 'array'.
if (is_array($_GET['array'])) { ... }

// Isset() ja empty() ovat erikoistapauksia, koska ne eivät ole oikeasti
// funktioita vaan sekavia häröpalloja.
// Näistä ehtolauseista ei synny noticea, koska PHP ei käsittele ollenkaan
// &&-operaattorin oikeaa puolta, mikäli vasen puoli palauttaa FALSE.
if (isset($_GET['array']) && is_array($_GET['array'])) { ... }
if (!empty($_GET['array']) && is_array($_GET['array'])) { ... }

// Tämäkään ei aiheuta noticea vaikkei $foo-muuttujaa edes olisi olemassa:
if (isset($foo['a']['b']['c'])) { ... }

// Tästäkään ei tule virhettä, vaikka koodi on aivan järjetön:
$lol = null;
var_dump(isset($lol->boo));

// Tästä tulee noticea:
var_dump($lol->boo);

// Oikein:
$lol = new stdClass();
$lol->boo = 'sadasd';
var_dump($lol->boo);

Poikkeuksia edelliseen ovat ne funktioiden parametrit, jotka välitetään funktiolle VIITTAUKSINA...

<?php

// Ei aiheuta noticea, koska kolmas parametri välitetään viittauksena.
// (Katso funktion dokumentaatio.)
preg_match('/a/', 'aakkonen', $match);
print_r($match);

Lisään vielä tuohon Qeijon isset-esimerkkiin sen, että tuollaista ei sitten saa alkaa kirjoittaa esim. GET- tai POST-muuttujista lukiessa. Koodista tulee vain rumaa roskaa. Koodaa ennemmin oma funktiosi:

<?php
// VÄÄRIN:
$a = isset($_GET['a']) ? $_GET['a'] : null;
$b = isset($_GET['b']) ? $_GET['b'] : null;
$c = isset($_POST['c']) ? $_POST['c'] : array();

// Oikein:
function array_get($array, $key, $default = null) {
  return array_key_exists($key, $array) ? $array[$key] : $default;
}

$a = array_get($_GET, 'a');
$b = array_get($_GET, 'b');
$data = array_get($_POST, 'data', array());

Koodi on muutenkin laadultaan erittäin heikkoa, mikäli joudut usein tarkistelemaan muuttujien olemassaoloa isset():llä. Yksittäistapauksissa se käynee laiskan miehen ratkaisuna, mutta pääsääntöisesti koodista vain tulee yhtä sotkua redundanttien if-lausekkeiden takia.

latenleffahylly [15.10.2012 18:41:09]

#

Valtavasti tietoa, kiitos siitä. Käsitykseni mukaan Notice on ihan minimi tason virhe, mutta silti "pieni" tietoturva riski. Tavallaan jos antaa Noticejen olla niin välttyisi siltä että rikkoo koodiin. VArsinkin kun muuttujia useita erilaisia.

Toisaalta toivon aikanani pystyväni pääsemään huomautuksista eroon. Puhtaan ja standardin mukaisen koodin kirjoittaminen on nytkin tavoitteeni. Siksi opettelen PHP:tä ja esim. käyn läpi css-tiedostoja vai lisätäkseni välin sinne tai tänne. Tai kirjoittaamaan parametreja aakkosjärjestyksessä. Html5 uudat elementit ovat myös kiinnostavia.

alkemisti, geijo ja dartvaneri kiitos avusta. Virheilmotuksien osalta homma hanskassa. Nyt ne ovat tilassa: "on", välillä otan pois: "off" ...tällä hetkellä (vain) Notice huomautuksia.

Macro [15.10.2012 19:36:36]

#

Ei koodi voi silloin toimia oikein, jos tulee virheilmoituksia.

Missä tilanteessa koitat käyttää muuttujaa $id, jos et ole edes alustanut sitä? Tai pahemmassa tapauksessa, edes esitellyt sitä?

<?php
echo $id; // miksei tää toimi!??!?!
?>

Ethän voi syödä omenaakaan ennen kuin olet sellaisen jostain saanut...

The Alchemist [15.10.2012 21:17:16]

#

Ei se mikään tietoturvariski ole mutta merkki huonosta koodista ja huonosta koodarista.

Grez [15.10.2012 21:22:54]

#

No voi se tietoturvariskikin olla jos käyttää vanhempaa kuin 4.2.0 PHP:tä oletusasetuksilla tai vanhempaa kuin 5.4.0 niin että register_globals on päällä.

Metabolix [15.10.2012 21:29:54]

#

Macron omenaesimerkin mukainen tyypillinen tilanne on tämä:

if (haluat_omenan()) {
	$omena = osta_omena();
}
syö($omena); // Virhe! Omenaa ei ole, jos sitä ei äsken ostettu.

Oikea ratkaisu on siis miettiä jokaisen if-lauseen kohdalla myös, mitä tapahtuu, jos lause ei toteudu, ja tarvitaanko ehkä else-lohko.

The Alchemist, esimerkkisi ovat ohjeina hyviä ja oletuksiltaan järkeviä, mutta tarkkaan ottaen PHP:ssä on laillista sijoittaa arvoja myös olemattomaan taulukkoon, eli jopa seuraava koodi toimii:

unset($data);
$data['b'][] = "teksti";

PHP:llä on taas jokin ihan oma logiikkansa: $data saa olla array, null, false tai "", mutta silti 0, "x" ja true eivät kelpaa.

En tietenkään suosittele alustamattoman taulukon käyttöä, ja register_globals aiheuttaa myös siinä tietoturvariskin, vaikka mitään varoitusta ei näy.

The Alchemist [15.10.2012 23:47:53]

#

Minä nähtävästi ajattelen asioista eri skopella. Ei ole mikään tietoturvariski yrittää lukea taulukoita tai muuttujia, jotka eivät ole olemassa. Ne keissit ovat kuitenkin osajoukko suurempaa ongelmaa, päätöntä muuttujien hallintaa, josta taas voi seurata ihan mitä tahansa.

Listasin tuohon nyt vaan asioita, jotka tulivat sillä hetkellä mieleen. Ja se on kokonaisuudessaan oikeastaan hyvä esimerkki siitä, mitä tarkoitin asioiden ymmärtämisellä aikaisemmin. Minun ei tarvinnu lukea mitään manuskaa tai kysyä apua foorumilla tai edes googlettaa asioista. Tiesin nuo jo vanhastaan, koska en ole pelkästään häseltänyt vaan opetellut ja oppinut käyttämään php:tä. Suurinta osaa en edes tarkistanut.

Noh, näköjään yksi ensimmäisistä keisseistä olikin heti väärin.

Grez [16.10.2012 00:05:45]

#

The Alchemist kirjoitti:

Ei ole mikään tietoturvariski yrittää lukea taulukoita tai muuttujia, jotka eivät ole olemassa.

Tietoturvariski tuleekin siitä, kun luetaan muuttujaa olettaen, että sitä ei ole olemassa. Eli "hyödynnetään" PHP:n ominaisuutta, että määrittelemätön muuttuja on tyhjä ja noticet voi kytkeä pois päältä.

Eli kunnollisten alustusten ja tarkistusten puuttuessa ja ympäristön ominaisuuksia hyödyntäen pystytään syöttämään koodiin sellaisia tarkistamattomia lähtöarvoja, joita kehittäjä ei ole tullut ajatelleeksi, ja näin saadaan ohjelma suorittamaan toimintoja, joita kehittäjä ei ole tarkoittanut olevan mahdollista suorittaa. Mielestäni tuo istuu aika hyvin tietoturva-aukon määritelmään.

Tietenkään jokainen alustamaton / tarkistamaton muuttuja ei automaattisesti ole tietoturva-aukko, mutta on huomattavasti työläämpää varmistaa että siitä ei tule aukko, kuin vaan alustaa tai tarkistaa se. Eli sikäli alustamattomuus on turha (tietoturva)riski sen lisäksi että se on mahdollisesti turha muidenkin ongelmien lähde.

Itsehän koodailen pääsääntöisesti kielellä, jossa ohjelma ei edes käänny jos yritetään lukea alustamatonta muuttujaa, ja pidän sitä ihan positiivisena asiana.

The Alchemist [16.10.2012 07:32:22]

#

En ole mikään muinaisten kielten asiantuntija, mutta minulle ei tule mieleen toista likimain yhtä yleistä kieltä, jossa säännöt muuttujien suhteen olisivat yhtä tyhmät kuin php:ssä.

Välillä se puree niin kovaa...

<?php
$data = range(1, 10);
$foo = range('A', 'E');

foreach ($data as &$row) {
    // pass
}

foreach ($foo as $row) {
    // pass
}

print_r($data);

/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => E
)
*/

Metabolix [16.10.2012 09:20:33]

#

The Alchemist kirjoitti:

En ole mikään muinaisten kielten asiantuntija, mutta minulle ei tule mieleen toista likimain yhtä yleistä kieltä, jossa säännöt muuttujien suhteen olisivat yhtä tyhmät kuin php:ssä.

Esimerkiksi Perl on aika lähellä, ja sehän oli aiemmin hyvin yleinen nettiohjelmoinnissa.

The Alchemist [16.10.2012 10:06:19]

#

Perl onkin se kieli, jota tuntemaan opittuani lopetin haukkumasta php:n kehittäjiä tyhmiksi.

latenleffahylly [16.10.2012 13:11:08]

#

Alkemistille terveisiä että Noticet eivät tule omasta kirjoittamasta koodistani vaan jQuery kirjautumispaneelista, jonka halusin liittää ohjelmaani.

Mutta toisaalta se ei ole mikään selitys ja siksi pyysin apua siihen. En muutenkaan jaksaisi enää kuulla miksi haukut minua koko ajan. Yritän oppia uutta ja tiedän että yritän minulle liian vaikeita asioita. Asenteesi on kuitenkin negatiivinen kaiken suhteen mitä kirjoitan.

Negatiivinen alkemisti kirjoitti:

Ei se mikään tietoturvariski ole mutta merkki huonosta koodista ja huonosta koodarista.

qeijo [16.10.2012 14:06:15]

#

latenleffahylly kirjoitti:

En muutenkaan jaksaisi enää kuulla miksi haukut minua koko ajan. Yritän oppia uutta ja tiedän että yritän minulle liian vaikeita asioita. Asenteesi on kuitenkin negatiivinen kaiken suhteen mitä kirjoitan.

Negatiivinen alkemisti kirjoitti:

Ei se mikään tietoturvariski ole mutta merkki huonosta koodista ja huonosta koodarista.

Luulen että The Alchemist tarkoitti tuossa yleisellä tasolla ei niinkään juuri sinua.

latenleffahylly [16.10.2012 15:45:34]

#

Voi olla mutta hän minua haukkuu, vaikka yritän paremmaksi koodariksi oikeastaan developeriksi, päivittäin. Sanotaan nyt esim. tuo PDO..

pelkkien Ohjelmointiputkan oppaiden avulla olen saanut paljon aikaan. En vain copy pastaa vaan osaan ulkoa rivejä, useita rivejä - ja ennen kaikkea ymmärrän mitä kussakin kohtaa tapahtuu. Esim. käytän välillä bindParam -menetelmää mutta jos ongelmia siirryn käyttämään arrayta, riippuen tilanteesta. Tämän oivalsin kun luin teoriaa (iPad, php-kirja). Eli ihan vajaassa viikossa olen tässä asiassa päässyt eteenpäin.

Siinä negatiivinen alkemisti on oikeassa, että minun pitää mennä tasolle-> noviisi ja opetella ihan perusteet ja vähitelleen tehdä vaikeampia tapoja. Toisaalta toinen tapa on tehdä itselle niin vaikeita projekteja että on pakko oppia uusia menetelmiä ja opetella HC koodausta.. no juu..

Itse opin vain toistojen kautta ja sillä että tekemäni projekti on kiinnostava eli olen sen kanssa tekemisissä joka päivä. Kiitos kuitenkin kaikesta avusta, sitä on ollut todella paljon. Nyt aina ennen kuin kysyn - yritän ratkaista tehtävän itse eli kysyn ihan vasta lopussa tai pikemminkin periaatteita miten jotain asiaa kannattaisi lähteä ratkaisemaan. kiitän..

Grez [16.10.2012 16:08:31]

#

latenleffahylly kirjoitti:

En vain copy pastaa vaan osaan ulkoa rivejä, useita rivejä - ja ennen kaikkea ymmärrän mitä kussakin kohtaa tapahtuu.

No tuo nyt ei ole mikään meriitti että osaa rivejä ulkoa, mutta toisaalta se on jos ymmärtää mitä kussakin kohtaa tapahtuu. Se että muistaa rivejä ulkoa viittaisi juuri copy&pastaamiseen.

Eihän kirjailijakaan kehu että hän osaa useita rivejä ulkoa omasta tai toisen kirjasta ja pidä sitä jonain kirjailijan laadun mittarina.

"Arthur perääntyi hermostuneena. Hän nyki partaansa ja kauhistui"
Kyllä musta nyt tulee uusi Douglas Adams kun muistan tuon ulkoa...

Sori nyt että tartuin tällaiseen. Hämää vaan niin vietävästi kun puhutaan koodaamisesta ja ulkoa opettelusta samassa kappaleessa. Ehkä et tarkoittanut että "osaat ulkoa" vaan että "osaat ilman muualta katsomista itse" kirjoittaa useita rivejä koodia.

Mielestäni metabolixin esimerkki lausekkeesta "1+(2*3*4*5)/15-123/3+9" oli erittäin osuva. Olisi hirveän raskasta opetella ulkoa että tuo tarkoittaa -23 ja jokainen muu mahdollinen lasku erikseen ulkoa, kun järkevämpää olisi opetella ne laskusäännöt ja logiikka niiden takana.

The Alchemist [16.10.2012 17:37:35]

#

Minä olen kylmä ja kyyninen mutten mielestäni kovin usein täällä ketään suoranaisesti hauku. Copy-paste-koodariksi kutsuminen ei vielä pilkkaamisen kriteereitä täytä.

latenleffahylly kirjoitti:

pelkkien Ohjelmointiputkan oppaiden avulla olen saanut paljon aikaan. En vain copy pastaa vaan osaan ulkoa rivejä, useita rivejä - ja ennen kaikkea ymmärrän mitä kussakin kohtaa tapahtuu. Esim. käytän välillä bindParam -menetelmää mutta jos ongelmia siirryn käyttämään arrayta, riippuen tilanteesta. Tämän oivalsin kun luin teoriaa (iPad, php-kirja). Eli ihan vajaassa viikossa olen tässä asiassa päässyt eteenpäin.

Tämä on juuri se ongelma, mikä sinun pitäisi taklata. Et keskity opettelemaan mitään kunnolla vaan häsellät omiasi koko ajan. PDO:n oppimiseen ei mene viikkoja vaan muutama tunti, kun siihen keskittyy sen muutaman tunnin ajan.

Jos häsellät kaikkea muuta siinä ohessa, niin et opi PDO:ta - kuten myönnät käyneen - etkä opi mitään muutakaan. Josset ymmärrä perusteita, niin minkään näihin perusteisiin nojaavan monimutkaisemman asian oppiminen on lähes mahdotonta.

latenleffahylly [16.10.2012 18:20:49]

#

Mitä tarkoitat näillä perusteilla? Tulee sellainen olo että lähestyn koodausta, php koodausta, jotenkin ihan väärällä tavalla.. Itse ajattelen että on esim. Web-sivut, jossa on lomake, siihen syötetään tietoa, tieto tallennetaan tietokantaan ja tulostetaan vaikkapa ylläpitäjän nähtäväksi.

Nämä kaikki vaiheet mielestäni muodostavat koodaamisen idean. Eli tehdä jotain, jokin prosessi.

Onko kyse siitä että minun pitää ajatella/ toimia näin?

1.) jaa prosessi pieniin osiin (tehtäviin)
2.) mieti järkevä tapa toteuttaa prosessi, työvaiheet
3.) huomioi ympäristö
4.) käyttäjät
5.) tietoturva
6.) suunnittele tietokanta, taulut jne.

Pitääkö tämä kaikki osata koodata päässä alusta loppuun..? Tavallaan voisin kokeilla, mutta luulen että jotain osia en .. Siis tietäisi miten koodata tai mitä atribuutteja mihinkin kohtaan tulee.

Kun rakennan tietokannan tauluja ja niiden yhteyksiä katson usein mallia varmuuden vuoksi. Html lomakkeen rungon otan usein mallina vaikka osaisinkin 90% siitä itse koodata.

Pdo tyylillä osaan hakea ja tallentaa lähes kaiken tiedon, mutta toisaalta olisiko parempi rakentaa jokin funktio jota vain kutsutaan.. Eli tarkoitan vain että haluan oppia koodaamaan. Laitoin esimerkki koodini, mutta kukaan ei ole sanonut että siinä olisi mitään hyvää tai että näin juuri kannattaa koodata?

Pyytäisin että kertoisitte mitä teen väärin. Noin 3 vuotta sitten en osannut koodata mitään, en yhtäkään tagia. Nyt osaan tehdä jotain: php, javascript, jquery, ajax, sql, mysql, html, css... Harmittaa se että miksen voisi oppia vuodessa aivan uudelle tasolle.. Minulla on jokin perusvika jota toistan ja siksi en opi..?

Pitäisikö koodata jokin ohjelma joka arpoo lottorivin ja kolme lisänumeroa esim? (Tämä ei ole vitsi)

qeijo [16.10.2012 18:25:51]

#

Voi mamma och pappa tätä keskustelua. "Haluan sitä ja uskon tätä..",
ei kukaan voi opettaa porsaalle hevosten estehyppelyä.

latenleffahylly [16.10.2012 19:12:59]

#

Geijolle huomautus, käyn juuri läpi mitä on ohjelmointi aluetta ja sitten oppaisiin. Aloitan ihan perusteista ja käyn jakso kerrallaan. Olen tehnyt tämän ennenkin, mutta nyt muutan asennettani.

The Alchemist [16.10.2012 20:08:23]

#

Jaa'a, enpähän itse tiedä, mitä tässä sanoisi.

Olet itse sanonut lukuisia kertoja, ettet osaa aloittaa koodaamaan täysin tyhjältä pöydältä. Ehkä sitten olisi järkevintä koodata jokin yksinkertainen pieni proggis, sellainen missä on esimerkiksi yksi lomake, jolla syötetään tietoja järjestelmään, ja yksi näkymä, joka tulostaa nämä tiedot. Vaikka vieraskirja tai yksinkertainen blogi tai vaikka joku muistilappusysteemi.

Tuollaisia teet pari erilaista, niin luulisi sillä pääsevän alkuun.

Tulipas taas deja vu -tunne, kun tämän sanoin...

latenleffahylly [16.10.2012 22:07:27]

#

Noniin.. uskoo ken haluaa. Eli toteutin alkemistin neuvon.

TEHTÄVÄ: Koodaa Blogi tyhjästä:

index.html->tarkista.php->blogi.php->(index.html)
tyylit.css
yhdista.php

Lomake:
- otsikko
- pvm
- teksti

Tietokanta:
CREATE TABLE blogi
(
id int NOT NULL AUTO_INCREMENT,
otsikko varchar(20),
pvm varchar(10),
teksti varchar(140),
PRIMARY KEY (id)
)

Blogi:
tulosta (utf-8)

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

Miinukset:
- Päivämäärä tallennettiin teksti muodossa eli heti suuri miinus. Mutta ei tässä vaiheessa oleellinen. (harjoitus 1)
- tyylitiedostoa yhdistäessä en ihan kaikkea muistanut (rel = relationship) jne.
- header location, eli se ei ihan tullut muistista
- tietokannan rakentaminen, siis ihan basic, katsoin nopeasti mallia
- sitten tulostaessa merkit oli päin seiniä vaikka htmlspecialchars, ja utf-8 tietokanta, joten lisäsin->

<?php header("Content-Type: text/html; charset=utf8"); ?>

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

Toki aika paljon pieniä perusasioita. PDO toimi hyvin. Toki kuten alkemisti ja te muut olette sanoneet. Tästä se tavallaan pitää aloittaa. Eli pilkoin tuon alkemistin ehdottaman tavan osiin ja niitä tulikin lukuisia. Noh.. pdo yhteys.php tiedosto ei tullut muistista. Aika nopeasti sain kuitenkin koodattu raakaversion html5 doctype tyyli, tietokanta toimivuus ja tulostus. Mutta mutta. Pienet virheet pois ja lisää haastetta lomakkeen tarkistus, tyylittely, tulostus, hienous.

Kello viereen, esim. aikaa 3 tuntia saa pitää lyhyitä taukoja ja saa etsiä tietoa jos jää pahasti jumiin.

Plussat:

+ localhost, Apache testiympäristö on turvallinen ja nopea
+ mysql, phpmyadmin
+ pdo
+ järkeviä muuttijien nimiä ja css-tyylien nimiä
+ tajusin koko ajan mitä teen seuraavaksi ja missäkin järjestyksessä
+ löysin tietoa nopeasti, (miinukset) google-> ohjelmointiputka ja w3schools auttoivat

Suurkiitokset idean kehittäjälle ja kovimmalle kriitikolleni, tästä on hyvä jatkaa. Kyllä tämä avasi homman aivan täysin kun joutuu tyhjälle tiedostolle kaiken koodaamaan. Ja joka kerta kun joutuu muualta katsoa niin tulee inhottava tunne lunttaamisesta. Tänks!!

dartvaneri [16.10.2012 22:21:56]

#

Voitko heittää sen koodin jonnekkin näkösälle, niin voi antaa enemmälti rakentavaa palautetta, sikäli haluat oppia uutta.

latenleffahylly [16.10.2012 23:40:12]

#

Voin toki. Koodi tosin on hyvin perustasoa, joten iltanne menisivät varmaan pilalle. Kirjoitan tätä iPadista, joten nyt en pysty sitä tekemään. Noin tunnin koodasin, ihan perustasoa.

Tietty ehkä funktioiden harjoittelu voisi olla hyvä. Kuulemma käsinkirjoitetut sql lauseet eivät ole hyvä tapa. Lomakkeissa voisi käyttää label, dl, dt, dd tageja jne. Tarkistuksiin js, olen hakenut valmiita funktiokirjastoja jotka tekevät erilaisia tarkistuksia, mielestäni ihan kiva.

Toisaalta taas sellainen tunne että opettelen koodaamaan jotenkin väärin. Eli liian yksinkertaisesti. Pitäisi käyttää funktioita, luokkia ja olioita. Metabolix kertoi omasta tavasta muodostaa sivut, siinäpä jo valtava haaste. Ongelmani on että en pysy pienien asioiden ääressä. Alan suunnittelemaan suuria kokonaisuuksia ja miettimään tulevia ongelmia.

Haluaisin tai siis aion vielä joskus koodata järjestelmän jolla hallitaan työntekijöiden arkea työpaikalla. Siinä käytetään apuna, tapahtumapalvelun ideaa. Näytetään ajankohtaisia asioita ja näytetään henkilökohtaisia asioita. Ylläpitäjä voi halutessa muokata ja tarkastella kaikkea tietomäärää.

Hieno ominaisuus olisi että näkisi ketkä kaikki ovat sisään kirjautuneina. Tavallaan joko ylläpitäjälle vakoiluohjelma tai kaikille näkyvä.

latenleffahylly [17.10.2012 15:23:41]

#

Lyhyesti.. onko PDO:ssa nopeaa tapaa saada päivämäärä + kellonaika?

1.) käyttäjä syöttää nimensä lomakkeelle ja painaa lähetä
2.) tämä tieto tallentuu tietokantaan ja.. tästä hetkestä pitäisi saada aika

2012-09-03 14:30:46

Olen aikaisemmin käyttänyt funktiota NOW() mutta miten on PDO:n laita?

dartvaneri [17.10.2012 15:28:04]

#

NOW() toimii myös pdo:ssa.

Lisäys:

<?php
    //Aika = DATETIME
    $kysely = $yhteys->prepare("INSERT INTO aika (aika) VALUES(NOW())");

    //Tai

    $kysely = $yhteys->prepare("INSERT INTO tapahtumat (tapahtuma, aika) VALUES(?, ?)");
    $kysely->execute(array($tapahtuma, NOW()));
?>

The Alchemist [17.10.2012 16:29:36]

#

Ei se ole pdo:ta vaan Myskylän sql:ää. Pdo ei ole kieli.

Grez [17.10.2012 17:34:52]

#

PDO:ssa ei myöskään ole tukea päivämäärälle, joten päivämäärät ja ajat joutuu välittämään kannalle merkkijonoina tai lukuina (esim. unix time stampit)

Itse kun ORMeja käyttävänä olen tottunut hoitamaan asian tyyliin

taulu.Aika = DateTime.Now;

niin kyllähän tuon asian tekeminen PDO:llakin tuntuu aina vähän purkalta.

latenleffahylly [17.10.2012 17:38:33]

#

noniin.. hyvä. Selvitän tuon unix time stamp. Dartvaneri kiitos kuitenkin esimerkeistä, alla virheilmoitus:

"Fatal error: Call to undefined function NOW() in tapahtumapalvelu/uusi_tyontekija_chk.php on line 49"

tsuriga [17.10.2012 18:02:14]

#

Syy: NOW() on myslin funkkari, ei PHP:n.

jaketsu [17.10.2012 18:15:48]

#

Aikakentän tyyppi timestamp, oletusarvo current timestamp.

$kysely = $yhteys->prepare("INSERT INTO xxxx SET nimi = ?, aika = NOW()");
$kysely->execute(array($nimi));

Toimii.

latenleffahylly [17.10.2012 19:30:40]

#

Hetkinen, hetkinen.. osa siis on sitä mieltä että PDO:n kanssa voi käyttää NOW() funktiota, niin ja että tietokannan taulussa tehdään asetuksia?

Mites nämä merkinnät?

$nyt = new DateTime();
$nyt->getTimestamp();
echo $nyt->format('U = Y-m-d H:i:s');

$date = mktime(0,0,0,date("m"),date("d"),date("Y"));

The Alchemist [17.10.2012 19:46:31]

#

Grez kirjoitti:

PDO:ssa ei myöskään ole tukea päivämäärälle, joten päivämäärät ja ajat joutuu välittämään kannalle merkkijonoina tai lukuina (esim. unix time stampit)

Itse kun ORMeja käyttävänä olen tottunut hoitamaan asian tyyliin

taulu.Aika = DateTime.Now;

niin kyllähän tuon asian tekeminen PDO:llakin tuntuu aina vähän purkalta.

Pdo on ainoastaan rajapinta sql-tietokantaan yhdistämiseksi php:tä käyttäen. Se on ainoastaan "ajuri", jota ormit ja sensemmoiset voivat loppuviimein käyttää.

Olen itsekin sitä mieltä, ettei käsin pitäisi lähteä sql-kyselyitä kirjoittamaan kuin aivan ehdottoman pakon edessä. Olion tallentaminen tietokantaan ja tietokantarivin lukeminen olioksi ovat niin täydellisen "triviaaleja" tapauksia, että ne kuuluvat ehdottomasti jonkin automaattisen työkalun eikä koodarin harteille.

Omien kokemusteni mukaan tietokannan ja sovelluksen välisen tiedonvaihdon hoitaviin komponentteihin menee webbijärjestelmiä koodatessa tuhottomasti aikaa, jos lähtee omia virityksiään tekemään. Tämä sisältää sen olettaman, että koodin kirjoittamisen jälkeen tarvitsee tehdä muutoksia tietokantaan tai rajapinnan koodiin.

latenleffahylly [17.10.2012 21:47:46]

#

Seuraavaksi funktiot haltuun, kiitos upeasta oppaasta. Äskeiseen chaseen se että nuo aika jutut ovat vaikeita, joten.. En saa tietokantaan aikaa h:i:s.. Mutta Y-m-d onnistuu mktime funktiolla. Pdo:ssa on puolensa. Itse kannatan mutta miten tällaiset asiat ratkaistaan. Funktio voisi olla kiva.. Mutta toisaalta kuinka helppo olikaan vain kirjoittaa NOW()

dartvaneri [17.10.2012 22:48:11]

#

Toimii toi NOW() edelleenkin.
Ja se pitänee, ainakin testien mukaan, olla tuossa sql kyselyssä, ei tuolla execute(array()) sisällä.

<?php
	$query = $connect->prepare("INSERT INTO action (action, time) VALUES(?, NOW())");
	$query->execute(array($action));
?>

latenleffahylly [18.10.2012 12:29:46]

#

kuules vaneri, osa kertoo että voi osa että ei...??? Miten alla olevaan koodiin muka voi liittää NOW() funktion?

$kysely = $yhteys->prepare("INSERT INTO tyontekija (
		                    email,
		                    regip,
		                    dt,
		                    etunimi,
		                    sukunimi
                           )
                           VALUES (
                           ?,
                           ?,
                           ?, NOW(), // ???
                           ?,
                           ?)");

    // suoritetaan
    $kysely->execute(array($email,
                           $regip,
                           $dt,
                           $etunimi,
                           $sukunimi));

Teuro [18.10.2012 12:52:14]

#

Näin

<?php

$kysely = $yhteys->prepare("INSERT INTO tyontekija (email, regip, dt, etunimi, sukunimi) VALUES (?, ?, NOW(), ?, ?)");
$kysely->execute(Array($email, $regip, $etunimi, $sukunimi));

latenleffahylly [18.10.2012 13:13:53]

#

Kiitos Teuro, erittäin reilua. Olin typerästi laittanut NOW() funktiolle oman muuttujan arrayn sisään. Nyt toimii hienosti:

Sarakkeen tyyppi: datetime
Tietosisältö: 2012-10-18 13:12:03

dartvaneri [18.10.2012 14:07:32]

#

latenleffahylly kirjoitti:

kuules vaneri, osa kertoo että voi osa että ei...???

Ne jotka väittivät, ettei se toimi ovat kai joskus kokeilleet sitä väärin, ja todenneet sen toimimattomaksi, mutta minäpä satuinkin testaamaan sitä asiaa juuri ennen kirjoittamista, niin arvaappa vaan tiedänkö, että toimiiko se funktio.

Grez [18.10.2012 14:17:24]

#

Kuka muuten väitti, että ei voi? Ei ainakaan tässä keskustelussa tainnut kukaan väittää.

Metabolix [18.10.2012 14:18:11]

#

Kukaan ei ole väittänyt, ettei MySQL:n NOW-funktio toimisi. Kaikki vastaajat luultavasti tietävät, että MySQL:n perusfunktioiden toiminta ei riipu siitä, lähetetäänkö ne palvelimelle PDO-rajapinnalla, MySQLi-rajapinnalla vai mysql_query-funktiolla; nämä kaikki ajavat (tässä tapauksessa) MySQL-kyselyitä MySQL-tietokannassa, jolloin samat MySQL:n merkinnät toimivat.

Sen sijaan dartvaneri on antanut ainakin yhden aivan väärän esimerkin, jossa NOW-funktiota yritetään kutsua PHP-koodissa. Se ei tietenkään toimi, ja samalla tulee todistettua, että dartvaneri ei myöskään testannut neuvojaan.

dartvaneri [18.10.2012 14:33:39]

#

Metabolix, jos satuit lukemaan tuon minun 17.10.2012 22:48:11 lähettämän viestin saattaisit jopa ymmärtää, että korjasin virheeni.

Lisäksin en todellakaan katsonut sen tarkemmin, että ketkä väitti, ettei ko. funktio toimi, kun kerran latenleffahylly sanoi, että joku väitti niin, aattelin vaan kertoa, että mikä siihen voisi olla syy. Myönnän että sana valinta ei nyt ihan nappiin mennyt.

Edit.
Enhän muuten olisi korjannut virhettäni, ellen olisi testannut.

latenleffahylly [18.10.2012 15:04:34]

#

Koodaan aivan liian paljon per päivä 6-10 tuntia, useimmiten yli. Se ei taida olla kovin järkevää. Luultavasti itse sekoitin asioita, pahoittelut!

latenleffahylly [19.10.2012 13:23:16]

#

Osaako joku neuvoa hieman järkevämpää tapaa saada tietokannasta tietoa arrayhin ja siitä omaan funktioon?

function valintalista($name, $value, $ryhmat){} {

  echo "<select name=" . $name . ">";

  foreach ($value as $key) {

    echo "<option value=" . $key . ">"  . $ryhmat . "</option>";

  }
  echo "</select>";

}

// tässä tapauksessa arrayn tiedot tulisivat tietokannasta
$ryhmat = array("jv", "tr", "em");

valintalista("R_Id", range(3, 6), $ryhmat);

- Huom! Yritän nyt opetella seuraavat 3 päivää Array, Print_r, Foreach ja nimenomaan niin että sql-lause voitaisiin suorittaa funktion sisällä. Siihen parametrit tulisivat tietokannasta ja jne. Mitään kovin järkeviä ohjeita en löydä, ovatko hakusanat sitten outoja tai jotain.

Lebe80 [19.10.2012 13:38:18]

#

Anteeksi mutta eihän tuossa ole mitään järkeä.

Sä voit tuoda tuon "range" ja $ryhmat samassa arrayssa, niin virheiden määrä vähenee heti.

Eli tällöin sulla on yksi taulukko, jossa sulla on valintojen "valuet" ja sitten optionissa näytettävät tekstit samassa arrayssa (esim. ihan normaali hash-array).

Taulukko voisi olla tämmöisessä muodossa:

( $taulukko[ key ] = value )

$taulukko["banaani"] = "Foobar";
$taulukko["omena"] = "Lorem";
$taulukko["kiwi"] = "Ipsum dolor";
...

Vastaavasti tuo taulukon "key" voisi olla vaikkapa tietokannasta tuleva yksilöivä id-numero ja arvo tietokannasta tullut tekstinpätkä/otsikko.


edit:
Itse vierastan suuresti juuri kahta taulukkoa samassa loopissa, koska tällöin on hyvin suuri mahdollisuus, että inhimillisestä erheestä johtuen taulukossa on esim. vahingossa soluja eri määrä.

esim.

$nimet = array("Aapo","Anssi","Antti","Ari","Aarne","Brutus","Bole","Pekka");
$id = array(2321,135,875,32,1000,15,656);

Kun taas ajatellaan, että taulukko olisi muotoa

$henkilot[] = [
    "id" => 2323,
    "nimi" => "Aapo"
];

$henkilot[] = [
    "id" => 6,
    "nimi" => "Keijo"
];

$henkilot[] = [
    "id" => 2,
    "nimi" => "Antti"
];

$henkilot[] = [
    "id" => 43,
    "nimi" => "Jorma"
];

latenleffahylly [19.10.2012 14:18:58]

#

Ymmärrän että minun pitää tämä asia ymmärtää mutta..

jos esim näin tietokannassa:

R_Id
1
2

rLyhenne
jv
tr

( $taulukko[ key ] = value ) -> function valintalista($taulukko[$R_Id] = $rLyhenne) {

}

..ei kyllä tässäkään ole järkeä kun en syntaksia osaa kirjoittaa. Mutta, mutta.. kun minulle enemmän energiaa tutkin tuon sinun lähettämän postauksen. Kiitos kun jaksoit auttaa[:)]

Lebe80 [19.10.2012 14:24:21]

#

Mikset sä voi vaikka tehdä sitä taulukkoa siellä php-koodissa?

latenleffahylly [19.10.2012 14:29:52]

#

Sekotan varmaankin taas asioita, nyt näin..

<td>
  <label class='styledLabel' for="jvTarve">Järjestyksenvalvoja:</label>
  <?php
    echo "<div class='styledSelect3'><select name='jvTarve'>";
    valinta();
    echo "</select></div>";
  ?>
</td>


// funktiokirjasto.php
function valinta() {
  for ($valinta = 0; $valinta <= 50; $valinta++) {
    echo "<option value=" . $valinta . ">" . $valinta . "</option>";
  }
}

The Alchemist [20.10.2012 08:29:29]

#

Ei mitään tuollaista kurapaskaa kuin mitä viimeisessä viestissä on esitelty. Juuri tuollainen koodi on saanut omat stressitasoni nousemaan sataseen, kun olen muiden tekemää kelvotonta koodia joutunut korjailemaan. Jos html:ää aletaan tulostella funktioilla tai sitä aletaan muilla tavoin siirtää pois view-osasta, niin sitten tulostetaan kokonaisia osia kuten kokonaisia html-elementtejä (<select> ja sen sisältö).

Kun jo kerran aiemmin kysyit "opasta" asioiden tekemiseksi oikein, niin minä tein sinulle yksinkertaisen esimerkin siitä, miten olen itse alkanut tehdä koodia viime aikoina. Esimerkkini on kyllä suhteettoman huono oppaaksi, koska se on raaka yksinkertaistus asioista ja sisältää muutenkin tarkoituksellisia / liiasta yksinkertaistuksesta johtuvia virheitä.

http://sj87.hopto.org/lefa.tar.gz

Kyse on yksinkertaisesta kirjojen hallintaan tarkoitetusta työkalusta, jolla voi nyt lukea kannasta kirjailijoiden ja kirjojen tietoja ja lisäksi syöttää kantaan uusia kirjoja ja poistaa niitä.

latenleffahylly [20.10.2012 14:20:25]

#

Tutustun juuri tuohon lähettämääsi materiaaliin. Haluaisin nimen omaan heti oppia järkevän tavan tehdä esim SELECT elementti.

..................Kuules nyt alkemisti, jotain rajaa. Olet aivan eri tasolla tämän PHP kielen hallinnan suhteen? En voi mitenkään päästä tasollesi edes näiden esimerkkejen avulla. Minun on yksinkertaisesti mentävä askel kerralla.

Stadikan torniin verrattaessa, minä olen juuri astunut ensimmäiset kaksi askelta kun sinä olet kiitänyt jo tornin huipulle. Jos nyt tulen tornin huipulle hissillä ja yritän ymmärtää läpi käymääsi oppimisvaihetta.. niin.. Koodisi on huikeaa ja hienosti jaoteltu omiin kokonaisuuksiin, luulen että vielä joskus voin sen tajuta, mutta nyt. Ei.

juu.. yritän tehdä SELECT elementin ja siihen aion koodiasi käyttää apuna, mutta toisaalta.. ihmettelen miksei tällaista opasta ole?

<select name="author_id">
  <?php foreach ($_authors as $author): ?>
  <option value="<?= h($author['id']) ?>">
                 <?= h($author['name']) ?>
  </option>
  <?php endforeach ?>
</select>

..aikamoista, tätä yritän ymmärtää. Kiitän!

latenleffahylly [20.10.2012 20:54:24]

#

Onko järkevää rakentaa funktio ja sen sisään PDO-kysely. Kyselyyn voisi syöttää erilaisia parametrejä.

// valitse
function valitse() {

  global $yksi;
  global $kaksi;

  $kysely = $yhteys->prepare("SELECT * FROM ryhma");
  $kysely->execute();

  while ($sarake = $kysely->fetch()) {
    echo "<option value=" . $sarake[$yksi] . ">" . htmlspecialchars($sarake[$kaksi]) . "";
  }
}

Macro [20.10.2012 21:17:02]

#

En sitten tiedä tuon järkevyydestä, koska harvoin kyselyt ovat niinkin yksinkertaisia kuin SELECT * FROM X.

Parametrit muuten määritellään funktion määrityksen yhteydessä:

function funktio($parametri1, $parametri2)

latenleffahylly [20.10.2012 21:20:38]

#

Noniin.. ensimmäinen järkevä oma funktioni on nyt vihdoin valmis. Ideana on valinta lista, jota kutsutaan SELECT tagien sisällä:

// muodostetaan valintalista
<select name='R_Id'>
  <?php	valintalista("R_Id", "rNimi", "ryhma"); ?>
</select>


// funktio valintalista
function valintalista($sarake0, $sarake1, $taulunnimi) {
  global $yhteys;
  $kysely = $yhteys->prepare("SELECT * FROM " . $taulunnimi . "");
  $kysely->execute();

  while ($rivi = $kysely->fetch()) {
	echo "<option value='" . $rivi[$sarake0] . "'>" . htmlspecialchars($rivi[$sarake1]);
  }
}

Valintalistoissa on usein "value" ja sama nimi uudestaan tai vastine. Mukavaa on että taulun voi itse valita sekä taulun sarakkeet. Homma toimii myös :) ..Tästä on hyvä mielestäni jatkaa.

mietinvaan [20.10.2012 22:19:05]

#

Huomaa että tuossa on suuri tietoturva-aukko, kun $taulunnimi liitetään SQL-kyselyn jatkeeksi ilman tarkistuksia. Vaikka arvo ei tulisikaan (nyt) suoraan järjestelmän ulkopuolelta, se tulee silti käsitellä. Tee haku sanalla "SQL-injektio" ja katso kuinka se korjataan.

Lebe80 [20.10.2012 22:28:24]

#

mietinvaan kirjoitti:

Huomaa että tuossa on suuri tietoturva-aukko, kun $taulunnimi liitetään SQL-kyselyn jatkeeksi ilman tarkistuksia.

Suuri? Miten sä injektoisit tuohon taulun nimeen?

mietinvaan [20.10.2012 22:41:18]

#

Puolipiste vaan väliin ja uusi kysely sekaan.

latenleffahylly [20.10.2012 22:46:01]

#

Ohjelmointiputkassakin on sql-injektio opas, siellä puhutaan pdo:sta. Luin tietoturvasta myös muualta netistä, mutta onko tuo sql-lauseeni jotenkin väärin muotoiltu.

Minulle on usein kerrottu että en saisi koodata noin, eli jotenkin pitäisi määritellä muuttuja ensin vai? Php kirjassani puhutaan että jotenkin nuo pdo prepare ja sitten execute eivät päästäisi läpi mitään pahaa merkkiä. Vaan pdo olisi myös turvallisempi, no joo en sano enempää koska ei ole ammattitaitoa tähän, vielä.

Lebe80 [21.10.2012 01:02:13]

#

mietinvaan kirjoitti:

Puolipiste vaan väliin ja uusi kysely sekaan.

Anteeksi, mutta miten asetat "puolipisteen vaan väliin", jos taulun nimi on kovakoodattuna funktion parametrinä?

lainaus:

<?php valintalista("R_Id", "rNimi", "ryhma"); ?>

edit:
Käyttäjä ei mitenkään voi aiheuttaa injektiota syötteellään tuohon, joten injektion vaaraa ei ole. Pelkät muuttujat tietokantakyselyissä eivät aiheuta automaattisesti injektion vaaraa, vaan se, että muuttujien arvoiksi otetaan käyttäjien syötteet niitä mitenkään tarkistamatta.

The Alchemist [21.10.2012 08:21:39]

#

Tuollainen koodi on roskaa kuten jo sanoin. Tämä uusi esimerkkisi on vieläkin huonompi kuin se edellinen lyttäämäni koodinpätkä. Tietokantaa ei saa ikinä käpistellä siellä, missä tulostetaan tekstiä. Varsinkaan noin triviaaleissa funktioissa.

Koodiesimerkkini oli niin yksinkertainen, että sen perusidean ymmärtää kyllä koodia lukemalla. Et vain halua nähdä sitä vaivaa, että käsittelisit uusia asioita sen verran.

Jos haluat väen väkisin ulkoistaa html-elementtien tulostamisen funktiolle tai luokalle, niin sitten teet sen järkevästi ja teet sen niin, että koko elementti tulostetaan samassa paikassa, ei niin että osia jossain ja loput jossain toisaalla. Lisäksi teet toiminnosta niin geneerisen, että sitä voi käyttää muuallakin jottet joudu kirjoittamaan koko roskaa uusiksi heti, kun päätätkin haluavasi sinisen laatikon punaisen sijaan.

<?php

function h($str) {
    return htmlspecialchars($str);
}

function html_select($name, $options, $current = '', $attrs = array()) {
    $attrs['name'] = $name;
    $html = '<select';

    foreach ($attrs as $name => $value) {
        $name = h($name);
        $value = h($value);
        $html .= " {$name}=\"{$value}\"";
    }

    $html .= '>';

    foreach ($options as $value => $label) {
        $value = h($value);
        $label = h($label);
        $selected = ($current == $value ? 'selected' : '');
        $html .= "<option value=\"{$value}\" {$selected}>{$label}</option>";
    }

    $html .= '</select>';

    return $html;
}

print html_select('foobar', array('a', 'b', 'c', 'd'), 2, array('class' => 'super'));

latenleffahylly [21.10.2012 09:35:17]

#

Alkemisti, toivottavasti en suututa sinua enempää. Opettelen ylläolevan koodin myös, mutta miten itse opit koodaamaan noin ja ymmärtämään php:tä syvemmin? Minulle on sanottu että vasta työelämässä voi oppia neuvojen ja toistojen kautta. Koulussa ei kuulemma opi mitään.

Lisähuomautuksena, olen valmis tekemään työtä ja näkemään vaivaa php: n kanssa. Minulta puuttuu ymmärrys miten esim. Select boksi kannattaa tietoturvallisesti tehdä. Funktio erillisssä kirjastossa, html koodi erillissssä tiedostossa ja php erillisessä, sitten tietoturva ja näiden asioiden yhdistäminen toisiinsa. Muistaakseni lebe käski minua lukemaan sql-injektioneista, ja tein sen. Mielellään luen php:stä enemmän.

Esim w3schools on paljon selkeämpi ja iloisempi paikka oppia php:tä kuin esim karmean näköinen ja huonosti suunniteltu php.net

Ps. Kiitos jaksamisesta, en tahallani tehnyt huonoa funktiota, jopa hetken pidin sitä hyvänä. Nyt tajuan osittain miksi se on huono.. Kiitän.

The Alchemist [21.10.2012 10:03:56]

#

Koulussa ei opi mitään. Työelämässä oppiminen on mahdollista vain, jos pääsee firmaan, jossa muut työntekijät osaavat jotain pelkän räpeltämisen sijaan. Viime kädessä kukaan ei opi yhtään mitään, ellei itse opettele asioita.

Minä en ole oppinut juurikaan asioita työn kautta. Tärkeimmät prinsiipit olen oppinut itse perehtymällä asioihin. En ole koskaan kysynyt ohjelmointiin apua foorumilla enkä oikeastaan missään muuallakaan.

Tärkein nyrkkisääntö on se, että itse tekemällä saa aikaan vain huonoa jälkeä. Php on erittäin huonosti varusteltu kieli. Jos sillä haluaa saada aikaan lainkaan siistiä jälkeä, joutuu kaiken tekemään alusta asti uusiksi. Hyvän kehysympäristön kasaaminen taas vaatii paljon, paljon työtä ennen kuin sillä pääsee tekemään mitään näkyvää jälkeä.

Olen aiemminkin sanonut, että nollasta aloittamisen sijaan pitäisi ennemmin lähteä opiskelemaan jotain valmista ratkaisua. Teknisen alustan valinta riippuu siitäkin, millä abstraktiotasolla haluaa itse työskennellä.

Olet jossain kertonut käyttäneesi WordPressiä. Jos se on sopiva alusta sinun tarkoituksiisi, niin unohtaisin tuommoiset turhat select-boksien tulostamiset käsin, koska WP:ssä on aivan varmasti rajapinnat niitä ja kaikkia muitakin lomakekomponentteja varten. Itse asiassa WP:ssä on aivan varmasti kokonainen lomakekirjasto, jonka avulla lomakkeiden luominen ja lomakkeiden tietojen hallinta on nopeaa ja helppoa.

WP:lle koodatessa opit myös tuntemaan siinä käytetyt paradigmat ja mahdollisesti myös sitä, miten WP toimii "pellin alla". Tästä saat paremmat eväät jatkossa täysin oman arkkitehtuurin toteuttamiseen kuin arpomalla vuosikausia tai -kymmeniä sen kanssa, miten olisi tyhmintä tulostaa yksinkertainen pudotusvalikko nettisivulle.

Alan jo olla sitä mieltä, ettei opiskelunkaan aloittaminen nollasta sovi sinulle. Jos opit WP:lle koodaamaan mitään, niin ehkä on tulevaisuutta alan parissa.

Php.netissä ei opeteta käyttämään php:tä. Siellä kerrotaan miten eri funktiot toimivat. Jos haluat oppia käyttämänä niitä oikein ja oikeassa paikassa, niin joudut etsimään apua jostain muualta.

latenleffahylly [21.10.2012 11:08:28]

#

Okei, alan ymmärtämään pointtisi. Omat kotisivuni on tehty käyttäen WP:tä ja omaa php koodia. Mielestäni muutenkin olisi järkevämpi käyttää valmiita elementtejä, joidenka toimintalogiikan ymmärtää. Sanon kuitenkin sen että Suomessa on lukuisia pk-yrityksiä, joilla ei ole halua maksaa omista web-sivuista tai jostakin työvuoronvarausohjelmasta useita tuhansia euroja.

On mahdollista että hyvän tason harrastekoodari voi toteuttaa tällaisille yrityksille (esim. parturi-kampaamo) oman web-sivu/sovellus kokonaisuuden. Josta hyötyvät kaikki, työntekijät, asiakkaat ja koodari itse ylläpidon/ teknisen tuen puitteissa. Myös koko ala, parturit, saavat näkemyksen että näinkin voi ihmisille varata aikoja ja kertoa uutuustuotteista.

Sitten toinen asia on WEB, jonka parissa olen viettänyt nyt lähes 4 vuotta ja aion jatkossakin viettää. Minulla on mahdollisuus päästä tietylle hyväksyttävälle tasolle php:ssä ja muissa web-tekniikoissa. On toki selvää että vahvuuteni ovat kuitenkin esim. visuaalisuus, värit, käyttöliittymät, valokuvaus, suunnittelu. Yritän hallita koko pakettia, tavallaan designer, developer, yksityisyrittäjä pohjalta.

Kokonaisuus ei kuitenkaan ole ihan parasta A-luokkaa, johon kuitenkin pyrin. Toinen suuri haaste on "Responsive Design" eli haluan kehittää web-sivut-> (desktop, laptop, tablet, smartphone) -ympäristöön. Alkemisti, suurkiitos että uskallat puhua suoraan ja tuoda näkemyksiäsi esille. Ne ovat lopulta todella tärkeitä meille kaikille.

Oma filosofiani:

- WEB-ammattilaisten pitäisi tehdä paljon enemmän yhteistyötä
- Standardit
- Yhdessä järkevän koodaustavan opettelu (esim. yllä alkemistin koodi)
- Pyörää ei saa keksiä uudelleen, Wordpress kouluaineeksi jo yläasteella
- Yksi hyvä foorumi, jossa kirjoitetaan oman kuvan ja nimen kera
- Joku perusrakenne web-sivuihin? Esimerkkiä kirjoista:
--etukansi
--takakansi
--sisällysluettelo
--tekijän tiedot
--vuosiluvut
--jaksot, kappaleet, otsikot, alaotsikot

-> Kun ihminen tulee ensi kertaa web-sivulle hän tajuaa heti miten kaikki toimii. Sama efekti kun ottaa kirjan käteen. Luetaan takakannesta hieman kirjan ideasta ja tekijästä. Ihaillaan etukantta. Selataan sisällysluettelo läpi. Plärätään kappaleet läpi ihaillen fonttia ja otsikko tyylejä. On sivunumerot jne.

WEB on vasta nyt ottamassa niitä isoja askeleita. Miksemme kaikki voisi vaikuttaa siihen suuntaan mihin kuljemme yhdessä? Voisimme olla paljon avoimempia, jolloin tekisimme oikeita asioita. Itse haluan kirjoittaa hyvää koodia joka on validoitu. Uskon että pystyn nousemaan seuraavalle tasolle kunhan ensin saan paremman perusymmärryksen.

qeijo [21.10.2012 11:46:53]

#

:)

The Alchemist [21.10.2012 12:02:46]

#

latenleffahylly kirjoitti:

Okei, alan ymmärtämään pointtisi. Omat kotisivuni on tehty käyttäen WP:tä ja omaa php koodia. Mielestäni muutenkin olisi järkevämpi käyttää valmiita elementtejä, joidenka toimintalogiikan ymmärtää. Sanon kuitenkin sen että Suomessa on lukuisia pk-yrityksiä, joilla ei ole halua maksaa omista web-sivuista tai jostakin työvuoronvarausohjelmasta useita tuhansia euroja.

Liittyvätkö nämä virkkeet jotenkin toisiinsa, kun kerta ovat samassa kappaleessa? Valmiin alustan käyttämisessä on juuri se etu, että kehitystyö on paljon nopeampaa ja luotettavampaa, koska kaikkea ei tarvitse tehdä itse ja koska käytetään testattuja komponentteja. Jos lähdet tekemään järjestelmiä alusta asti itse, niin hinta tulee olemaan moninkertainen, minkä lisäksi mikä tahansa saattaa räjähtää koska tahansa, ja sitten taas nostetaan lisää palkkaa bugeja ratkoessa.

latenleffahylly [21.10.2012 12:19:15]

#

The Alchemist kirjoitti:

Liittyvätkö nämä virkkeet jotenkin toisiinsa, kun kerta ovat samassa kappaleessa?

Tapahtumapalvelun versio 1 oli tehty WP:tä apuna käyttäen. Nyt versiossa 2 yritän rakentaa kaiken alusta asti itse jotta oppisin paremmin ymmärtämään koodausta ja web-maailmaa. Asioita kuten:

- istunnot, evästeet, tietoturva
- rekisteröinti, käyttäjän luominen, lomaketiedon tallentaminen, muokkaaminen, poistaminen ja tulostaminen oikein
- web-sivujen jakaminen eri osiin: julkinen, suljettu, ylläpito (ja käyttöoikeudet näihin)
- käyttäjän tunnistaminen
- javascript & php tarkistukset
- jquery kirjaston käyttö

..olen nyt huomannut että työtä on paljon, mutta toisaalta olen oppinut valtvavasti. Sen sijaan se että osaisin käyttää oikein funktioita tai että ymmärtäisiän olioita ja luokkia niin on tulevaisuudessa. Tähän projektiin liittyvät myös:

- phpmyadmin
- webhotelli
- testiympäristö, apache, mysql, php
- valokuvaaminen, grafiikan teko, photoshop cs6 jne.

Lisäksi:
- kommunikointi asiakkaan kanssa
- asiakkaan asiakkaiden kartoittaminen ja kommunikointi
- ylipäätää dokumentaatio, testaus, suunnittelu, markkinointi, budjetti, (sponsorit)

huoh.. hommaa riittää. Sen vaan sanon teille kaikille että versio 1 on myyty ja palaute otettu vastaan. Nyt versio 2 pitäisi olla ihan eri tasolla. Miksi en voisi tehdä versiota 3 - käyttäen apuna WP:tä ja muutenkin tehdä parempaa koodia? Miksi minua sorretaan täällä jatkuvasti, toivon että joku edes sanoisi että voin oppia koodaamaan paremmin. Tällä hetkellä raskas olo tästä asiasta johtuen...

Jaska [21.10.2012 12:34:26]

#

latenleffahylly kirjoitti:

- Pyörää ei saa keksiä uudelleen, Wordpress kouluaineeksi jo yläasteella

Mielestäni koulujen on hyvä opettaa yleisiä ongelmanratkaisumenetelmiä ja tapoja pärjätä elämässä eikä rajoittua tiettyihin ohjelmistoihin, jotka saattavat vanheta ennemmin tai myöhemmin.

Ohjelmoinnin opiskelu vaatii kärsivällisyyttä. Monesti sivut kuten muutkin ohjelmat kannattaa ensiksi suunnitella kunnolla, sitten jakaa sopivankokoisiin loogisiin paloihin ja miettiä kullekin palalle järkevin toteutus. Mulla ei ole valitettavasti WP:stä kokemusta, joten en osaa auttaa sen opiskelussa.

Metabolix [21.10.2012 13:15:01]

#

The Alchemist kirjoitti:

Koulussa ei opi mitään.

Koulussa voi kuitenkin saada perusteista (if-lauseista, silmukoista, funktioista jne.) vastaavat tiedot kuin oppaistakin, jotta voi opetella näitä asioita itse. Lisäksi koulussa voi olla tehtäviä ja tenttejä, jotka varmistavat, että oppiminen etenee.

latenleffahylly kirjoitti:

Miksi minua sorretaan täällä jatkuvasti,

Koska olet räpeltänyt tälläkin foorumilla kohta jo vuoden samanlaista purkkaa ilman minkäänlaista kehitystä, vaikka parempia tapoja on neuvottu lukemattomia kertoja ja olet myös monesti luvannut opetella lisää.

latenleffahylly kirjoitti:

Toivon että joku edes sanoisi että voin oppia koodaamaan paremmin.

Kun kirjoitit tuon yhden lyhyen koodin, johon vastasin "Hurraa!", näytti hetken, että vihdoin olisit oppinut jotain. Kuitenkin heti seuraavat koodit olivat taas yhtä huonoja kuin ennenkin, joten selvästikään mitään aitoa oppimista ei vielä tapahtunut – kuten ei ennenkään. Ehkä sitten todellakaan et voi oppia, vaikka se luultavasti johtuukin vain asenteesta ja toimintatavoista.

Sinun pitää soveltaa kaikkia hyviä tapoja samalla kertaa eikä vain yhtä niistä. Esimerkiksi minkä tahansa funktion tekeminen ei ole hyvä asia, vaan myös sen sisällön pitää olla järkevä, ja aikaisemman periaatteen mukaan sielläkään ei pitäisi sekoittaa tiedon hakemista ja tulostamista.

Äsken mainitsemassani Hurraa-varauslomakkeessa voisit soveltaa funktioita yksinkertaisimmillaan vaikka niin, että jokainen kysely prepare-rivistä fetch-riviin olisi omana funktionaan, joita kutsuttaisiin näin:

$tieto = hae_tapahtuman_tiedot($_GET["T_Id"]);
$tarve = hae_tapahtuman_tarve($_GET["T_Id"]);
$jvTarve = hae_tapahtuman_jarjestyksenvalvojatarve($_GET["T_Id"]);
$varaus = hae_tapahtuman_varausmaara($_GET["T_Id"]);

Tämä on tietenkin hyvin alkeellinen esimerkki eikä suinkaan paras mahdollinen tapa, mutta tämän onkin tarkoitus olla helposti ymmärrettävä ja suoraan sinun nykyiseen koodiisi sopiva.

latenleffahylly [21.10.2012 13:39:09]

#

Juu.. Olen nyt viimeaikoina miettinyt paljon. Ehkä on niin että kaikilla ei ole kykyä oppia php:tä. Toisaalta pitäisi osata pitää taukoa, antaa itselle aikaa sisäistää joku kokonaisuus ja vasta sitten opetella uusi asia. Muutenkin menen perusteista liian nopeasti vaikeampaan materiaaliin.

Mutta alkemisti on siinä oikeassa että ehkä minulle sopii paremmin opetella esim WP inside out. Ymmärtää php koodia mielummin kuin yrittää itse tuottaa täydellistä sellaista.

Minulta puuttuu jokin perusymmärrys php:stä, sillä en ihan juuri nyt osaa yhdistää metabolixin mallia omaan koodiini. Mielestäni se kertoo jostain karua kieltä. Toisaalta haluan muistuttaa että olen nähtävästi opetellut koodaamista jotenkin ihan väärällä tavalla. Jatkossa alan miettimään hyvinkin tarkkaan uskallanko kysyä täältä apua, tai onko se edes järkevää. Netti on täynnä esim. Hyviä WP vinkkejä joten.. No tämä on hankalaa, sillä olen ollut siinä uskossa että voin oppia php:n hyvälle tasolle vuodessa. Siis jokin hyvä perustaso, jossa mm. Luokat ja olio-ohjelmointi.

The Alchemist [21.10.2012 13:40:42]

#

Eikä pidä ajatella niin, että joka kerta, kun huomaa tarvitsevansa jotain dataa tietokannasta, kirjoittaa sille uuden funktion. Jossain välissä tulee käymään niin, että rajapinnasta on tullut niin bloatti ja monimutkainen, ettei itsekään enää muista, onko jollekin toiminnolle jo funktio tai että mikä sen nimi oli ja millä parametreilla sitä piti kutsua. Lisäksi muistutan siitä, että mitä enemmän sql:ää on koodiinsa kirjoittanut, sitä vaikeampaa on tietokantaan tehdä muutoksia jälkikäteen.

Toisaalta taas, jos funktioista yrittää tehdä liian yleiskäyttöisiä, rajapinta monimutkaistuu esim. sen takia, että funktiot ottavat liian paljon parametreja. Tai sitten suoritettava sql-kysely on niin monimutkainen, ettei sitä kannata käyttää kaikissa yksinkertaisimmissa tapauksissa, joihin funktio muuten soveltuisi.

Ongelmiin löytyy aina useita ratkaisuita eikä mikään tunnetuista ratkaisuista ole välttämättä yksiselitteisesti muita parempi. Siksi ei voi mitenkään riittää, että osaa ohjelmointikielen syntaksin, vaan pitää ymmärtää ohjelmoinnin teoriastakin jotain.

Jaska [21.10.2012 16:24:32]

#

latenleffahylly kirjoitti:

No tämä on hankalaa, sillä olen ollut siinä uskossa että voin oppia php:n hyvälle tasolle vuodessa. Siis jokin hyvä perustaso, jossa mm. Luokat ja olio-ohjelmointi.

Löysin aihetta sivuavan keskustelun, jossa on listattu tarvittavia taitoja.

The Alchemist [22.10.2012 07:47:08]

#

latenleffahylly kirjoitti:

Minulta puuttuu jokin perusymmärrys php:stä, sillä en ihan juuri nyt osaa yhdistää metabolixin mallia omaan koodiini. Mielestäni se kertoo jostain karua kieltä.

No aivan selvästi kertoo. Et ymmärrä, mikä funktio on ja miten se toimii. Mikäli ei ymmärrä funktioita, ei ole mitään toivoa luokkien ymmärtämisestä, koska luokat laajentavat funktion käsitettä uusilla asioilla.

latenleffahylly [22.10.2012 08:23:18]

#

Käyn funktiot läpi huolellisesti. Tämä on siksi tärkeää että tutkin Wordpress kirjasta WP:n sisällä olevaa funktiota. Eli vaikka sitä ei osaisi itse koodata niin sen ymmärtäminen 100% olisi kova juttu. Eli seuraavaksi op:n funktio oppaan pariin ja kuppi kahvia.

The Alchemist [22.10.2012 08:56:37]

#

Funktioissa ei itsessään ole mitään ymmärrettävää: ne vain ottavat joukon lähtötietoja (parametrit) ja tuottavat niiden pohjalta uutta dataa (paluuarvo). Vaikeus piilee siinä, että pitää osata nähdä, mitkä kokonaisuudet kannattaa eristää omaan funktioonsa. Lisäksi siinä ei ole mitään järkeä, että funktion sisäinen toteutus on satoja koodirivejä pitkä, vaan on järkevää pilkkoa kokonaisuuksia pienempiin funktioihin, joita muut funktiot sitten kutsuvat.

Merkittävin ongelma on varmaan se, että toiminnallisuuden pilkkominen useisiin funktioihin rajoittaa pääsyä dataan: funktiolla on saatavilla vain se tieto, mitä sille annetaan parametreina. Parametrien määrän taas pitäisi olla "järkevä". Jostain kirjasta olin lukevinani, että kolme parametria on yleisesti järkevä enimmäismäärä, koska sen jälkeen alkaa olla vaikeaa muistaa annettavien parametrien järjestys ja merkitys.

Toinen tärkeä pointti on se, missä järjestyksessä parametrit annetaan. Esimerkiksi monet php:n natiiveista funktioista kärsivät siitä, että niiden kirjoittajat ovat olleet suoraan sanoen idiootteja.

Luokat monimutkaistavat asioita esimerkiksi siten, että nyt luokan funktiot (tai "metodit") voivat käyttää myös muutakin dataa kuin niille suoraan annetut parametrit, ja että ne voivat paluuarvojen sijaan muokata olion sisäistä tilaa.

latenleffahylly [23.10.2012 09:12:22]

#

Voitteko kertoa onko tällainen tapa järkevä? Ja miten pystyn tulostamaan oikealla tavalla funktion palauttaman tiedon? Kiitos jos viitsitte sillä tavalla auttaa etten opettele taas jotenkin väärin.

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

<?php
// funktiot.php
function haeKaikki($taulunnimi) {
  global $yhteys;
  global $kysely;
  $kysely = $yhteys->prepare("SELECT * FROM " . $taulunnimi . "");
  $kysely->execute();
}
?>
<?php
// tulostaminen tapahtuu toisessa paikkaa

haeKaikki("ryhma");

while ($tulos = $kysely->fetch()) {
  echo "" . $tulos["R_Id"] . $tulos["rNimi"] . "";
}
?>

Huom! Koodi toimii ja tapa on mielestäni ok. Se että haetaan kaikki tieto niin ei pidemmän päälle ole ok.

qeijo [23.10.2012 12:48:25]

#

Aika hirveetä että funktiolle viedään vain taulun nimi ja funktiossa oletetaan että $yhteys on asetettu ja sijoitetaan kysely globaaliin muuttujaan. ;(
Eihän kukaan tiedä mistä muuttujat saavat arvonsa ja missä vaiheessa.

Jos on pakko tehdä se tuolla tavalla, vie myös PDO yhteys funktiolle ja palauta kyselyn tulos.

$yhteys = Db::getPdoInstance(); // tjn.

function haeKaikkiTaulunRivit(PDO $yhteys, $taulu) {

    $kysely = $yhteys->prepare("SELECT * FROM " . $taulu);
    $kysely->execute();

    return $kysely->fetchAll(); // tai $kysely
}

try {

    $vastaus = haeKaikkiTaulunRivit($yhteys, 'ryhma');

    foreach ($vastaus as $rivi)
        echo htmlspecialchars($rivi["rNimi"]); //jne..

} catch (PDOException $e) {
    print("Ongelma.." . $e->getMessage());
}

Miten luot PDO yhteyden, ja miten hallinnoit sitä?

Lebe80 [23.10.2012 12:59:48]

#

Eipä se Laten funktio näyttänyt myöskään palauttavan mitään. Itse voisin kuvitella, että se palauttaisi edes tuon $tulos -taulukon.

qeijo [23.10.2012 13:01:55]

#

Lebe80 kirjoitti:

Eipä se Laten funktio näyttänyt myöskään palauttavan mitään. Itse voisin kuvitella, että se palauttaisi edes tuon $tulos -taulukon.

Mutta sehän asetti kyselyn globaaliin muuttujaan...

Lebe80 [23.10.2012 13:13:12]

#

qeijo kirjoitti:

Lebe80 kirjoitti:

Eipä se Laten funktio näyttänyt myöskään palauttavan mitään. Itse voisin kuvitella, että se palauttaisi edes tuon $tulos -taulukon.

Mutta sehän asetti kyselyn globaaliin muuttujaan...

Aivan, mutta luulisi että tuollainen funktio mieluummin palauttaisi esim. tuloksen, kuin asettaisi sen globaaliin muuttujaan.

Tällöin siitä näkisi suoraan, että mitä se funktio edes tekee.

latenleffahylly [23.10.2012 14:10:56]

#

Okei, eli nähtävästi tapani ei ole hyväksyttävä. Tuo koodi toimii. Jotenkin ajattelin että funktiolle lähetetään tieto-> haeKaikki("tapahtuma");

- taulun nimen voi itse valita
- funktio hakee tiedot tietokannasta ja.. no joo ehkä tuossa sitten se suurin virhe. Olette varmaankin jo sanoneet miten kannattaa tehdä. Tuota, tuota.. ehkä yritän vielä kerran uudestaan, mutta tosiaan tuota ohjelmointiputkan opasta olen käynyt läpi ja sen kautta yrittänyt rakentaa omaa funktiota, pahoittelut osaamattomuudestani, jälleen kerran.

Metabolix [23.10.2012 14:11:46]

#

Yleisesti ottaen global-sanaa ei pitäisi koskaan tarvita.

latenleffahylly [23.10.2012 14:13:04]

#

Jaa.. no miten sitten nuo putkan oppaat? Jos haluat käyttää muuttujaa funktion ulkopuolella jne. ?

Lebe80 [23.10.2012 14:13:39]

#

Mun mielestä tuollaisessa tietokantahaussa pitäisi kyllä kaiken järjen mukaan olla myös jokin sääntö missä järjestyksessä tieto tulee tulokseen.

Eli kun ei selkeästikään haeta tiettyä riviä, niin tulokset olisi hyvä olla jossain järkevässä järjestyksessä, esim. uusimmasta vanhimpaan (tai juoksevan id:n mukaan).

latenleffahylly [23.10.2012 14:18:14]

#

No.. kysyn nyt näin voitteko ranskalaisin viivoin kertoa miten oma funktio rakennetaan.

index.php
- kutsu funktiota ja lähetä 1-3 parametriä

funktiot.php
- tee parametreille jotain ja palauta tulos

index.php
- tulosta tulos-muuttuja sisältö

Lebe80 [23.10.2012 14:21:15]

#

Mitä tässä tapauksessa funktion pitäisi tehdä?

latenleffahylly [23.10.2012 14:24:57]

#

No... otetaan esimerkki. Ohjelmointiputka:

<?php
function valintalista($nimi, $sisalto) {
  echo "<select name=\"{$nimi}\">";
  foreach ($sisalto as $kohta) {
    echo "<option value=\"{$kohta}\">{$kohta}";
  }
  echo "</select>";
}

echo "<p>Valitse syntymäpäiväsi:</p>";
valintalista("paiva", range(1, 31));
valintalista("kuukausi", range(1, 12));
valintalista("vuosi", range(1900, 2010));
?>

Nyt itse yritän tehdä tämän tietokanta mukaan luettuna:

ryhma-taulu

R_Id
1
2
3

rNimi
jv
tr
em

- Eli tarvitsen mielestäni funktion joka hakee tiedot
- ja funktion joka rakentaa select boksin
- toisaalta en enää uskalla sanoa mitään koska aina mokaan ja sekoitan asiat, ei pahalla :/

Lebe80 [23.10.2012 14:48:59]

#

Siis sä voit tehdä omat funktiot, mitkä hakee tietokannasta tiedot, ja oman funktion sille, mikä vaikka parsii tietokannan tiedot taulukkoon, sulle oikeaan muotoon. Ja lisäks funktio mikä rakentaa taulukosta alasvetovalikon. Ei noiden kaikkien tarvitse olla yhdessä funktiossa.

latenleffahylly [23.10.2012 14:58:32]

#

Kiitos Lebe80, juuri tämä tieto on oleellinen. Eli jutut voi jakaa noinkin pieniin osiin. Funktio idea, haetaan tietoa tietokannasta:

function hae($taulunnimi) {
  $kysely = $yhteys->prepare("SELECT * FROM " . $taulunnimi . "");
  // return mitä?
}

Tässä ongelmana on se että kysely-muuttuja ei toimi. Eli sille pitäisi kertoa että se on globaali muuttuja.. huoh.. yritän tutkia putkan oppaita, mutta eikö tavallaan ensin pitäisi aloittaa pdo-avaa tietokantayhteys, ja kertoa että se vaikuttaa kaikkiin alla oleviin funktioihin. Tavallaan nämä funktiot kuuluvat luokkaan pdo..?

qeijo [23.10.2012 15:00:59]

#

latenleffahylly kirjoitti:

..mutta eikö tavallaan ensin pitäisi aloittaa pdo-avaa tietokantayhteys, ja kertoa että se vaikuttaa kaikkiin alla oleviin funktioihin..

Tee yksi stattinen PDO yhteys.

latenleffahylly [23.10.2012 15:09:30]

#

yhteys.php:

<?php
// muodostetaan yhteys tietokantaan
try {
  $yhteys = new PDO("mysql:host=localhost;dbname=testi", "user", "123");
} catch (PDOException $error) {
	die("VIRHE: " . $error->getMessage());
}
// virheenkäsittely: virheet aiheuttavat poikkeuksen
$yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// merkistö: käytetään utf8-merkistöä
$yhteys->exec("SET NAMES utf8");
?>

funktiot.php:

function hae2saraketta($sarake0, $sarake1, $taulunnimi) {
  global $yhteys;
  $kysely = $yhteys->prepare("SELECT " . $sarake0 . "," . $sarake1 . " FROM " . $taulunnimi . "");

}

Ilman global -sanaa homma ei toimi.

qeijo [23.10.2012 15:19:32]

#

En tarkoita tätä nyt pahala mutta.

Ei kamalasti inspiroi vastaamaan sinun kysymyksiin, kun et selvästikkään ole vaivautunut lukemaan edes perusasioista itse.

latenleffahylly [23.10.2012 15:35:54]

#

Mitä tarkoitat? Funktioni toimii, mutta haluan tehdä asiat oikein. Olen käynyt ohjelmointiputkan funktio opasta läpi. Eli pyrin tekemään mahdollisimman pieniä funktioita. No harmittaa.. koska mielestäni teen tavallaan ihan oikein:

function hae2saraketta($yhteys, $sarake0, $sarake1, $taulunnimi) {
  return $kysely = $yhteys->prepare("SELECT " . $sarake0 . "," . $sarake1 . " FROM " . $taulunnimi . "");
}

- kun halutaan tulostaa Select-boksi, niin kerrotaan sarakkeiden otsikot ja taulu josta tieto haetaan. Ongelmana tässä on tuo palauttaminen. Ja se että haluan tehdä oikein asiat.. mutta saan vain haukkuja? vai..

The Alchemist [23.10.2012 17:56:42]

#

latenleffahylly kirjoitti:

Okei, eli nähtävästi tapani ei ole hyväksyttävä. Tuo koodi toimii. Jotenkin ajattelin että funktiolle lähetetään tieto-> haeKaikki("tapahtuma");

- taulun nimen voi itse valita
- funktio hakee tiedot tietokannasta ja.. no joo ehkä tuossa sitten se suurin virhe. Olette varmaankin jo sanoneet miten kannattaa tehdä. Tuota, tuota.. ehkä yritän vielä kerran uudestaan, mutta tosiaan tuota ohjelmointiputkan opasta olen käynyt läpi ja sen kautta yrittänyt rakentaa omaa funktiota, pahoittelut osaamattomuudestani, jälleen kerran.

Sanoin sinulle juuri omaa viestiäsi edeltäneessä postauksessani, että funktio saa käsitellä vain sille parametreina annettua tietoa. Sitten osoitat täydellisestä "ignorancea" (mikä lie sopiva suomennos) ja teet täysin järjettömän funktion, jolle annetaan parametreja lähinnä muodon vuoksi ja joka nojaa täysin käsittämättömällä tavalla globaaleihin niin syötteiden (funktiolle välitettävä data) kuin tulosteenkin (funktion tuottama valmis data) osalta.

Lisäys:

Metabolix kirjoitti:

Yleisesti ottaen global-sanaa ei pitäisi koskaan tarvita.

Laajennan tätä aksioomaa vielä seuraavasti:

Myöskään muuttujia, joita ei alusteta samassa skriptitiedostossa, ei pitäisi koskaan tarvita.

Toisin sanoen seuraavassa tilanteessa koodi on rikki ja koodari kaipaa lisäoppia:

*** foo.php
<?php
$foo = 5;
*** bar.php
<?php

include 'foo.php';

$test = 3;

print $test + $foo;

qeijo [23.10.2012 18:50:58]

#

The Alchemist kirjoitti:

Myöskään muuttujia, joita ei alusteta samassa skriptitiedostossa, ei pitäisi koskaan tarvita.

Mielestäni ohjelmassa ei saisi olla 'irrallista' logikkaa juuri ollenkaan.
Toteutuksen täytyisi jo alusta asti noudattaa jotain arkkitehtuurityyliä.
Kun ohjelma kasvaa, se kasvatetaan hallitusti, noudattamalla samaa kaavaa.

latenleffahylly [23.10.2012 19:48:13]

#

Okei yritän olla tarkempi. Putkan oppaassa oli tuon global funktion käyttöä, siitä mallinsin. Nyt opettelen youtuben kautta omaa funktiota. Alkemistille sen verran, onko mahdollista että ohjelmointiputkassa hieman jatkettaisiin funktio esimerkkejä. Eli näin teet funktion järkevästi, juuri nuo pointtisi boldattuna?

Valitettavasti jouduin ekaa kertaa hylkäämään putkan oppaan ja etsimään tutoriaalia youtubesta. Siellä kerrotaan yksityiskohtaisesti mitä tehdä ka oppiminen on sitten se toinen iso asia. Opin paremmin videoiden kautta, esim. Tuo geijon esimerkki menee ohi koska se on tarkoitettu funktiot ymmärtäville.

The Alchemist [23.10.2012 21:54:06]

#

Tämä taitaa jäädä viimeiseksi esimerkiksini tällä saraa, joten toivottavasti siihen (ja myös tuohon edelliseen esimerkkiini) paneudutaan sen ansaitsemalla tasolla.

http://sj87.hopto.org/lefanavi.tar.gz (Paketissa on muitakin tiedostoja kuin alla esitetyt php-koodit.)

Tuo snippetti havainnollistaa Lebe80:n aiemmin päivällä mainitsemia pointteja käytännön tasolla. Lisäksi se havainnollistaa yleiskäyttöisten funktioiden tuomaa lisäarvoa.

*** functions/common.php
<?php

function db() {
    static $db;

    if (!$db) {
        $db = new PDO('mysql:dbname=test', 'root');
        $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }

    return $db;
}

/**
 * Hakee sivut tietokannasta
 **/
function get_pages() {
    $sql = '
        SELECT
            a.id,
            a.url,
            a.parent_id,
            a.name,
            a.content

        FROM pages a
        ORDER BY a.name
    ';

    $smt = db()->prepare($sql);
    $smt->execute();
    $data = $smt->fetchAll();

    return $data;
}

/**
 * Rakentaa linkkilistasta puurakenteen
 *
 * @return array
 **/
function build_navigation_tree($pages) {
    $tree = array();

    // Alustetaan puu
    foreach ($pages as $item) {
        $id = $item['id'];
        $item['children'] = array();
        $tree[$id] = $item;
    }

    // Luodaan puurakenne
    foreach ($tree as &$item) {
        $id = $item['id'];

        if ($pid = $item['parent_id']) {
            $tree[$pid]['children'][$id] = $item;
        }
    }

    unset($item);

    // Poistetaan juuritasolta ne rivit, jotka ovat oikeasti lapsia
    foreach ($tree as $id => $item) {
        if ($item['parent_id']) {
            unset($tree[$id]);
        }
    }

    return $tree;
}

/**
 * Geneerinen versio funktiosta build_navigation_tree
 *
 * Rakentaa puun mistä tahansa listasta
 *
 * @param $data Lista alkioista
 * @param $dst_idx Indeksi, johon alkion lapset laitetaan
 * @param $map Mappingit, joiden perusteella päätellään lapsi-vanhempi-suhde (child => parent)
 *
 * @return array
 **/
function build_tree($data, $dst_idx, $map) {
    $tree = array();

    $a = key($map);
    $b = current($map);

    // Alustetaan puu
    foreach ($data as $item) {
        $id = $item[$a];
        $item[$dst_idx] = array();
        $tree[$id] = $item;
    }

    // Luodaan puurakenne
    // Käytetään viittausta $item-muuttujaan, jotta saadaan luotua puurakenne
    // aina n:nteen tasoon asti
    foreach ($tree as &$item) {
        $id = $item[$a];

        if ($pid = $item[$b]) {
            $tree[$pid][$dst_idx][$id] = $item;
        }
    }

    // Tuhotaan viittaus, jotten vahingossa ylikirjoiteta viimeistä muuttujan
    // viittaamaa indeksiä
    unset($item);

    // Poistetaan juuritasolta ne rivit, jotka ovat oikeasti lapsia
    foreach ($tree as $id => $item) {
        if ($item[$b]) {
            unset($tree[$id]);
        }
    }

    return $tree;
}

/**
 * Palauttaa puumaisen linkkilistan kaksiulotteiseksi listaksi
 *
 * @return array
 **/
function flatten_navigation_tree($pages) {
    $list = array();

    foreach ($pages as $item) {
        $children = $item['children'];
        unset($item['children']);

        $list[] = $item;

        if (count($children) > 0) {
            $list = array_merge($list, flatten_navigation_tree($children));
        }
    }

    return $list;
}

/**
 * Geneerinen versio funktiosta flatten_navigation_tree.
 *
 * Palauttaa puumaisen taulukon kaksiulotteiseksi listaksi.
 *
 * @param $tree Puurakenne
 * @param $src_idx Indeksi, josta lapsialkiot luetaan
 * @return array
 **/
function flatten_tree($tree, $src_idx) {
    $list = array();

    foreach ($tree as $item) {
        $children = $item[$src_idx];
        unset($item[$src_idx]);

        $list[] = $item;

        if (count($children) > 0) {
            $list = array_merge($list, flatten_tree($children, $src_idx));
        }
    }

    return $list;
}

/**
 * Suhteellisen huonosti toteutettu funktio, jonka tarkoitus on ainoastaan
 * demota geneeristä rajapintaa erilaisten navigaatioiden tulostamiseksi.
 **/
function print_navigation($pages, $config = array(), $style = 'basic') {
    $current_id = array_get($config, 'active');

    switch ($style) {
        case 'basic':
            $recursive = array_get($config, 'tree', false);
            print_basic_menu($pages, $current_id, $recursive);
            break;

        case 'breadcrumb':
            print_crumb_menu($pages, $current_id);
            break;
    }
}

function h($string) {
    return htmlspecialchars($string);
}

function array_get($array, $key, $default = null) {
    return array_key_exists($key, $array) ? $array[$key] : $default;
}
*** functions/navi_basic.php
<?php
/*
 * Funktiot tavallisen listanavigaation tulostamiseen.
 */

function print_basic_menu($items, $current_id, $recursive) {
    ?>

    <ul>
        <?php
        foreach ($items as $item) {
            print_basic_node($item, $current_id, $recursive);
        }
        ?>
    </ul>

    <?php
}

function print_basic_node($item, $current_id, $recursive) {
    $classes = array();

    if ($recursive) {
        $children = $item['children'];

        if (count($children) > 0) {
            $classes[] = 'has-children';
        }
    } else {
        $children = array();
    }

    if ($item['id'] == $current_id) {
        $classes[] = 'active';
    }

    if (count($classes) > 0) {
        $class = ' class="' . implode(' ', $classes) . '"';
    } else {
        $class = '';
    }
    ?>

    <li<?= $class ?>>
        <a href="<?= h($item['url']) ?>"><?= h($item['name']) ?></a>

        <?php if (count($children) > 0): ?>
            <?php print_basic_menu($children, $current_id, $recursive) ?>
        <?php endif ?>
    </li>

    <?php
}
*** functions/navi_breadcrumb.php
<?php
/*
 * Funktiot murupolkutyylisen navigaation tulostamiseen.
 */

function find_trace_from_tree($tree, $current_id) {
    foreach ($tree as $item) {
        $id = $item['id'];

        if ($id == $current_id) {
            return array($id);
        } else {
            $trace = find_trace_from_tree($item['children'], $current_id);

            if (count($trace) > 0) {
                array_unshift($trace, $id);

                return $trace;
            }
        }
    }

    return array();
}

function print_crumb_node($tree, $trace) {
    $current_id = array_shift($trace);
    $item = $tree[$current_id];
    $children = $item['children'];

    $classes = array('trace');

    if (count($trace) == 0) {
        $classes[] = 'active';
    }
    ?>

    <li class="<?= implode(' ', $classes) ?>">
        <a href="<?= h($item['url']) ?>"><?= h($item['name']) ?></a>

        <?php
        print_crumb_submenu($tree, $current_id);
        ?>
    </li>

    <?php
}

function print_crumb_submenu($pages, $current_id) {
    ?>

    <ul class="submenu">
        <?php foreach ($pages as $item): ?>
            <li>
                <a href="<?= h($item['url']) ?>"><?= h($item['name']) ?></a>
            </li>
        <?php endforeach ?>
    </ul>

    <?php
}

function print_crumb_menu($pages, $current_id) {
    $trace = find_trace_from_tree($pages, $current_id);
    ?>

    <ul id="navigation-crumb">
        <li class="trace">
            <a href="#">Index</a>
        </li>

        <?php
        while (!empty($trace)) {
            print_crumb_node($pages, $trace);
            $i = array_shift($trace);
            $pages = $pages[$i]['children'];
        }
        ?>
    </ul>

    <?php
}
*** demo.php
<?php

require 'functions/common.php';
require 'functions/navi_basic.php';
require 'functions/navi_breadcrumb.php';

$pages = get_pages();

// Nämä kaksi funktiota tuottavat täsmälleen saman tuloksen
$tree = build_navigation_tree($pages);
$tree = build_tree($pages, 'children', array('id' => 'parent_id'));

// Nämäkin kaksi funktiota tuottavat täsmälleen saman tuloksen
$list = flatten_navigation_tree($tree);
$list = flatten_tree($tree, 'children');

?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Navigation Demo</title>
    <meta charset="UTF-8"/>

    <link href="style.less" type="text/less" rel="stylesheet">
    <script src="less-1.3.1.min.js" type="text/javascript"></script>
</head>
<body>
    <div>
        <div id="demo-1">
            <b>Kaikki sivut samassa tasossa, lajiteltuna aakkosittain</b>
            <?php print_navigation($pages, array('active' => 16)) ?>
        </div>

        <div id="demo-2">
            <b>Kaikki sivut samassa tasossa, lajiteltuna lapsi-vanhempi-suhteen mukaisesti</b>
            <?php print_navigation($list) ?>
        </div>

        <div id="demo-3">
            <b>Vain ylimmän tason sivut</b>
            <?php print_navigation($tree) ?>
        </div>

        <div id="demo-4">
            <b>Kaikki sivut puurakenteessa</b>
            <?php print_navigation($tree, array('active' => 12, 'tree' => true)) ?>
        </div>
    </div>

    <div>
        <div id="demo-5">
            <b>Murupolku alavalikoiden kanssa</b>
            <?php print_navigation($tree, array('active' => 8), 'breadcrumb') ?>
        </div>
    </div>
</body>
</html>

latenleffahylly kirjoitti:

Mitä tarkoitat? Funktioni toimii, mutta haluan tehdä asiat oikein. Olen käynyt ohjelmointiputkan funktio opasta läpi. Eli pyrin tekemään mahdollisimman pieniä funktioita.

Aivan silkasta uteliaisuudesta kysyn, että mitä tarkoitat "mahdollisimman pienellä"? Siis: milloin funktio on "mahdollisimman pieni", ja millä tavoin koodi on parempaa, kun olet saavuttanut tämän tavoitteen? Enkä tarkoita, että käyt nyt googlettamassa äkkiä jotain, vaan haluan tietää, miksi väännät tietynlaista koodia ja mitä odotat siitä saavasi.

Antti Laaksonen [23.10.2012 22:58:01]

#

latenleffahylly kirjoitti:

Okei yritän olla tarkempi. Putkan oppaassa oli tuon global funktion käyttöä, siitä mallinsin. Nyt opettelen youtuben kautta omaa funktiota. Alkemistille sen verran, onko mahdollista että ohjelmointiputkassa hieman jatkettaisiin funktio esimerkkejä. Eli näin teet funktion järkevästi, juuri nuo pointtisi boldattuna?

Asia ei ole niin, että oppaissa olisi väärää tietoa. Näissä asioissa ei ole yhtä oikeaa totuutta, vaan mielipiteitä on monenlaisia. Globaalit muuttujat ovat oman ohjelmointityylini kulmakiviä, ja niinpä niitä esiintyy myös oppaissa.

Globaaleilla muuttujilla ei ole mitään tekemistä sen kanssa, tuleeko sivustosta hyvä vai huono. Asiakasta ei voisi vähempää kiinnostaa, onko sivustossa käytetty globaaleja muuttujia vai ei, jos kaikki toimii.

The Alchemist [23.10.2012 23:07:58]

#

Globaalit muuttujat eivät ole suorassa yhteydessä siihen, tykkääkö asiakas valmiista tuotteesta vai ei, mutta niillä on hyvin paljon vaikutusta siihen, miten vähän koodarit tykkäävät työskennellä kyseisen järjestelmän kanssa.

Grez [23.10.2012 23:09:43]

#

Mielestäni hieman heikko argumentti, että "asiakasta ei kiinnosta". Vastaavasti asiakasta ei kiinnosta sekään, onko sivustossa SQL Injektio-aukkoja, xss-haavoittuvuuksia tai voiko esimerkiksi verkkokaupassa jätää ostokset maksamatta ennen kuin ko. haavoittuvuuksia hyväksikäytetään.

Näistä voisi tietysti sanoa, että asiakasta pitäisi kiinnostaa nuo asiat, mutta samoin asiakasta pitäisi kiinnostaa myös, kuin hyvin ja kuinka suurilla kustannuksilla sivuja voi jatkokehittää. Tietenkin on aivan selvää että suurella osalla asiakkaista ei ole mitään kompetenssia arvioida mitään tässä mainituista asioista.

Metabolix [23.10.2012 23:11:31]

#

Antti Laaksonen kirjoitti:

latenleffahylly kirjoitti:

Putkan oppaassa oli tuon global funktion käyttöä, siitä mallinsin.

Asia ei ole niin, että oppaissa olisi väärää tietoa. – – Globaalit muuttujat ovat oman ohjelmointityylini kulmakiviä, ja niinpä niitä esiintyy myös oppaissa.

Kuitenkin funktion sisällä globaaleja muuttujia käytetään oppaassa ainoastaan siinä esimerkissä, jossa kerrotaan, että global-sana ylipäänsä on olemassa. Myöskään oppaassa ei erityisesti suositella global-sanan holtitonta käyttöä.

Toki tietyillä koodaustavoilla – kuten Antin tavalla – syntyy tilanteita, joissa globaalin muuttujan käyttö funktiossa säästää vähän aikaa ja vaivaa (kunhan ei samalla törttöile ja aiheuta vaikeaselkoisia bugeja). Silti myös Antti on varmaan samaa mieltä siitä, että SQL-kyselyn tuloksen palauttaminen ei ole yksi näistä tilanteista.

latenleffahylly [24.10.2012 09:19:34]

#

Alkemisti, olen ottanut zippisi talteen ja aion tutustua siihen tarkemmin kun osaamiseni/ ymmärrykseni paranee. Nyt nuo mallit ovat asteen verran liian hankalia. Katselin koko eilis illan videoita youtubesta, siellä näytettiin kädestä pitäen erilaisia funktioita.

// nyt lähden tällaisella funktiolla liikkeelle

function haeKaksiSaraketta($yhteys, $sar1, $sar2, $taulu) {

  $kysely = $yhteys->prepare("SELECT " . $sar1 . "," . $sar2 . " FROM " . $taulu . "");
  $kysely->execute();
  return $kysely;

}

Eli funktiolle lähetetään parametrit, ja funktio hakee niiden avulla tietoa kannasta. Ja palauttaa tuloksen. Tämä sitten tulostetaan alla.

$tulos = haeKaksiSaraketta($yhteys, "R_Id", "rNimi", "ryhma");

while ($rivi = $tulos->fetch()) {
  echo "" . htmlspecialchars($rivi["R_Id"]) . " " . htmlspecialchars($rivi["rNimi"]) . "<br>";
}

Huom! Mielestäni tässä on sinäänsä järkeä että näiden select boksejen kanssa tarvitaan useinmiten max. 2 saraketta. Tässä tapauksessa kannasta tulostetaan sarakkeet: "R_Id" ja "rNimi"

1 Ulkopuolinen
2 Järjestyksenvalvoja
3 Toimintaryhmä
4 Esimies
5 Turvapäälikkö
6 Ylläpitäjä

The Alchemist [24.10.2012 11:49:14]

#

Tuossa funktiossa ei ole yhtään mitään järkeä. En myöskään sekuntiakaan epäile sanoa hevonpaskaksi väitettä, että esimerkissäni dmeottu tietokantayhteyden hakeminen olisi liian monimutkaista ymmärtää vaikkei olisi ikinä php:llä mitään koodannutkaan.

Tosin myönnän sen, että jossain mielessä on parempi antaa käytettävä kantayhteys parametrina kuin luottaa staattisiin funktioihin, mutta tässä tapauksessa sillä vain tekee tarkoituksellisesti omasta elämästään vaikeampaa. Ja tiedät sen itsekin.

HaeKaksiSaraketta on erittäin huono funktio, koska se kovakoodaa haettavien kenttien määrän kahteen, vaikkei tälle ole olemassa mitään järjellistä perustetta. Tuossa tilanteessa ei edes ole mitään järkeä lähteä erikseen määrittämään funktion parametreissa sitä, mitkä sarakkeet luetaan.

Mikset lue niitä kaikkia kerralla ja lopuksi tulosta vain tarvittuja tietoja?

Lebe80 [24.10.2012 12:49:13]

#

Ja itse tykkäisin vielä enemmän, että tuolla funktiossa rakentaisit tuloksista jo taulukon, etkä palauttaisikaan sitä $kysely -muuttujaa.

latenleffahylly [24.10.2012 12:54:32]

#

Kiitos suorapuheisuudesta.

Sain käsityksen että on hyvä jakaa toistettavia asioita pienemmiksi osiksi-> funktioihin. Tässä tapauksessa tiedon haku ja tulostus olisi erillään? Tulostaminen ei ole aina saman näköistä, mutta tiedon haku olisi koska:

- funktiolle voisi syöttää minkä tahansa sarakkeen/ sarakkeiden nimet
- array ottaisi ne vastaan ja käsittelisi

---------------------
Yritän nyt lähettää testi.php tiedostossa kaksi parametriä funktion mukana-> funktiot.php tiedostoon. Siellä tiedot kaapataan arrayn sisään ja käydään läpi SELECT -lause.

Seuraava ongelma on palauttaako funktio arvot vai tulostetaanko arvot funktion sisällä. Mielestäni arvojen palauttaminen testi.php tiedostolle olisi järkevä ratkaisu. Näin voisin tulostaa selct-boksin, table, tai formin jne.

Lisäys:

Alkemisti, jos jaksat vastata? Onko tässä kohtaa niin että voi kutsua funktiota, joka minun omissa esimerkeissä korvaa muuttujan $yhteys

// tuo db()

$smt = db()->prepare($sql);

Yritän nyt käydä läpi sinun esimerkkejäsi ja aloitan funktioista:

function db()
function get_pages()

The Alchemist [24.10.2012 16:12:31]

#

latenleffahylly kirjoitti:

Seuraava ongelma on palauttaako funktio arvot vai tulostetaanko arvot funktion sisällä. Mielestäni arvojen palauttaminen testi.php tiedostolle olisi järkevä ratkaisu. Näin voisin tulostaa selct-boksin, table, tai formin jne.

Kuten sanoin itse ja kuten joku muukin on jo saattanut sanoa, niin sellaiset "komponentit", joita tarvitaan useissa eri paikoissa ja jotka ovat perusperiaatteiltaan helposti yleistettävissä, kannattaa aina eristää funktioihin. Tämä pätee niin tiedon käsittelyyn kuin myös esimerkiksi lomakkeen elementtien tulostamiseen.

Tätä myös demosin useammassakin kohdassa edellisessä navigaatioesimerkissäni.

Ja edelleenkin: jos koodia pilkotaan funktioihin, niin funktion täytyy olla itsenäinen kokonaisuus. Ei ole mitään järkeä tulostella pelkkiä <option>-elementtejä funktiossa, koska niitä ei voi yksinään käyttää. Ne vaativat aina <select>-elementin.

P.S. En kylläkään itse suosi ollenkaan funktioita, jotka tulostavat esim. html:ää. Käytän itse termiä "renderöidä", ja tarkoitan sillä että funktio voi generoida annetusta syötteestä sen html-vastineen, mutta tulostamisen sijaan se annetaan paluuarvona takaisin koodarille.

latenleffahylly kirjoitti:

Alkemisti, jos jaksat vastata? Onko tässä kohtaa niin että voi kutsua funktiota, joka minun omissa esimerkeissä korvaa muuttujan $yhteys

// tuo db()

$smt = db()->prepare($sql);

Vastaan että lue koodia. Josset sen perusteella vielä ymmärrä tapahtumien kulkua, niin sitten tee pieniä esimerkkejä itsellesi, joilla selvität asioiden toiminnan.

Lebe80 kirjoitti:

Ja itse tykkäisin vielä enemmän, että tuolla funktiossa rakentaisit tuloksista jo taulukon, etkä palauttaisikaan sitä $kysely -muuttujaa.

Minulla katkesi ajatus ennen kuin pääsin tähän kohtaan.

Grez [24.10.2012 16:20:23]

#

The Alchemist kirjoitti:

Ja edelleenkin: jos koodia pilkotaan funktioihin, niin funktion täytyy olla itsenäinen kokonaisuus. Ei ole mitään järkeä tulostella pelkkiä <option>-elementtejä funktiossa, koska niitä ei voi yksinään käyttää. Ne vaativat aina <select>-elementin.

No tämä on kyllä vähän kaksipiippuinen juttu. Eihän <select>-elemnttiäkään voi käyttää yksinään, vaan se tarvii <form> elementin joka tarvii <body> elementin joka tarvii <html> elementin. Eli mikä nyt sitten on itsenäinen kokonaisuus?

Jos funktio vetää aina selectit optioneiden ympärille, niin sitten ei voi käyttää optgroupeja ollenkaan, kuten voisi pelkkiä optioneita puskevalla renderoijalla. Toki ainahan voi tehdä funktion joka osaa laittaa sekä optgroupeja että optioneita selectin sisään.

latenleffahylly [24.10.2012 16:43:28]

#

Kiitos A ja G. Olette molemmat pitkällä Ohjelmoinnissa, ja tästä johtuen teillä on jokin tapa/ tyyli miten toteutatte asioita.. Pointti? Minun pitäisi itse tajuta enemmän ja löytää itselle sopiva tapa.

Alkemisti on mielestäni siinä perus periaatteessa oikeassa että jos jokin koodikokonaisuus toistuu uudestaan ja uudestaan niin on loogista laittaa se funktion sisään ja koodikin lyhenee. Selectin laittaminen funktion sisään säästää jo yhden funktion kohdalla parhaassa tapauksessa 2 riviä koodia?

The Alchemist [24.10.2012 17:17:02]

#

Grez kirjoitti:

The Alchemist kirjoitti:

Ja edelleenkin: jos koodia pilkotaan funktioihin, niin funktion täytyy olla itsenäinen kokonaisuus. Ei ole mitään järkeä tulostella pelkkiä <option>-elementtejä funktiossa, koska niitä ei voi yksinään käyttää. Ne vaativat aina <select>-elementin.

No tämä on kyllä vähän kaksipiippuinen juttu. Eihän <select>-elemnttiäkään voi käyttää yksinään, vaan se tarvii <form> elementin joka tarvii <body> elementin joka tarvii <html> elementin. Eli mikä nyt sitten on itsenäinen kokonaisuus?

Jos funktio vetää aina selectit optioneiden ympärille, niin sitten ei voi käyttää optgroupeja ollenkaan, kuten voisi pelkkiä optioneita puskevalla renderoijalla. Toki ainahan voi tehdä funktion joka osaa laittaa sekä optgroupeja että optioneita selectin sisään.

Hämärrät tahallasi tarkoitusperiäni.

Select ei missään nimessä vaatimalla vaadi yhtään mitään ympärilleen. Sen sijaan option ei ole itsenäinen elementti: se voi esiintyä ainoastaan select-elementin sisällä mahdollisesti vielä optgroup-ryhmissä. Tietysti, jos minulla olisi luokka, joka renderöi select-pudotusvalikoita, niin saattaisin hyvinkin lisätä siihen (privaatin) funktion, joka renderöi annetun joukon optioneita.

Pointtini oli, että on väärin (kyllä, väärin) tehdä pelkästään optioneita tulostava funktio ja jättää koodarille redundanttia työtä select-elementtien tulostamiseen.

Samalla tavalla on "väärin" jättää koodarille redundanttia työtä label-select-kombojen tulostamiseen, jos huomaa hyvin usein tekevänsä keskenään identtisiä label-select-pareja lomakkeille. Tällöin koodaisin ehdottomasti uuden funktion, joka tulostaa yhdellä kertaa labelin ja selectin. En kuitenkaan koodaisi tätä funktiota ns. tyhjältä pöydältä vaan hyödyntäisin tuota aiemmin tekemääni select-laatikoita tulostavaa funktiota.

Tällöin voin tulostaa yksinkertaisella tavalla kokonaisia kenttiä lomakkeelle, mutta mikäli se ei jossain tilanteessa olekaan riittävä ratkaisu, niin voin myös tulostaa labelin ja selectin erikseen ja muotoilla kenttää vapaammin.

Tällä tavalla saatetaan lopulta päätyä siihen tilanteeseen, että meillä on geneerinen funktio kaikkien yksittäisten kenttien tulostamiseksi lomakkeelle. Nyt herääkin kysymys, että onko mitään järkeä enää tulostella kenttiä yksitellen, vai voidaanko yleisen lomakemallin tulostus siirtää kokonaan funktioon...

function html_select($name, $options) {
    // Epätarkka yksinkertaistus
    return '<select>...</select>';
}

function html_label($text, $for = '') {
    // Epätarkka yksinkertaistus
    return '<label>...</label>';
}

function html_select_field($label, $name, $options) {
    // Epätarkka yksinkertaistus
    $html = '<div class="field">';
    $html .= html_label($label);
    $html .= html_select($name, $options);
    $html .= '</div>';

    return $html;
}

latenleffahylly kirjoitti:

Kiitos A ja G. Olette molemmat pitkällä Ohjelmoinnissa, ja tästä johtuen teillä on jokin tapa/ tyyli miten toteutatte asioita.. Pointti? Minun pitäisi itse tajuta enemmän ja löytää itselle sopiva tapa.

Alkemisti on mielestäni siinä perus periaatteessa oikeassa että jos jokin koodikokonaisuus toistuu uudestaan ja uudestaan niin on loogista laittaa se funktion sisään ja koodikin lyhenee. Selectin laittaminen funktion sisään säästää jo yhden funktion kohdalla parhaassa tapauksessa 2 riviä koodia?

Hyötyä ei mitata suoranaisesti koodirivien määrässä. Eikä ainakaan yksittäisten rivien tarkkuudella vaan kymmenien tai satojen. On täysin merkityksetöntä, onko skriptisi pituus 20 vai 25 riviä, tai että onko se 250 vai 270 riviä.

Kun funktioita on käytetty oikein ja suurin piirtein kaikki funktioihin järkevästi eristettävissä oleva koodi on pilkottu funktioihin, niin sen osan koodista, jossa näitä funktioita käytetään, lukeminen on paljon mukavampaa ja helpompaa.

Myös virheiden paikantaminen on helpompaa, kun voit suurin piirtein sanoa, mitä mikäkin funktio tekee, joten samalla tiedät, missä funktiossa virhe voi sijaita ja missä se tuskin sijaitsee. Tällöin et joudu keskittymään tuhansien koodirivien tutkimiseen, vaan riittää että käyt huolellisesti läpi ne muutamat funktiot, joissa epäilet vian piilevän.

Grez [24.10.2012 18:00:05]

#

Toki olen samaa mieltä siitä, että usein toistuvia juttuja kannattaa toteuttaa funktioiksi.

Mutta jos projektissa X on vaikka yhden kerran select-tagi ja kolmet listat optioneja niin en ole sitä mieltä että olisi automaattisesti huonoa että se optionit tulostava ei tee niitä selectejäkin suoraan.

Minulle jäi hämäräksi miten tuota optiot generoivaa koodiasi on tarkoitus käyttää, jos se änkee aina optioiden ympärille select-tagit ja koodaaja tarvitsisikin optioryhmiä.

Toki voi aina tehdä funktion, joka tekee selectin ja osaa tehdä sen sisään sekä optioita että optiogroupeja joiden sisällä optioita. Kuitenkin jos vaikka saadaan kolmesta eri paikasta optioina näytettävää tietoa joista ensimmäinen menee ilman groupia ja kaksi seuraavaa omissa groupeissaan, niin onko näistä järkevää lähteä kasailemaan tietorakennetta jollekin funktiolle vai voisiko olla mahdollista renderoida nuo kolme peräkkäin selectin sisään.

Eikö noissa epätarkoissa yksinkertaistuksissasikin ole hirveästi kammoksumaasi redundanttia työtä, kun jokaisessa tehdään html-tagit "käsin".

The Alchemist [24.10.2012 18:41:31]

#

Grez kirjoitti:

Mutta jos projektissa X on vaikka yhden kerran select-tagi ja kolmet listat optioneja niin en ole sitä mieltä että olisi automaattisesti huonoa että se optionit tulostava ei tee niitä selectejäkin suoraan.

Täsmensin jo edellisessä viestissäni, että kun tulostetaan täysin geneerisiä select-tageja käsin, niin silloin tehdään niin turhaa työtä, että on väärin olla tekemättä siihen toimintoon uutta funktiota. Jos funktiomme print_select() käyttää sisäisesti print_options-funktiota, niin sittenhän se on ihan siisti.

Grez kirjoitti:

Minulle jäi hämäräksi miten tuota optiot generoivaa koodiasi on tarkoitus käyttää, jos se änkee aina optioiden ympärille select-tagit ja koodaaja tarvitsisikin optioryhmiä.

Toki voi aina tehdä funktion, joka tekee selectin ja osaa tehdä sen sisään sekä optioita että optiogroupeja joiden sisällä optioita. Kuitenkin jos vaikka saadaan kolmesta eri paikasta optioina näytettävää tietoa joista ensimmäinen menee ilman groupia ja kaksi seuraavaa omissa groupeissaan, niin onko näistä järkevää lähteä kasailemaan tietorakennetta jollekin funktiolle vai voisiko olla mahdollista renderoida nuo kolme peräkkäin selectin sisään.

Itse en empisi hetkeäkään valita tuota tietorakenteeseen pohjautuvaa toimintamallia. En välttämättä yrittäisi päivittää html_select()-funktiotani tukemaan rinnakkaisesti kahta erilaista tietorakennetta, vaan tekisin ehkä toisenkin select-lootia tuottavan funktion.

Jos joku toinen haluaa tehdä eri tavalla, niin tehköön. Kunhan sen nyt tekee jossain mielessä järkevästi.

lainaus:

Eikö noissa epätarkoissa yksinkertaistuksissasikin ole hirveästi kammoksumaasi redundanttia työtä, kun jokaisessa tehdään html-tagit "käsin".

Et ilmeisesti huomannut kommentteja, joissa kerroin kyseen olevan epätarkoista yksinkertaistuksista. Siinä vaiheessa, kun laajennetaan lomakekirjastomme speksejä niin, että kaikilla kentillä pitää voida olla mm. id- ja class-attribuutit ja ties mitä kaikkea, niin pakkohan silloin on alkaa miettiä yksittäisten elementtien renderöinnin abstrahoimista.

latenleffahylly [29.10.2012 09:12:13]

#

Lyhyt kysymys? Miten saisin "SQL SELECT kyselyyn" arrayn mukaan?

// $sarake ---> "R_Id", "rNimi"

$kysely = yhteys()->prepare("SELECT" . $sarake . "FROM" . $taulu . "");

Lebe80 [29.10.2012 09:50:15]

#

latenleffahylly kirjoitti:

Lyhyt kysymys? Miten saisin "SQL SELECT kyselyyn" arrayn mukaan?

Miksi?

latenleffahylly [29.10.2012 11:59:38]

#

Noniin.. Antaa sitten olla. Yritän keksiä miten saisin välitettyä funtiolle sarakkeiden nimet viisaimmailla tavalla.

-tossu- [29.10.2012 12:18:30]

#

SQL-kyselyyn ei voi laittaa arrayta, mutta arrayn voi muuttaa sopivaksi merkkijonoksi implodella.

$kysely = yhteys()->prepare("SELECT " . implode(", ", $sarakkeet) . " FROM " . $taulu);

Mikäli sarakkeiden nimet tulevat käyttäjältä, muista escapoida ne, ettei synny SQL-injektioaukkoa.

The Alchemist [29.10.2012 17:32:52]

#

Late: usko jo nyt jumalauta. Älä tuhlaa aikaasi täysin hyödyttömään mikro-optimointiin, joka kaiken lisäksi tekee koodistasi bloattia, vaan keskity olennaiseen.

Hae kyselyssä KAIKKI taulun sarakkeet. Näin sinulla on yleiskäyttöinen funktio, jota ei ole rajattu vain yhteen käyttötarkoitukseen. Lisäksi helpotat koodin uudelleenkäytettävyyttä siten, että tulet vähentäneeksi redundantteja sidoksia tiettyyn tietorakenteeseen (taulukon indekseihin, jotka kuvaavat jonkin entiteetin ominaisuuksia).

Turhien sarakkeiden lukeminen on todennäköisesti suorituskyvyn kannalta täysin merkityksetöntä.

P.S. Tietysti jos olet kyhäämässä jotain vieläkin geneerisempää funktiota, jota muut tietoja lukevat funktiot kutsuvat, niin sittenhän se on ihan hyvä. Veikkaan vaan ettei näin ole.

latenleffahylly [29.10.2012 21:16:12]

#

Kiitos molemmille. Hyviä pointteja. Alkemistille sellaisia terveisiä että jossain vaiheessa olin jo tekemässä funktiota jolla haen kaiken tiedon taulusta..

Niin ja miten kävikään?? Kerrottiin että et kai vaan hae kaikkea tietoa kerralla. Fiksumpaa hakea sarakkeiden mukaan tai jotain. Mutta, mutta sovellan nyt sitten tuota alkemistin neuvoa. Tossulle sen verran että jos järjestelmä suuri ja tauluissa valtavasti tietoa niin sillä mennään, kiitän!

The Alchemist [29.10.2012 21:18:35]

#

Eipä täällä ole kukaan tuollaista sanonut. Ja jos perusteluita ei ole, niin silloin väittämä on merkityksetön. Jos perustelut on annettu, niin voit verrata eri perusteita keskenään ja siltä pohjalta päättää oman ratkaisutapasi.

Ja kuten sanoin edellisessäkin viestissä, niin sarakkeiden ja taulun määrittäminen voi olla (joskus) vieläkin geneerisempi funktio taulukohtaisten funktioiden "alla", jota nämä taulukohtaiset funkkarit kutsuvat. Mutta muussa käytössä näin pitkälle yleistetty funktio on tyhmä, koska se luo liikaa turhia riippuvuuksia koodiin (ja väärin paikkoihin) ja sitä kautta pilaa kaiken.

latenleffahylly [30.10.2012 10:01:10]

#

Huomenta! Eli olen nyt lukenut tätä topiccia usean nukutun yön jälkeen. Ensin haluan esittää pahoitteluni että en ole ymmärtänyt asioita. Nyt luulen että olen ymmärtänyt.

FUNKTIOT:

- kutsutaan funktioita:

<!--valitse tapahtumalle kuva-->
<?php haeKaikki("kuva", "kLyhenne"); ?>

<!--valitse jv tarve-->
<?php valintalista("jvTarve", "Järjestyksenvalvoja", 1, 50); ?>

- funktiot.php

function haeKaikki($taulu, $sarake) {

  $kysely = yhteys()->prepare("SELECT * FROM " . $taulu . "");
  $kysely->execute();

  echo "<label class='styledLabel' for='" . $sarake . "'>" . $taulu . ":</label>
        <div class='styledSelect2'>
          <select name='" . htmlspecialchars($rivi[0]) . "'>";
          while ($rivi = $kysely->fetch()) {
            echo "<option value='" . htmlspecialchars($rivi[0]) . "'>" . htmlspecialchars($rivi[1]) . "";
          }
  echo "</select></div>";

}

// HUOM! tuo yhteys() hakee PDO tietoja toisesta funktiosta...


function valintalista($nimi, $otsikko, $num1, $num2) {

  echo "<label class='styledLabel' for='" . $nimi . "'>" . $otsikko . ":</label>
        <div class='styledSelect3'>
          <select name='" . $nimi . "'>";
          for ($valinta = $num1; $valinta <= $num2; $valinta++) {
            echo "<option value='" . $valinta . "'>" . $valinta;
          }
  echo "</select></div>";

}

Mielestäni nämä 2 funktiota ovat hyviä koska:

+ koodi yksinkertaistuu
+ yksi kokonaisuus on yhdessä funktiossa
+ funktioita on suht helppo kutsua

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

Toivon että ette hauku. Vaan jos tämäkin tapa aivan päin seiniä niin huoh.. sitten antaa olla. Mielestäni funktiot ovat ihan ok ja hyvin yksinkertaisia, mutta tästä on hyvä jatkaa seuraavalle tasolle, paljon haastavimpien asioiden joukkoon. Erityiskiitos Alkemistille, jonka kirjoituksia olen pyrkinyt tajuamaan, sekä toki kaikille muille jotka ovat auttaneet. Luulen että alan pikku hiljaa tajuta funktioiden perusideaa.

Lebe80 [30.10.2012 10:18:21]

#

Mun mielestä silti "haeKaikki" ei kuvaa tota funktion toimintaa, eli sen toiminto (eli funktio) on rakentaa alasvetolistaa tietokannasta. Eli yhtälailla kuin muuttujien nimet pitää olla kuvaavia, niin myös funktioiden. HaeKaikki ei todellakaan hae kaikkea, vaan se tekee vain ja ainoastaan tuon yhden pienen jutun.

Ja mä tekisin oman funktion tuolle alasvetovalikolle, niitä sulla on jo selkeästi kaksi, eli sulla on monistettua koodia sun koodissasi, mikä selkeästi on jo syy tehdä oma funktio.

Alasvetovalikko-funktion parametreinä voisi olla esim. valikon nimi, taulukko arvoista sekä vaikka valittu arvo.

Alasvetovalikko omana funktionaan mahdollistaisi myös sen, että voit käyttää sitä ihan ilman tietokantaakin, jos vaikka alasvetovalikon arvot kasataankin jossain muualla. Itse en muutenkaan tunkisi tuota alasvetovalikon tulostamista tuonne "haeKaikki" -funktioon, vaan tiedot tietokannasta hakisin nekin omassa funktiossa.

Kun sulla on taulukossa hash-arrayna esim. rivin arvo ja näytettävä teksti, niin taulukon sisältö on looginen ihan ulkopuolisellekin.


En käsitä edelleenkään sun $num1 ja $num2 logiikkaasi. Näyttää just niin räjähdysherkältä koodilta, etten viitsi edes katsoa mistä niiden arvojen pitäisi tulla.

latenleffahylly [31.10.2012 10:47:40]

#

UUSI YRITYS, Tässä nyt 3 funtiota:

- yhteys
- haeKaikkiTieto
- tulostaValintalista

<label class='styledLabel' for="tKuva">Kuva:</label>
<?php
// kutsutaan funktiota
$kysely = haeKaikkiTieto("kuva"); // valitse taulu
tulostaValintalista("tKuva", $kysely, "K_Id", "kNimi"); // valitse 2 saraketta
?>

funktiot.php

<?php
// 1.)

function yhteys() {
  static $yhteys;

  if (!$yhteys) {

    try {
      $yhteys = new PDO("mysql:host=localhost;dbname=testi", "lauri", "123");
    } catch (PDOException $error) {
      die("VIRHE: " . $error->getMessage());
    }
    $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $yhteys->exec("SET NAMES utf8");
  }

  return $yhteys;
}

// 2.)

function haeKaikkiTieto($taulu) {

  $kysely = yhteys()->prepare("SELECT * FROM " . $taulu . "");
  $kysely->setFetchMode(PDO::FETCH_OBJ);
  $kysely->execute();

  return $kysely;
}

// 3.)

function tulostaValintalista($sar0, $kysely, $sar1, $sar2) {

  echo "<div class='styledSelect2'><select name='" . $sar0 . "'>";
  foreach($kysely->fetchAll() as $solu) {
    echo "<option value='" . $solu->$sar1 . "'>" . $solu->$sar2;
  }
  echo "</select></div>";
}
?>

Kaikki ylläoleva toimii. Jos jaksatte kertoa, olenko nyt hieman lähempänä järkevämpää funktio rakennetta?

1.) yhteys
2.) kysely ja sen palauttaminen
3.) kyselyn hyödyntäminen tiedon tulostamisessa

Lebe80 [31.10.2012 11:03:16]

#

Edelleenkään mä en palauttaisi tuota $kysely -oliota, vaan tekisin siitä tuloksesta aina taulukon.

latenleffahylly [31.10.2012 12:10:05]

#

Lebe, mielellään tekisin niinkuin sanot, mutta en ymmärrä mitä tarkoitat. Eli pitäisikö nyt tämän jälkeen-> $kysely->execute();

..tulostaa funktion sisällä? Mitä tarkoitat taulukolla?

Lebe80 [31.10.2012 13:26:43]

#

No tulostuksen sijaan sijoitat ne arvot taulukkoon, esim. ihan riveittäin.

Ja taulukolla tarkoitan ihan taulukkomuuttujaa (array).

edit:
Ja taulukon ideana olisi tietenkin se, ettei listauksissa tarvisi aina olla tietokannasta haettua dataa, vaan voisi käsitellä ihan vaikka kovakoodatuista tauluista ihan vaikka käyttäjien syötteen kautta tulleita taulukoita.

latenleffahylly [31.10.2012 17:01:25]

#

Kutsutaan funktiota ja tulostetaan sisältö:

<?php
$rivit = haeKaikkiTieto("ryhma");
print_r($rivit);

/*
Array ( [0] => stdClass Object ( [R_Id] => 1 [rNimi] => Ulkopuolinen [rKuva] => ulkopuolinen.png [rLyhenne] => up ) [1] => stdClass Object ( [R_Id] => 2 [rNimi] => Järjestyksenvalvoja [rKuva] => jarjestyksenvalvoja.png [rLyhenne] => jv ) [2] => stdClass Object ( [R_Id] => 3 [rNimi] => Toimintaryhmä [rKuva] => toimintaryhma.png [rLyhenne] => tr ) [3] => stdClass Object ( [R_Id] => 4 [rNimi] => Esimies [rKuva] => esimies.png [rLyhenne] => em ) [4] => stdClass Object ( [R_Id] => 5 [rNimi] => Turvapäälikkö [rKuva] => turvapaalikko.png [rLyhenne] => tp ) [5] => stdClass Object ( [R_Id] => 6 [rNimi] => Ylläpitäjä [rKuva] => yllapitaja.png [rLyhenne] => yp ) )
*/
?>

Funktio.php

function haeKaikkiTieto($taulu) {

  $kysely = yhteys()->prepare("SELECT * FROM " . $taulu . "");
  $kysely->setFetchMode(PDO::FETCH_OBJ);
  $kysely->execute();
  $rivit = $kysely->fetchAll();

  return $rivit;
}

- Eli mielestäni funktio palauttaa Arrayn ihan jo automaattisesti. Sittenhän arrayn tietoa voidaan käyttää? Mutta eikö valintalistan tulostamisessa tarvita taas uutta funktiota joka luo listan?

mietinvaan [31.10.2012 18:15:13]

#

Sivuhuomiona voisin sanoa, että sinun kannattaisi tutustua johonkin Model-view-controller (MVC) pohjaiseen ohjelmistokehykseen. Saattaisi olla hyödyllisempää keskittyä ohjelmiston itsensä rakentamiseen eikä pyörän uudelleen keksimiseen: tapoja liikutella dataa tietokannan, ohjelmarakenteiden ja käyttöliittymän välillä on miettinyt moni muukin.

MVC toki on vain yksi malli, mutta sen suosio näyttää lisääntyneen webbikehityksessa. Siihen pohjaavia ohjelmistokehyksiä on monia, esimerkkinä vaikka CodeIgniter tai Zend Framework.

latenleffahylly [31.10.2012 18:20:43]

#

Kiitos vinkistä "M" ...tutkin asian, sanon vain että minua pyydettiin laittamaan tietokannan sisältö arrayhin, nyt kun se on siellä, niin eikö se sitten taas lähetetä uuteen funktioon?

Tämän projektin kohdalla, systeemi toimii, mutta osien muuttaminen funktioihin on hankalaa. Aion kuitenkin oppia funktiot, vaikka myöhemmin siirryn WP:n pariin joka tapauksessa.

Macro [31.10.2012 18:33:44]

#

Funktioita kuuluu käyttää toistuvien asioiden hoitamiseen, jottei samaa koodia tarvitsisi kirjoittaa moneen kertaan. Koko ohjelman sisällön ei kuulu olla funktioiden sisällä.

Ei ole järkevää tehdä funktiota jakolaskua varten, eikä ole järkevää tehdä funktiota jokaista kyselyä kohti.

Vertaa

function divide($number1, $number2) { return $number1 / $number2; }

ja

function connectDB(...) { ... }

Tietokantayhteys avataan monessa paikassa, joten se kannattaa toteuttaa funktiona. Vaikka jakolaskuakin tarvittaisiin useasti, niin sen toteuttaminen on paljon yksinkertaisempaa /-operaattorilla.

latenleffahylly [31.10.2012 19:08:03]

#

Okei, tiedän että yritätte auttaa, mutta sain käsityksen että yhden funktion sisällä voisi tehdä näin:

- annetaan taulun nimi, kun kutsutaan funktiota
- haetaan kaikki tieto taulusta
- tallennetaan taulun tiedot muuttujaan ja palautetaan se


Näin ollen tämä $muuttuja voidaan hyödyntää jatkossa, jos se ensin laitetaan osiin. Esim. $sar1 sisältäisi:

1
2
3
4
5

$sar2 sisältäisi

jv
tr
em
up
yp

Lisäys: - Muuten olenko tekemässä funktion jokaista kyselyä kohti? Mielestäni voin päättää mistä taulusta kaikki tiedot haetaan. Tämä tieto pitää saada johonkin talteen jotta voin lähettää sitä funktioihin joka esim. tulostaa SELECT elementin (valintalista)

Lisäys:

Tässä se mitä palautuu funktion jälkeen:

$rivit = haeKaikkiTieto("ryhma");
print_r($rivit);

Array (

  [0] => stdClass Object (

    [R_Id] => 1
	[rNimi] => Ulkopuolinen
	[rKuva] => ulkopuolinen.png
	[rLyhenne] => up

  )

...

)

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

Sen verran vielä, että toiveeni olisi että voisin tehdä edes yhden funktion oikein. Eli en halua oppia väärää tapaa. Nähtävästi tuo esittämäni tapa on väärä.. Voiko joku kertoa onko tuollainen array huono?

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

Noniin kiitos harhaanjohtamisesta, pääsimpäs näyttämään osaamiseni =)

<?php
$rivit = haeKaikkiTieto("ryhma");

foreach ($rivit as $rivi) {
    echo $rivi->rKuva . "<br>";
}

// tulostaa...

ulkopuolinen.png
jarjestyksenvalvoja.png
toimintaryhma.png
esimies.png
turvapaalikko.png
yllapitaja.png
?>

mietinvaan [31.10.2012 20:24:49]

#

Tavallisesti dataa kulkee kahteen suuntaan: tietokannasta käyttöliittymään ja toisinpäin. Tällöin on olioiden käytössä joitakin etuja taulukkoihin verrattuna.

Olkoon tämä esimerkki nyt samalla lyhyt johdatus MVC-mallin model-osalle.

/**
 * Oletetaan tietokantataulu "Record", josta löytyvät kentät
 * "id" ja "information".
 */
class Model_Record {

    // Vastineet tietokantataulun kentille
    private $id;
    private $information;

    public function setId($id) {
        // Datan validointi olion set-metodeissa tekee asiat helpoiksi
        if (!is_int($id)) {
            throw new Exception('Muuttuja id ei ollut luku!');
        } else {
            $this->id = $id;
        }
    }

    public function getId() {
        return $this->id;
    }

    public function setInformation($information) {
        if (strlen($information) > 1000) {
            throw new Exception('Liikaa tietoa (max. pituus 1000 merkkiä)');
        } else {
            $this->information = $information;
        }
    }

    public function getInformation() {
        return $this->information;
    }

    // Kirjoittaa luokan kenttien "id" ja "information" arvot tietokantaan
    public function insert() {
         $sql = "INSERT INTO Record (Information) VALUES (?)";
         $info = $this->getInformation();
         if ($info == null) {
             $throw new Exception("Ei tallennettavaa tietoa!");
         }
         // Kuvitteellinen db luokka, jonka exec metodi
         // ottaa vastaan sql-kyselyn ja siihen liiskattavat
         // parametrit taulukkona
         $result = $db->exec($sql, array($info));
         // tarkista onnistuiko insert ym.
    }

    // Hakee tiedon "information" annetun id:n perusteella
    public function select() {
        // täytä luokan kentät haetulla tiedolla
    }

}

Tällainen "malli" kun nyt on olemassa, niin aina kun ilmaantuu tarve käyttää kyseistä record-taulua, ohjelmakoodi noudattelee seuraavanlaista kaavaa:

// Tiedon viennin osalta esim:
Model_Record $rm = new Model_Record();
try {
    // $blaa tulee nyt vaikka sieltä käyttöliittymästä
    $rm->setInformation($blaa);
    $rm->insert();
} catch (Exception $e) {
    // Ja nyt siellä käyttöliittymässä sitten näkyisi virheviesti,
    // jos tänne jouduttiin.
    // Kannattaa harkita ainakin muutamaa erilaista exception-luokkaa,
    // koska osa virheistä johtuu käyttäjästä (virheellinen syöte) ja
    // osa jostain muusta, kuten tietokantaan yhdistysvirheistä tms.
}
// kaikki hyvin

Koodi kirjoitettu parissa minuutissa ja sisältää todennäköisesti joitakin virheitä. Perusidea siitä toivottavasti kuitenkin välittyy. MVC-mallin model-osa siis on luokka, joka operoi tietokannan kanssa. Vaikka et suoraan MVC-malliin siirtyisikään, niin pelkästään kuvatun kaltaisten luokkien kirjoittelu tekee asiat kohtuullisen helpoiksi ja erottaa tietokannan käsittelyn selkeäksi omaksi osakseen. MVC-mallikaan ei ole täysin aukoton ja se voidaan toteuttaa useammalla hieman erilaisella tavalla. Suosittelen lukemaan jonkin kunnollisen oppaan, niitä on internet pullollaan.

EDIT: Tosiaan, ne taulukot. Uskoisin että osaat itsekin sanoa mitä etuja tällä oliolähestymistavalla saadaan. Yllä olevasta aika pitkälle käy ilmi koko olio-ohjelmoinnin perusidea: laitetaan tieto ja sen käsittely yhteen pakettiin.

latenleffahylly [31.10.2012 22:27:35]

#

Tuota, tuota.. selkeästi hallitset HC-koodauksen. Unohdat kuitenkin sen että itse tein ensimmäisen huonon funktion pari viikkoa sitten. Tänään luulin tehneeni ensimmäisen funktion jossa olisi kunnolla järkeä.

Tuo tapasi on varmasti järkevä, hyvä jne. mutta minulle se ei vielä aukea. Siksi kysyin apua.. tajuan viimein että te KAIKKI yritätte sanoa rivien välistä: "luovuta jo, et koskaan opi koodaamaan PHP:tä"

..eli vaikka funktioni on täysin toimiva, niin se on jotenkin todella typerällä tavalla tehty ja siksi se tarkoittaa että en ymmärrä koodauksesta mitään??

<?php
function haeKaikkiTieto($taulu) {

  $kysely = yhteys()->prepare("SELECT * FROM " . $taulu . "");
  $kysely->setFetchMode(PDO::FETCH_OBJ);
  $kysely->execute();
  $rivit = $kysely->fetchAll();

  return $rivit;
}


// tulostaa...

/**
 * $rivit = haeKaikkiTieto("ryhma");
 * print_r($rivit);
 *
 * Array (
 *
 *   [0] => stdClass Object (
 *
 *     [R_Id] => 1
 *     [rNimi] => Ulkopuolinen
 *     [rKuva] => ulkopuolinen.png
 *     [rLyhenne] => up
 *
 *   )
 *
 *   ...
 *
 * )
*/

?>

- yllä oleva koodi hakee kaiken tiedon halutusta taulusta. Palauttaa tiedot arrayn sisällä, jossa tiedot ovat objektejen sisällä, mutta taas väärin??

The Alchemist [01.11.2012 09:10:49]

#

latenleffahylly kirjoitti:

function haeKaikkiTieto($taulu) {

  $kysely = yhteys()->prepare("SELECT * FROM " . $taulu . "");
  $kysely->setFetchMode(PDO::FETCH_OBJ);
  $kysely->execute();
  $rivit = $kysely->fetchAll();

  return $rivit;
}

(1) Eli mielestäni funktio palauttaa Arrayn ihan jo automaattisesti. Sittenhän arrayn tietoa voidaan käyttää? (2) Mutta eikö valintalistan tulostamisessa tarvita taas uutta funktiota joka luo listan?

1. Funktioiden palautusarvot eivät ole mielipidekysymys. Tulosta palautettu arvo ja katso, mitä dataa olet saanut. Älä arvaile.

2. Miksi joudut vieläkin kysymään asioita, joihin sinulle on vastattu lukuisia kertoja ihan muutamia päiviä sitten? Itsekin annoin jopa käytännön esimerkin aiheesta. Jos sinun tarvitsee jatkuvasti iteroida samojen asioiden päällisiä, niin toista mieluummin vastausten lukemista kuin kysymyksen esittämistä.

latenleffahylly [01.11.2012 16:58:10]

#

Alkemisti kirjoitti:

1. Funktioiden palautusarvot eivät ole mielipidekysymys. Tulosta palautettu arvo ja katso, mitä dataa olet saanut. Älä arvaile.

Enkö juurikin kertonut että palautin Arrayn? (eli taulukon)..

// tulostaa...

/**
 * $rivit = haeKaikkiTieto("ryhma");
 * print_r($rivit);
 *
 * Array (

....Kysyin onko se hyvä että arrayn sisällä on objekteja. No en tarvi vastausta koska tiedän että esittämäni tapa on oikein hyvä. Luulen että alan karistamaan Noviisin mainettani ja tämä on kova paikka joillekkin. Yritän parantaa jatkossa ulosantia.

The Alchemist [01.11.2012 17:26:26]

#

Loppuviimein yksi hailee, käyttääkö perustietotyyppinä taulukkoa vai stdClass-oliota, ne kun ovat käytännössä keskenään vaihdannaisia. Ennemmin käyttäisin "kotitekoisia" luokkia, jolloin niiden sisältämät muuttujat ja metodit olisivat helpommin pääteltävissä. Tämä myös siksi, etteivät taulukot tai stdClass-oliot voi periaatteessa käsittää metodeita, joten triviaaleja asioita joutuu tekemään vaikeamman kautta.

(Esimerkiksi ihmisen koko nimen muodostaminen, jos oliolla on vain jäsenet firstName ja lastName.)

latenleffahylly [01.11.2012 18:13:39]

#

Mielenkiintoista. Voitko "A" arvioida pitäisikö minun tehdä lisää fiksumpia funktioita, opetella jotain ihan perusteita vai tutkia luokkia ja olioita? Juttu on se että aion jokatapauksessa päästä php:ssä tietylle tasolle.

Tulevaisuudessa voin tehdä Wordpressin avulla paljon asioita kun hallitsen php:tä.

mietinvaan [01.11.2012 20:31:55]

#

Pahoittelut, en osannut arvioida kuinka pitkällä ohjelmoinnin opettelussa olet, kun en jaksanut lukea kuin muutaman viimeisimmän viestin.

Ohjelmointia oppii ohjelmoimalla, ei kannata luovuttaa. Olethan jo kuitenkin selvästi ensimmäisen suurimman osan ohittanut, joka on ohjelmakoodin syntaksin kanssa taistelu. Nyt sitten ne perusrakenteet ja pikkuhiljaa siitä eteenpäin.

Työvuoron varausohjelma voi toki olla hieman iso pala jos on vasta alkeissa menossa. Kun se valmistuu osaat todennäköisesti jo ohjelmointia sen verran paremmin, että se kannattaa kirjoittaa alusta saakka uudelleen.

Lisäys: PS. Ideaalisesti yksi funktio (tai metodi jos olioista puhutaan) tekee yhden asian. starttaaAuto(); yhdistaTietokantaan(); vedaVessa(); jne :-)

The Alchemist [01.11.2012 21:30:23]

#

No minusta sinulla on liian pahasti hakusessa ohjelmoinnin filosofia. Siis yleispiirteinen käsitys siitä, miten koodi pitäisi palastella esimerkiksi funktioihin ja miten niitä pitäisi käyttää.

Mitään yhtä ja ainoaa ratkaisua ei tietenkään ole olemassa, mutta valitsemasi vaihtoehdot ovat yksiselitteisesti melko huonoja. Vaan kun asiat eivät tule selviksi edes suorien käytännön esimerkkien kautta, niin sitten ei ehkä kannata jäädä arpomaan näennäisesti yksinkertaisten asioiden päällisiä viikkokausiksi. Toivokaamme, että joskus tämä valaistuminen tapahtuu muiden asioiden ja kokemuksen kautta.

Tästä syystä ehdotin sitä WP:n opettelua jo aiemmin: tällöin tulet tutustuneeksi siihen, miten koodia pitää* aikuisten oikeasti kirjoittaa. On täysin irrelevanttia, miten hyvin osaat php:n standardikirjaston ulkoa, koska ne funktiot ovat suurimmaksi osaksi sekavia ja vailla mitään logiikkaa. Esimerkiksi Zend Frameworkin kanssa on lähdetty siitä, että monet php:n valmiiksi sisältämätkin funktiot on korvattu uusilla luokilla, joita tulisi käyttää standardikirjaston toimintojen sijaan. (Toki tämä luokat voivat käyttää ko. funktioita pellin alla.)

Samalla tavoin itse en käytä php:n superglobaaleita ($_GET, $_POST, ...) koodissani vaan olen koodannut eri tavan käsitellä http-pyynnön mukana välitettyjä parametreja. Edelleen nämä viritelmäni käyttävät pellin alla kyseisiä muuttujia, mutta täsmälleen yhdessä kohdassa, jonka jälkeen ne tuhotaan unset():lla. Näin ovat Zendin kehittäjätkin tehneet.

* En ole tutustunut WordPressin kirjastoihin, joten en voi vannoa, että suosittelisin sitä alustana itse, mutta oletan sen olevan varsin mukiinmenevä ympäristö.

latenleffahylly [01.11.2012 21:52:13]

#

Suurkiitokset molemmille ("M" & "A"). Ymmärrän alkemistin turhautumisen, mutta on todettava että aloin opetella funktioita noin kuukausi sitten. Sanon vain tuosta ensimmäisestä oikeasta funktiostani (haeKaikkiTieto) ..sen että siinä tapauksessa on hyvä hakea kaikki tieto.

Tätä funktiota voidaan nopeasti laajentaa hakemaan taulujen sarakkeiden tietoja, oletan. Mutta, mutta WP:stä minulla on kokemusta. Omat websivuni.

Toinen asia kun sanot että en opi edes esimerkeistäsi, niin haluan edetä askel kerrallaan ja huom! minusta ei tule koskaan huippu php-koodaria koska aivoni ovat eri maata. Värit, käyttöliittymät, ulkoasu, suunnittelu, dokumentointi, kuvankäsittely, valokuvaus (css3,html5,responsive design)... jne. tälläiset asiat tulevat geeneistä. Painotan kuitenkin että haluan oppia PHP:tä jotta pystyn ymmärtämään WP:tä. Huom! WP:n sisään olen aikaisemminkin laittanut omaa koodia.

Tavoite: "Ohjelmointia oppii ohjelmoimalla, ei kannata luovuttaa."
Taso: "osaan koodata Tapahtumapalvelun käyttäen olio-ohjelmointia"
aika: 1-2 vuotta

Tutkitaan-> "Nyt sitten ne perusrakenteet ja pikkuhiljaa siitä eteenpäin."

Totta mutta myös tarua-> "Työvuoron varausohjelma voi toki olla hieman iso pala jos on vasta alkeissa menossa."

Ensimmäinen versio 1 on jo käytössä. Tuotolla hankin (iPad 3gen. 16GB, Wi-Fi)

Kiitos paljon-> "Ideaalisesti yksi funktio tekee yhden asian." .....huom! tällaisia neuvoja Alkemistin tasoinen koodari ei pysty antamaan, koska ei tajua että tasoni on edelleen: Noviisi, eli pitää rautalangasta vääntää.

Esimerkki neuvosta jota en täysin ymmärrä-> "No minusta sinulla on liian pahasti hakusessa ohjelmoinnin filosofia."

Kiitos-> " valitsemasi vaihtoehdot ovat yksiselitteisesti melko huonoja"

???-> "Esimerkiksi Zend Frameworkin kanssa on lähdetty siitä, että monet php:n valmiiksi sisältämätkin funktiot on korvattu uusilla luokilla..."

Eikö luokista ollut juuri puhe kun kysyin kannattaako minun

A.) keskittyä perusteisiin
B.) harjoitella funktioita lisää ja lisää
C.) tutkia luokkia ja olioita

Korkean tason koodarin puhetta kirjoitti:

Samalla tavoin itse en käytä php:n superglobaaleita ($_GET, $_POST, ...) koodissani vaan olen koodannut eri tavan käsitellä http-pyynnön mukana välitettyjä parametreja. Edelleen nämä viritelmäni käyttävät pellin alla kyseisiä muuttujia, mutta täsmälleen yhdessä kohdassa, jonka jälkeen ne tuhotaan unset():lla.

..huoh, kiitän.. että sellaista tänään.

The Alchemist [01.11.2012 22:28:37]

#

Moni meistä on sanonut jo aiemmin, että funktioiden pitäisi olla ns. atomisia eli tehdä mahdollisimman vähän. Tätä väittämää pitäisi vielä tarkentaa siten, että funktion toteutuksen eli sen sisältämän koodin pitäisi olla melko lyhyt pituudeltaan.

Sanoin itse myös sen, ettei näiden yleiskäyttöisten funktioiden käyttö suoraan ole kuitenkaan aina järkevää: joskus on parempi kirjoittaa funktio, joka tekee vähän enemmän / useampia asioita, mutta sen toteutuksen tulisi kuitenkin käyttää näitä yleiskäyttöisempiä funktioita. Toisin sanoen on ihan ok välillä tehdä myös funktioita, jotka eivät ole niin yleiskäyttöisiä.

Väärien vaihtoehtojen valitsemisella viittasin taannoiseen ja läpikotaisin puituun select-laatikon tulostamiseen. Monet meistä kertoivat sinulle, että olisi järkevää tehdä funktio, jolle annetaan lista tulostettavista arvoista muodossa "arvo => seliteteksti". Minä annoin jopa käytännön koodiesimerkin.

Silti päädyit tuohon kyseenalaiseen toteutukseen, jossa annatkin selkeän listan sijaan satunnaisen taulukollisen dataa ja kaksi satunnaista indeksiä, joita käyttämällä saat jotenkin taiottua kasaan pudotusvalikon. No miksi sellainen toteutus on huono?

1. On täysin selvää, että joskus haluatkin käyttää tekstinä jotain dataa, mitä ei taulukossa ole valmiiksi, vaan se pitää muodostaa esim. kahden eri sarakkeen arvoista.

2. Funktion rajapinta oli sekava: tarvittavat parametrit olivat aikalailla tuulesta temmattuja ilman mitään perusteita -> koodarin on vaikea oppia funktion käyttö ulkoa, koska loogisesti ajatellen parametrien pitäisi olla ihan jotain muuta. Ja jos kaikki samantapaiset funktiot tehtäisiin käyttämään yhtä sekavia rajapintoja, niin ne olisivat luultavasti kaikki keskenään hyvin erilaisia -> sisäistämisen vaikeus kasvaa potensseissa.

Kohdalla 2 tarkoitan nyt sitä, että selkeästi loogisin vaihtoehto pudotusvalikon tulostavalle funktiolle olisi antaa kolmen parametrin (taulukko, arvon indeksi, selitetekstin indeksi) sijaan YKSI parametri (taulukko muodossa arvo => seliteteksti). Nyt funktion rajapinta on myös loogisesti yhteneväinen monien muiden vastaavien funktioiden kanssa.

Esimerkiksi jos haluat tulostaa listan asioista (vaikka eläimistä tai ihmisistä), niin voit tehdä funktion print_list($items) sen sijaan että tekisit esimerkiksi funktion print_list($data, $value_key). Tai jotain muuta yhtä arvoituksellista. Kyse on siis lähinnä redundanttien parametrien eliminoimisesta.

latenleffahylly [02.11.2012 09:16:38]

#

Tutkin tänään kirjoituksesi. Vkl aikana teen paremman funktion (select). Sanon kuitenkin vielä sadannen kerran sen että ohjelmoinnissa syvällä olevien ihmisten on lähes mahdoton asettua Noviisin asemaan.

Osa kertomastasi ei aukea minulle välttämättä koskaan. Koska sanamuodot ja käsitteet ovat ylemmän tason ohjelmointia. Olisi muutenkin mukava jos "A" voisi yhden tunnin ajan tutustua Wordpressiin ja kertoa mitä mieltä hän on esim. Wordpress Templaten: "Responsive" -rakenteesta (lähdekoodi).

Tarkoitan tällä sitä että se on sinulle uutta, oletan. Nämä funktiot ovat minulle uutta, arrayt vaikeita ja koodirakenteen hahmottaminen mahdotonta. Nyt kuitenkin kauppaan, tuoretta leipää ja kahvia...

Jaska [02.11.2012 14:14:00]

#

latenleffahylly kirjoitti:

Sanon kuitenkin vielä sadannen kerran sen että ohjelmoinnissa syvällä olevien ihmisten on lähes mahdoton asettua Noviisin asemaan.

Tuota logiikkaa en ymmärrä yhtään. Jokainen kokenut ohjelmoija on ollut joskus noviisi. He ovat selvinneet tuon vaiheen yli osaajaksi. Heillä on siten kokemusta siitä, miten tuo prosessi tapahtuu ja voivat antaa vinkkejä siitä, miten asioita kannattaa hahmottaa.

The Alchemist [02.11.2012 15:30:17]

#

latenleffahylly kirjoitti:

Tutkin tänään kirjoituksesi. Vkl aikana teen paremman funktion (select).

Miksi? Mitä se auttaa? Vaikkei tämä olekaan mikään taivaasta pudonnut universaali totuus, niin olen monesti sanonut, ettei alkeisiin pidä takertua ja jäädä iteroimaan pikkuasioiden päällisiä. Olen antanut sinulle toimivan esimerkkiratkaisun, joka hakkaa kaikki tähänastiset yritelmäsi, joten sen kuin kopioit sen ja lähdet siitä jalostamaan laajempaa versiota, jos laajempaa toiminnallisuutta tarvitset.

Joka tapauksessa kaikki tuon select-laatikon tulostamiseen käyttämäsi tunnit, päivät ja viikot ovat kaikki hukkaanheitettyä aikaa: WordPressissä on jo omat työkalunsa lomake-elementtien ja kokonaisten lomakkeiden hallitsemiseen.

latenleffahylly [03.11.2012 10:34:19]

#

$sql = '
  SELECT
    a.id,
    a.url,
    a.parent_id,
    a.name,
    a.content

  FROM pages a
  ORDER BY a.name
';

Voisiko yllä olevan kohdalla olla tällainen taulu:

Sivut
sId ---> 1
sUrl ---> http://localhost/tapahtumapalvelu/index.php?sivu­=etusivu
sRyhmaId --->1
sNimi ---> etusivu
sSisalto ---> ?

Tuleeko tietokannassa esim. sisältö kohtaan tekstiä tai jokin html-rakenne, jonka sisällä teksti ja kuvalinkit ovat? Ajattelin laittaa omat sivuni tietokantaan. Nyt ne ovat index.php -tiedostossa näin:

// sisältö sivut
$sivut = array(
  'testi' => 'testi.php',
  'etusivu' => 'etusivu.php'
);

The Alchemist [04.11.2012 10:00:36]

#

Ainakaan sivun urlia ei kannata tallentaa kantaan eikä varsinkaan protokollamäärittelystä ja domainista alkaen. Osoitteen voi muodostaa ajonaikaisesti linkkiä luotaessa ja samoin http-pyynnön osoitteesta voi päätellä haettavan sivun tunnisteen.

Sisältöäkään en tallentaisi yhtenä könttänä vaan tekisin sen niin, että yhdelle sivulle voi lisätä monta "klippiä", jotka voivat olla tietotyypiltään vaikkapa rikastekstiä tai dynaamista sisältöä.

"Dynaamisella sisällöllä" tarkoitan esimerkiksi sitä, että jos sivustolla on kuvagalleriamoduuli, niin tuollainen "klippi" voisi sisällyttää vaikka tietyn gallerian listauksen tai yksittäisen kuvan siten, ettei erikseen tarvitse syöttää koodiin kuvagallerian html-rakennetta kuvineen vaan moottori osaisi automaattisesti hakea pudotusvalikosta valitun gallerian sisällön ja tulostaa sen haluttuun kohtaan sivulle.

Ilmeisesti et sitten kuitenkaan käytä sitä WordPressiä vaan olet puhtaalta pöydältä kasannut sivusi?

Metabolix [04.11.2012 11:58:51]

#

PHP-koodin tallentaminen tietokantaan on yleensä hölmöä ja taitamattoman tekemänä myös erittäin vaarallista.

The Alchemist [04.11.2012 18:00:31]

#

Tässähän oli ilmeisesti kyse oman cms:n tekemisestä eli siis ohjelmistosta, jonka avulla voi yksityistä sivustoa ylläpitää. Silloin ei ole välttämättä hirveästi väliä, mitä kaikkea voi admin-liittymästä tehdä, koska sivusto on joka tapauksessa ylläpitäjänsä vallassa. Mutta jos tarvitsee kylvää php-koodia cms:n sisällönsyöttötoimintojen kautta, niin se yleensä kertoo siitä, ettei cms-järjestelmä sisällä kaikkia tarvittavia toimintoja.

Jos tuo nyt liittyi minun aiempaan viestiini, niin sitten et ymmärtänyt, mitä itse tarkoitin.

Metabolix [04.11.2012 18:06:22]

#

The Alchemist kirjoitti:

Tässähän oli ilmeisesti kyse oman cms:n tekemisestä

Ehkä olen jättänyt jotain lukematta, mutta minusta tässä on kyllä edelleenkin kyse ihan muusta projektista, jostain tapahtumien järjestämiseen liittyvien työvuorojen varaamisesta.

The Alchemist [04.11.2012 18:09:47]

#

Niin no, en itse enää tiedä, että liittyykö viime aikoina vallinnut keskustelu enää mitenkään työvuoronvarausohjelmaan. Luullakseni tässä on lennosta vaihdettu milloin mihinkin aiheeseen. Joskus on ollut puhetta WordPressin käyttämisestä alustana, mikä ei ainakaan voi mitenkään liittyä äsköiseen puheeseen sivujen siirtämisestä tietokantaan, toisaalta paljon on myös käytetty aikaa select-laatikoita tuottavan koodin kanssa arpomiseen ja muuhun pieneen näpertelyyn.

latenleffahylly [04.11.2012 21:19:06]

#

Noniin.. Eli versio 1 on WP+oma koodi. Versio 2 pelkästään oma koodi. Tutkin vain tuota sql lausetta ja siksi kysyin, kun siinä esim. Url sarake.

Olen tätä versio kahta tehdessä tajunnut kuinka hieno asia WP on. Hyöty on kuitenkin se että joudun miettimään kaiken itse. Esim. Kirjautuminen ja istunnot.

Lebe80 [05.11.2012 10:36:32]

#

Mitä haittaa siitä on, että myös se lopullinen versio olisi WP+oma pulikka?

latenleffahylly [05.11.2012 19:14:16]

#

Eli nyt haluan ehdottomasti tehdä kaiken itse jotta opin. Parhaassa tapauksessa versio 3 käyttää WP:tä ja varsinkin Responsive Design filosofiaa.

Lebe80 [05.11.2012 21:07:28]

#

Responsive Design ei liity tähän mitenkään. Tai toivon ainakin ettei järjestelmäsi ole riippuvainen siitä, millainen ulkoasu sivustollasi on.

latenleffahylly [05.11.2012 21:35:48]

#

Tarkoitin että WP:ssä on templateja jotka tukevat tätä ideologiaa. Haluan että tapahtumapalvelu toimii näillä:

-desktop
-laptop
-tablet
-smart phone

Kysymys, yritän tehdä popup boxia joka avaisi varaa työvuoro lomake näkymän. Miten ja mistä te lähtisitte hakemaan etsimään tietoa? (mm. jquery ui kirjasto ei tällaista valmiiksi sisällä).

Ennen kuin joku sanoo google ja että se on täynnä malleja. Niin toivomus olisi luotettava tutoriaali joka tukisi vanhaa ja ottaisi huomioon responsive design idean. Huom! Kysyn vain miten te ratkaisisitte asian.. Mistä aloittaisitte?

Lebe80 [06.11.2012 10:40:37]

#

latenleffahylly kirjoitti:

Ennen kuin joku sanoo google ja että se on täynnä malleja. Niin roivomus olisi luotettava tutoriaali joka tukisi vanhaa ja ottaisi huomioon responsive design idean. Huom! Kysyn vain miten te ratkaisisitte asian.. Mistä aloittaisitte?

Aika paljon Google kuitenkin näytti, miten jQuery UI:n dialog-ikkunaan ajaxilla ladataan sisältöä.

The Alchemist [06.11.2012 19:00:44]

#

Miten niin jQuery UI -kirjasto ei valmiiksi sisällä tarvittavia palikoita? Millaista ratkaisua sitten etsit?

latenleffahylly [06.11.2012 20:50:11]

#

Popup ikkuna ok, mutta onko tooltip muka tähän verrattavissa? No joo.. Jatkossa tulen joka tapauksessa tarvitsemaan popup ikkunoita, ja tooltip systeemejä, joten ehkä jQuery kurssi olisi hyvä.

Lebe80 [06.11.2012 21:04:06]

#

latenleffahylly kirjoitti:

Popup ikkuna ok, mutta onko tooltip muka tähän verrattavissa? No joo.. Jatkossa tulen joka tapauksessa tarvitsemaan popup ikkunoita, ja tooltip systeemejä, joten ehkä jQuery kurssi olisi hyvä.

Tooltip? Ollaanko me enää edes samassa internetissä?

The Alchemist [06.11.2012 22:10:45]

#

No ei tietenkään mikään tooltippi toimi mutta dialogi-ikkuna olisi jo jotain. Tai ainakin äsken vielä sanoit haluavasi dialogi-ikkunan, siksi ihmettelinkin, että miksei se muka kelpaa.

latenleffahylly [07.11.2012 13:03:22]

#

Ok, sanavirhe.. dialogi ikkuna parempi. Nyt taistelen SQL-lauseita vastaan... ja toivon pääseväni niistä vielä joskus eroon.

Lebe80 [07.11.2012 14:51:07]

#

latenleffahylly kirjoitti:

Ok, sanavirhe.. dialogi ikkuna parempi. Nyt taistelen SQL-lauseita vastaan... ja toivon pääseväni niistä vielä joskus eroon.

Joo, hemmetisti selventää se, että puhutaan samoilla termeillä, varsinkin kun käyttämäsi termit on yleisesti käytössä ja tarkoittavat aivan eri asiaa.

The Alchemist [07.11.2012 16:02:46]

#

JQuery UI -kirjastossa on valmiina widgetteinä sekä Dialog että Tooltip, joten mitähä lie mahdettukaan alun perin tarkoittaa...

Lebe80 [07.11.2012 16:04:05]

#

The Alchemist kirjoitti:

JQuery UI -kirjastossa on valmiina widgetteinä sekä Dialog että Tooltip, joten mitähä lie mahdettukaan alun perin tarkoittaa...

Toisaalta, mitä odottaa ihmiseltä, jolle ei saa sanoa "Google on täynnä malleja"...

qeijo [07.11.2012 16:47:51]

#

Täytyy sanoa tässä vaiheessa että;

Liirum laarum lallatilaa, Dibadaabaa doobermanni trallallaa.
Lööpi troopi trokaridaa, lorem ipsum ftw afk.

http://www.youtube.com/watch?v=reTx5sqvVJ4

latenleffahylly [07.11.2012 17:28:02]

#

Olipahan video kun ei edes tabletilla toimi. No joo... Eli käsitin että popup ikkuna tai popup box on yleinen termi. Klikkaa linkkiä ja tällainen lomake ilmestyy tyhjästä.

Elokuva-aiheiset web-sivuni sisälsivät aikoinaan tällaisen tavan varata elokuva. Sitten arvostelijoilleni tiedoksi että php osaamiseni on mennyt eteenpäin. jQueryä en osaa mutta jonain päivänä ehkä osaankin. WP tulee myös olemaan keskeisessä roolissa, mutta ette voi suuttua heti siitä jos funktiot eivät ihan heti aukea...

The Alchemist [08.11.2012 07:33:39]

#

Jos vähän keskustelua seuraisi... Minä kommentoin sitä, ettei tietenkään JQuery UI:n Tooltip-widgetti toimi, koska se on tarkoitettu ihan muihin asioihin. Sen sijaan oikeampi lähtökohta olisi ollut Dialog-widgetti. Kukaan ei ole nostanut esille popup-termin käyttöä. Eikä se ole mikään "sanavirhe", jos ehdottaa aivan täysin väärää komponenttia.

latenleffahylly [08.11.2012 08:31:11]

#

Alkemisti kirjoitti:

Sen sijaan oikeampi lähtökohta olisi ollut Dialog-widgetti. Kukaan ei ole nostanut esille popup-termin käyttöä.

Niin... siis minä nostin "termin" koska olen tähän saakka ollut siinä uskossa että popup box tarkoittaisi jotain tällaista, kuin nämä Google otsikot:

- 32 Best jQuery Popup Window Dialog Box Example | Smashing Spy
- Best 10 jQuery Popup Window Tutorials | jQuery4u

Dialog-widget on terminä tuntematon. Eli idea klikkaa linkkiä ja eteesi ilmestyy uusi ikkuna, jossa esim. form. Tänään kuitenkin harjoittelen olio-ohjelmointia (putkan oppaat)

qeijo [08.11.2012 10:09:32]

#

Etkö käy töissä?

The Alchemist [08.11.2012 11:11:18]

#

latenleffahylly kirjoitti:

Dialog-widget on terminä tuntematon. Eli idea klikkaa linkkiä ja eteesi ilmestyy uusi ikkuna, jossa esim. form. Tänään kuitenkin harjoittelen olio-ohjelmointia (putkan oppaat)

Itse sanoit, ettei JQuery UI sisällä tarvitsemiasi asioita. Kuten sanottua, sekä Tooltip että Dialog ovat JQuery UI:n widgettejä. Miten nämä voivat olla sinulle tuntemattomia asioita, kun kuitenkin tiedät sanoa, ettei JQuery UI:ssa ole tarvittavia palikoita?

Lebe80 [08.11.2012 11:21:12]

#

latenleffahylly kirjoitti:

Dialog-widget on terminä tuntematon. Eli idea klikkaa linkkiä ja eteesi ilmestyy uusi ikkuna, jossa esim. form.

- Klikkaa linkkiä *Check*
- Uusi ikkuna *Check*
- Form *Check*
- (jQuery UI *Check*)

http://jqueryui.com/dialog/#modal-form

Löytyy siis ihan jQuery UI:n omista esimerkeistä.
edit:
Sen sijaan että käyt täällä kyselemässä useamman kerran päivässä tyhmiä, niin suosittelen oikeasti paneutumaan (katso vaikka kaikki esimerkit läpi) vaikkapa aluksi tuohon jQueryUI:n omiin esimerkkeihin.

Kukaan ei sanonut että ohjelmointi on helppoa, mutta kun itse osaa etsiä tietoa, niin homma helpottuu huomattavasti.

The Alchemist [08.11.2012 13:15:00]

#

Ongelma on kai se, että Late haluaa "tutoriaaleja", joilla ilmeisesti tarkoittaa jotain sellaista opasta, jossa opetettaisiin vain ja ainoastaan halutut asiat nollasta täydellisyyteen ja mielellään vielä kuvien kanssa. Tällaisia oppaita et tule ikinä löytämään, vaan joudut opettelemaan koostamaan tietoa eri puolilta nettiä kerätyistä murusista.

latenleffahylly [08.11.2012 22:56:34]

#

Noniin.. Olen ehkä vihdoin ja viimein tajunnut jotain kovan painostuksen alla. Eli perjantai omistetaan tällaiselle asialle:

Harjoitus, jossa mm. Funktioiden teko, tietokantaan vieminen, hakeminen, yhdistäminen, hitusen luokkia, olioita ja lomake.

(!) APUNA SAA KÄYTTÄÄ AINOASTAAN PHP DOKUMENTAATIOTA (php.net)

- nyt idea on että koodaisin tyhjästä itse ja tarkistaisin manuaalista miten syntaksi kirjoitetaan, tai miten arrayta tai foreach tageja käytetään... Toki toivon että alan tekemään näin perjantaista lähtien aina. Ohjelmointiputka oppaat ovat upeita, niihin on käytetty valtavasti työtä, ne ovat viimeisteltyjä kokonaisuuksia ihmiseltä, joka ymmärtää php:n syvintä olemusta.

Olen tehnyt suuren virheen kun olen ensin lukenut opasta, kopioinut malleja ja vielä yrittänyt muuttaa niitä omiin tarkoituksiini. Hmm.. Luulen että paras tapa on jokin tehtävä:

1.) tee lomake
2.) yhdistä tietokantaan funktio
3.) tallenna kantaan funktio
4.) hae + tulosta kannasta funktio
5.) kiedo asiat luokan sisään

Nyt tehtävä on jakaa kukin kohta pienempiin osiin. Huom! Kirjoita ensin paperille mitä teet. Sitten koodaa tyhjästä. Ja ainoa paikka josta saa tutkia on php.net ja sielläkin mieluiten syntaksi ja php elementin käyttötarkoitus.

Pitää oppia tulostamaan haettua tietoa, jotta olen koko ajan selvillä mitä teen. Tämä vähenee ajan kanssa. Sitten kommentoin lyhyesti koodin alussa mitä koodi tekee. Muuttujan nimeäminen järkevästi, sama funktioiden kohdalla. Koodia kirjoitan zend tyylisesti.

---

Edelliseen kysymykseen hain sitä miten te lähestyisitte jQuery UI ympäristöä. Antaa sen nyt olla. Minun on opittava käyttämään Googlea paremmin ja luettava kärsivällisemmin tutoriaaleja tai oppaita. Toisaalta minun pitäisi uskaltaa koodata rohkeammin ja oppia ymmärtämään virheilmoituksia paremmin. Geijolle terveisiä, että käyn "töissä" mutta taloudellisen tilanteen vuoksi olisi hieno onnistua rakentamaan versio 2.

Siinä tavoite saada mm. 1 luokka jonka sisällä muita luokkia jotka perivät ominaisuuksia.

-Yhteys
--Sql
---ryhma
----tyontekija
----tapahtuma

Näin tietokantayhteys funktio (atribuutti) löytyisi Yhteys luokan sisältä. yhteys() tagia voisi käyttää Sql luokan sql kyselyissä-> yhteys() ...sitten idea olisi että työntekijän kaikki tiedot haetaan kerralla siis kaikkien työntekijöiden. Nyt voisin kutsua näytä id ja etunimi jne.

Toki mikä ero on työntekijällä ja työntekijöillä? Eli tämä suuri kokonaisuus on vasta kehitteillä. Noniin.. Taas meni selittelyksi, mutta nyt tajusin että en saa enään etsiä tietoa kuin php.net sivulta. Muiden mallitkin voin ohittaa. Parempi esim. Kirjoittaa hakukenttään: foreach ja lukea selitys...


The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and objects, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable. There are two syntaxes:


foreach (array_expression as $value)
statement

foreach (array_expression as $key => $value)
statement

The Alchemist [09.11.2012 07:45:05]

#

Ei sinun tänne tarvitse selostaa asioita vaan alat toteuttaa niitä käytännössä. Php:ssä ei muuten ole mitään tageja (paitsi ehkä alku- ja loppusymbolit <?php ja ?>). Foreach on kielirakenne ja funktioita kutsutaan ihan tutulla ja turvallisella nimellä "funktio".

latenleffahylly [09.11.2012 12:59:51]

#

Kyllä, kyllä.. olet oikeassa. Teot, ei puhe. Varmasti kuukauden sisällä laitan lyhyen koodin pätkän, josta näkee että olen päässyt Noviisista -> tasolle Web Developer

latenleffahylly [12.11.2012 09:13:09]

#

Noniin tässä nyt yksi funktio jonka tein. Mielestäni selvää edistystä:

function toimistotlista($name, $offices) {

  $a = "";

  $a .= "<select name=" . $name . ">";
  foreach ($offices as $key => $value) {
    $a .= "<option value=" . $key . ">" . $value . "</option>";
  }
  $a .= "</select>";

  return $a;

}



// ÄLÄ MUOKKAA TÄSTÄ ALAS
/*
<select name="office">
  <option value="hki">Helsinki</option>
  <option value="tre">Tampere</option>
</select>
*/
$offices = array(
  'hki'=>'Helsinki',
  'tre'=>'Tampere',
);
$lista = toimistotlista('office', $offices);
echo $lista;
echo $lista;

Eli funktion tarkoitus on palauttaa select boksi. Näin ollen select boksia voidaan kutsua niin monta kertaa kuin tarve. Tarkistin koodin vielä Firebugin avulla.

The Alchemist [12.11.2012 09:27:25]

#

Funktion nimi on huono, koska se antaa ymmärtää, että funktio toimii vain toimistojen tulostamiseen select-lootaan. Jos haluat tulostaa vaikka työntekijöitä, osoitteita tai mitä tahansa muuta, niin joudut kopioimaan täsmälleen saman koodiin uusiin funktioihin -> no good. Lisäksi et suorita tulostettaville muuttujille minkäänlaista sanitointia. Vinkki: htmlspecialchars. Funktion nimeäminen ei myöskään noudata mitään yleistä suositusta: lowerCamelCasea taikka underscore_separated_wordsia.

Siis: jos teet geneeristä koodia, niin myös nimeä funktiot ja niiden sisällä olevat muuttujat geneerisesti.

Php:n olio-ohjelmoinnin standardeista voi lukea täältä: https://github.com/php-fig/fig-standards/tree/master/accepted.

latenleffahylly [12.11.2012 11:13:12]

#

Ylläoleva meni harjoituksen puitteissa (tekosyy). Mutta oikeasti esim. function valintalista tai function tulostaValintalista ($name, $array)...

No minulla on paljon tekemistä. Tuo antamasi linkki on hyvä, mutta toistaiseksi en täysin halua sitä tutkia, koska en halua mennä asioiden edelle. Tuo yllä oleva on juurikin tämän hetkistä tasoani vastaava. Haluaisin kuitenkin heti alkuun kirjoitta standardien muikaista koodia ja tehdä asiat kuin ammattilaisetkin, kiitän.

latenleffahylly [15.11.2012 21:29:19]

#

Hei kaikille tähän topicciin kirjoittaneille,

Haluaisin hieman pahoitella aikaisempia postauksiani. Eli olen nyt käynyt läpi mm. foreach -silmukan ja array -taulukon. Niillä voi tosiaan tehdä ihmeitä. Myös pdo:ta olen tutkinut php-dokumentaation kautta. Oikeastaan ensimmäistä kertaa olen viihtynyt dokumentaation parissa.

Ainoa mikä tietysti häiritsee on php.net web-sivujen järkyttävä ulkoasu ja karmiva värimaailma. Tulevaisuudessa tarkoitukseni on tehdä 1 kunnon funktio joka auttaa Tapahtumapalvelu versio 2:den rakentamisessa, tarkemmin koodin yksinkertaistamisessa. Funktio laitetaan funktiokirjastoon.

Funktiota kutsuttaessa, voi antaa taulun nimen ja muuttujan jossa on sisällä paljon tietoa.. Tästä lisää myöhemmin. Kiitos kuitenkin että olette aina jaksaneet auttaa. Ohjelmointiputka on Suomen paras foorumi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta