Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: En ymmärrä, miksi koodi ei toimi

Sivun loppuun

E1ss [15.05.2017 18:20:31]

#

Minulla on kaksi koodia sanotaan vaikka a.php ja b.php. Koodissani on ideana että minä haen koodia a joka sekuntti. Kun painan nappulaa haen koodin b samaan aikaan kun haen kokoajan koodia a. Ongelmani on se että kun haen koodia b yht'äkkiä tietokannassani yksi tieto muuttuu joka näkyy seuraavassa koodin a tulostuksessa. Eli a tulostaa kokoajan tietokannasta numeroa joka pitäisi olla 1. Console näyttää seuraavanlaisen tulostuksen:
Koodi a: 1 (Normaalia tulostusta)
Koodi a: 1 (-||-)
Koodi b: (Ei tulosta mitään mutta ei myöskään muuta tietokannan tietoa.
Koodi a: 0 (Nyt tietokannasta haettu luku on muuttunut.)

Koodi b ei muuta tietokannan numeroa yhtään. Ainoastaan koodi a muuttaa numeroa MUTTA sitä ennen se tulostaa ilmoituksen että nyt tehdään muutos. En ymmärrä miten on mahdollista että se on muuttunut. Onko mahdollista että jokin errori saattaisi muuttaa juuri sen 0 mutta ei muita tietokannan tietoja vai olisiko mahdollista että php olisi jättänyt kirjoittamatta echoni?

Olen hakenut b koodista kaikki tähän numeroon liittyvät koodit ja muutama koodi muokkaa sen numeroksi 1 mutta ei koskaan numeroksi 0. Ja a koodissa vain yhdessä kohtaa numero muuttuu 0 mutta sitä ennen on ilmoitus niinkuin jo sainoin. Tästä ongelma ei siis johdu.

Jos jollain on ollut samanlaisia ongelmia niin olisin kiitollinen avusta tähän pahaan pähkinään. Ja jos selitin hieman huonosti niin laittakaa kysymyksiä niin voin selventää kaikille.

Lisäys:

Ongelma saattaa johtua yhdestä jutusta johon liittyen teen kysymyksen.
Miten on mahdollista että voisi vain hakea koodin functioita mutta ei itse koodin rakennetta. Tarkoitan tällä sitä että jos on seuraavan lainen esimerkki:

<?php

echo "Hello World";

function HiWorld(){
	echo "Hi World";
}

?>

Tuosta koodista siis minun pitäisi saada toiseen koodiin käyttöön vain HiWorld() functio. Tällähetkellä teen siten että käytän include komentoa mutta jos tekisin seuraavasti:

<?php

include 'Testi.php';
HiWorld();

?>

Tämä koodi tulostaa:

Hello World
Hi World

Vaikka tarkoituksenani olisi tulostaa vain Hi World. Miten on siis mahdollista käyttää toisen koodin functioita ilman että ottaa koodin rakenteen?

kalppi [15.05.2017 18:53:54]

#

Siirrä tuo echo hello worldi funktioon, ja kutsu sitä kun tarvitset. tadaa.

E1ss [15.05.2017 20:30:37]

#

Hyvä idea muuten mutta en voi siirtää hello worldiä functioon koska välillä minun pitää hake testi.php selaimesta ja saada tulokseksi hello world. Vai pitäisikö tästä tiedostosta tehdä "funcrio tiedosto" jossa ei haeta functioita ollenkaan. Sitten muista koodeista hakisin niitä functioita.

Lisäys: Se vaatii kuitenkin aika paljon työtä koska koodini on sen verran iso niin jos helpompia ratkaisuja löytyy niin otan niitä vastaan ilomielin.

kalppi [15.05.2017 20:51:37]

#

No jos aivan pakko on, niin toki voisit leikkiä output bufferoinnin kanssa, mutta luulen että se menee vaan turhaksi paikkailuksi. Mieluummin jakaisin useampaan tiedostoon.

Teuro [15.05.2017 21:14:28]

#

Yleisesti ottaen tiedostojen liittäminen ei saisi tehdä mitään näkyvää sivulle. Liittämisen jälkeen pitäisi tehdä tulostuskutsut hallitusti datan hakemisen ja käsittelyn jälkeen. Kysymykseesi voi siis vastata tosiaankin, kuten Kalppi ehdotti siirrä tarvittavat tulostukset funktiooon, jolloin ongelma on ratkennut.

Parempaa vastausta varten olisi hyvä saada todellinen tilanne ja todelliset funktiot ja haluttu lopputulos.

Lebe80 [16.05.2017 09:11:04]

#

Siirrä tuo funktio omaan tiedostoon ja includaa se testi.php:n sijaan.

E1ss [16.05.2017 18:12:13]

#

Kiitos vastauksista. Yritän tehdä ehdottamani functio tiedoston ja sanon sitten jos ei toimi edelleenkään.

E1ss [18.05.2017 17:13:02]

#

Ei auttanut. Pystyin nyt todistamaan että koodini ei olut tulostanut yhtä kohtaa. Käytän unityä ja sen pitäisi tulostaa koko sivun tiedot mutta se ei tulosta sivua jossa se muuttaa yhtä arvoa. Onko jollain ollut samantapaisia ongelmia.

Metabolix [18.05.2017 17:19:00]

#

Koodissasi on varmasti jokin virhe. Noilla tiedoilla sitä on mahdoton selvittää. Laita PHP:n kaikki virheilmoitukset näkyville ja korjaa ne. Sivun pitäisi myös toimia täsmälleen samalla tavalla Unityn kautta ja selaimella, joten voit ihan hyvin testata sitä selaimella. Jos sivu toimii selaimella mutta ei toimi Unityn kautta, luultavasti vika on sitten siinä Unity-ohjelmassasi.

E1ss [18.05.2017 17:51:30]

#

En oikein usko että ongelma on tuossa koska koodini on seuraavanlainen.

function OneLeftIsZero($yhteys){
		global $tableXCards;
		//Päivittää oneLeft = 0
		echo "one Left = 0/n";
		$kysely = $yhteys->prepare("UPDATE $tableXCards SET card = ? WHERE id = ?");
		$kysely->execute(array(0, "oneLeft"));
}

Kun koodi tulostaa tietokannasta oneLeftin joka sekuntti se on ensin yksi ja sitten kun teen yhden jutun se muuttuu 0. Siitä ei tule näkyviin one Left = 0 joka on echona ennen kuin se toteutetaan. Se on siis pakko jättää jotain tulostamatta koska missään tulostuksessa ei ole tekstiä "one Left = 0" mutta one left kuitenkin muuttuu nollaksi.

The Alchemist [18.05.2017 18:57:35]

#

Ei sitten tullut mieleen, että koodisi voi failata samanaikaisesti sekä numeron muuttamisen nollaksi että numeron palauttamisen takaisin ykköseksi, jolloin nolla siellä kannassa onkin vanhaa perua aiemmasta onnistuneesta ajosta? Sinullahan oli jo aiemmin sitä ongelmaa, että availit liikaa yhteyksiä tietokantaan ja koodisi kaatui siihen.

E1ss [19.05.2017 09:38:16]

#

Tämä on siis liian hankala juttu joten lähdetään liikkeelle alusta. Ongelmanani on pohjimmiltaan että minun pitäisi tehdä siten että yhtä functiota haetaan vuorotellen ei siten että samaan aikaan kaksi eri pelaajaa hakee sen. Yritin estää sen tuolla oneLeft jutulla että kun tietokannassa oneleft on 1 kukaan muu pelaaja ei voi hakea functiota koska joku hakee jo. Onko ideoita miten tämän vosii toteuttaa muuten?

The Alchemist [19.05.2017 11:14:47]

#

Suunnittele järjestelmäsi niin, ettei siellä ole "funktiota, jota saa hakea vain vuorotellen".


Sivun alkuun

Vastaus

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

Tietoa sivustosta