Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: Osa lomakkeen valinnoista ei toimi

Sivun loppuun

helkepet [03.04.2019 14:03:12]

#

Olen tehnyt pienen php sovelluksen, johon tarvitsen nyt apua:

Sovelluksen tarkoitus on olla väylä yrityksen K työntekijöille mennä lisensioituihin palveluihin, johin on vain yksi lisenssi. Kun valitset listalta kohteen ja vahvistat sen, näkevät muut toisilla käyttäjä tunnuksilla varauksesi. Kun palaat palvelusta vapautuu palvelu, se vapautuu myös, jos kahteen tuntiin ei ole vapautusta tehty. Hyväksyytyjä kayttäjätunnuksia ovat kaikki nimet KESPAT.txt -tiedston sisällä (esim Petri, Kimmo, Anssi, Pipa jne).

Ongelma on saada varatuksi kahta ekaa palvelua. Vaikka listalle saadaan, varattaessa ei toimi, missä vika.

Sovellus: http://www.petesgamesaff.com/kesp.php
Tiedostot: https://drive.google.com/drive/folders/19ACkn3pQlAcEiVRNnnFgzt3pie20L8CE?usp=sharing

Palvelu on WEBHOTTELLI.fi palvelun alla.

Lebe80 [03.04.2019 16:08:59]

#

Saako kysyä miksi käyttäjätunnukset on .txt -tiedostossa? Eikö nuo voisi samalla vaivalla olla ihan php-tiedostossa vaikkapa array-muuttujissa (jos kerran tietokanta ei syystä tai toisesta ole vaihtoehto), jolloin niitä ei voisi lukea ihan noin suoraan.

Oletko miten debugannut noita sun if-lauseita? Eli kokeile vaikka ihan yksinkertaisia "Päästiin tämän if-lauseen sisään" -tyylistä echottelua, jotta näet missä vaiheessa jokin ehto ei täyty, tai jos jokin ehto täyttyykin väärässä paikassa.

The Alchemist [03.04.2019 17:49:10]

#

Lopeta tuo typerä sulkeiden numerointi ja opettele sisentämään koodisi, niin et tarvitse mitään järjetöntä numerointisysteemiä alkuunkaan. Mikäli käyttämäsi tekstieditori ei osaa automaattista sisennystä, niin hanki parempi. Niitä saa netistä ilmaiseksi.

function foo($foo, $bar) {
  if ($foo) {
    // sisäkkäiset lohkot eri syvyydellä

    switch ($bar) {
      case 1:
        break;

      case 2:
        break;
    }
  }
}

Koodin luettavuus on muutenkin 0/5. Asiasta on pakko nillittää, koska noin rumaa koodia ei saa nykypäivänä kirjoittaa edes vasta-alkaja. Kehitys on kehittynyt jo kauan sitten. Kiitos ja anteeksi.

helkepet [03.04.2019 22:25:51]

#

Lebe80 kirjoitti:

(03.04.2019 16:08:59): Saako kysyä miksi käyt­tä­jä­tun­nukset on .txt...

Käyttäjätunnuksen on txt tiedostossa, koska ylläpito on sinne helpompaa.

Lisäys:

The Alchemist kirjoitti:

(03.04.2019 17:49:10): Lopeta tuo helvetin typerä sulkeiden nume­roin­ti...

No luettavuus on huonolla tolalla, ja numerointi jäi - oli ongelma jossain vaiheessa löytää puuttuvaa lopettavaa kaarisulkua, sorry.
Mutta asiaan, mikä syynä ettei kahta ekaa riviä voi varata?

Lebe80 [04.04.2019 08:47:41]

#

helkepet kirjoitti:

Mutta asiaan, mikä syynä ettei kahta ekaa riviä voi varata?

Lebe80 kirjoitti:

Oletko miten debugannut noita sun if-lauseita? Eli kokeile vaikka ihan yksinkertaisia "Päästiin tämän if-lauseen sisään" -tyylistä echottelua, jotta näet missä vaiheessa jokin ehto ei täyty, tai jos jokin ehto täyttyykin väärässä paikassa.

Eli nyt sinun pitäisi tehdä tämä debuggaus. En usko, että ketään muuta kiinnostaa asentaa koodiasi ja alkaa tutkia sitä tämän enempää. Nyt alat vain tutkimaan tekemiäsi ehtolauseita, ja tarkistaa mitä arvoja vertailet keskenään (tulostat ruudulle), ja tulostat ruudulle tekstiä aina, kun ehto toteutuu ja kun se toteudu.

Todennäköisesti ehdot eivät toteudu kahden ensimmäisen rivin aikana ihan ilmiselvästä syystä, tai ehdot toteutuvat useimmilla riveillä, ja näin ollen seuraavien ehtolauseiden takia vähän kuin yliajavat logiikan myöhemmin.

Se on tylsää ja työlästä, mutta ainoa tapa ratkaista ongelmasi, miksei kahta ensimmäistä voi valita.

echo '<pre>Vertaillaan ehtolauseessa olevia muuttujia esim. a ja b keskenään: a="'.$a.'". ja b="'.$b.'".</pre>';
if ( $a=="foobar" && $b!=$a ) {
   echo '<pre>foobar -ehto toteutui</pre>';

   // sun jo tekemää koodia ...

}else{
   echo '<pre>foobar -ehto ei toteutunut</pre>';
}

Metabolix [04.04.2019 11:45:55]

#

Varsinainen virhe on rivillä 252, kun while-silmukassa yrität käydä palveluita läpi mutta et alusta silmukan indeksiä. Virhe löytyi sattumalta ensi silmäyksellä, kun olin poistamassa /tdstot/-kohtia testatakseni koodia yhdessä kansiossa.

Koodista näkee, että se on kirjoitettu kuin jollekin vanhalle Basicille. Taitaa olla ensimmäinen kerta, kun oikeasti näen goto-lausetta käytettävän PHP:ssä. Kopiointi taitaa myös olla tuttua, kun radiopainikkeen nimi on (täysin sisällöstä poiketen) gender eli sukupuoli.

Yleisiä vinkkejä ohjelmointiin:

Tarkasta jotenkin järkevästi, mitkä taulukon kohdat ovat käytössä. Nythän käsittelet taulukoita yli rajojen ja olet kirjannut luvun 12 absoluuttisena koodiisi. Tämäntapaisten virheiden vuoksi koodisi tuottaa ainakin seuraavat virheilmoitukset:

Notice: Undefined offset: 11 in ./kesp.php on line 18
Notice: Undefined offset: 3 in ./kesp.php on line 21
Notice: Undefined offset: 2 in ./kesp.php on line 22
Notice: Undefined offset: 1 in ./kesp.php on line 24
Notice: Undefined offset: 2 in ./kesp.php on line 24
Notice: Undefined offset: 11 in ./kesp.php on line 37
Notice: Undefined offset: 1 in ./kesp.php on line 39

Kannattaa käyttää for-silmukkaa tai foreach-silmukkaa taulukoiden käsittelyyn.

# Yleensä paras tapa taulukon läpikäyntiin:
foreach ($taulukko as $avain => $rivikopio) {
  if ($rivikopio == "foo") {
    $taulukko[$avain] = "bar";
  }
}

# Joskus järkevä vaihtoehto:
for ($i = 0; $i < count($taulukko); ++$i) {
  if ($taulukko[$i] == "foo") {
    $taulukko[$i] = "bar";
  }
}

Alusta käyttämäsi muuttujat oikein. Taulukon alustuksessa olisi parantamisen varaa:

$tuli[0]="";      # <- Huono rivi alustukseen, ei tyhjennä taulukkoa.
$tuli = [];       # <- Tyhjän taulukon alustus.
$tuli = array();  # <- Tyhjän taulukon alustus, vanhanaikainen tapa.

Puuttuvasta muuttujan asettamisesta tulee seuraavanlainen virhe:

Notice: Undefined variable: ok in ./kesp.php on line 168

Ylipäänsä olet tehnyt paljon turhaa työtä, sillä esimerkiksi tiedoston lukeminen ja kirjoittaminen onnistuisivat yhdellä koodirivillä ja tiedostomuotonakin voisi olla vaikka JSON, jonka purkaminen ja tallentaminen onnistuisivat yhdellä rivillä ja jonka kanssa ei tarvitsisi epävarmoja explode-virityksiä ja numeroituja taulukon indeksejä.

helkepet [04.04.2019 15:07:24]

#

Olen siistinyt koodin luettavaan muotoon.

Debuggaus on tuttua ja olen sitäkin tässä harrastanut, mutta oikeaa ratkaisu/ syytä en ole keksinyt. PHP on vähän vieras, muuten olen koodia tehnyt 35 vuotta (ammatiksi: Teletietopalvleu, Nixdorf, Tieto, KSSHP).

Sovellusta voi kokeilla osoitteessa ["http://www.petesgamesaff.com/kesp.php"] ja käytetyt tiedostot voi käydä katsomassa osoitteessa ["https://drive.google.com/drive/folders/19ACkn3pQlAcEiVRNnnFgzt3pie20L8CE?usp=sharing"] .

Metabolix [04.04.2019 20:46:33]

#

helkepet kirjoitti:

oikeaa ratkaisu/ syytä en ole keksinyt

Kuitenkin kerroin oikean ratkaisun (rivinumeroa myöten) jo monta tuntia sitten, joten luulisi asian nyt olevan selvä.

helkepet kirjoitti:

olen koodia tehnyt 35 vuotta – – Tieto.

Onko koodin tyyli ja laatu sielläkin samanlainen? Tämä selittää julkisen sektorin järjestelmien ongelmat ja kustannukset...

Jaska [04.04.2019 22:29:29]

#

helkepet kirjoitti:

Debuggaus on tuttua ja olen sitäkin tässä harrastanut, mutta oikeaa ratkaisu/ syytä en ole keksinyt.

Jos kerran debuggaus on tuttua, mutta virhettä ei löydy, niin silloin on opeteltava PHP:tä lisää.

Lebe80 kirjoitti:

Oletko miten debugannut noita sun if-lauseita? Eli kokeile vaikka ihan yksinkertaisia "Päästiin tämän if-lauseen sisään" -tyylistä echottelua

Voi toimia, mutta enpä keksi tilannetta, jossa echottelu olisi kätevämpää kuin xdebug. Ei nyt heti tule mieleen tapausta, missä koodia tarvitsisi muokata paikallistamaan virhe, kun debuggerit ovat aika käteviä.

Lebe80 [05.04.2019 00:27:00]

#

Jaska kirjoitti:

(04.04.2019 22:29:29): ”– –” Jos kerran debuggaus on tuttua, mutta virhettä...

Tuollainen echottelu on selkeää esim. aloittelijoille, jolloin näkee suoraan missä kohtaa iffittely on mennyt mönkään. Kun kieli tulee tutummaksi, alkaa xdebug näyttää tehokkuutensa.

helkepet [08.04.2019 14:44:02]

#

Löysin virheen - se oli nollaus $SI, $si:n sijasta; uudessa koodissa rivillä 238.
Metabolix auttoi jäljille -kiitos.

Kiitos kaikille, jotka näitte vaivaa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta