Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sivut ei lataudu

Sivun loppuun

joah [21.02.2014 18:19:09]

#

Moi!

Olen tehnyt hallintapaneelin sivuilleni, mutta se lakkasi yhtäkkiä toimimasta.

Käytössä on Hostingerin palvelimet, ja ajattelin kysyä ekana täältä, jos kysymys on jostain muusta.

Eli ongelmana on se, että sivut ei lataudu. Alkuperäisessä koodissa on noin 110 riviä koodia, mutta kun lataan sivut lähdekoodi näyttää vain 27 riviä. Mikä vikana? Olen yrittänyt itse Hostingerin sivuilta olevalla tiedostohallinnalla laittaa, FTP-connectionilla ja semmosilla.

Kun lataan tiedoston FTP-palvelimelta, se lataa sen 110 rivisen koodin. Eli se tiedosto on siellä, mutta ei jaksa lataa sitä käyttäjälle?

Testattu Safarilla sekä Chromella. Nollattu, tyhjennetty välimuistia ja kaikkea. Testattu puhelimella ja eri Wi-Fi yhteyksillä, puhelimella mobiilidatalla. Sama ongelma.

Sivu ei edes jää lataamaan sitä, eli latauspalkki on "valmis". Eli mukama sivu olisi latautunut, vaikka suuri osa sivuista ei ole todellakaan ladattu. Mikä vikana?

Koodi on sekaisin PHPtä ja HTMLlää. Tiedän, että jos luulette, että PHP lyhentää koodia, että oikesti kysymyksessä tulisi vain tulostua se 27 riviä, näin se ei ole. PHPtä on noin yksi kuudesosa ja niistä puolet ovat tulostusta (echo, print tms).

Sivu lataa taustavärin, mutta stoppaa heti, kun tulee <body>-tagi.

Edit: Muiden sivujen muokkaaminen toimii, ja se lataa muutoksen käyttäjälle. Myöskin kun laitan sivuille muuta sisältöä, vaikkapa 50 riviä, se lataa sen.

Metabolix [21.02.2014 18:33:04]

#

Ehkä sivusi PHP-koodissa on bugi, johon sivun toiminta kaatuu. Ehkä palvelimen PHP:tä on päivitetty ja sen takia virhettä ei ole aiemmin ilmennyt. Laita virheilmoitukset käyttöön ja tarkista kaikki sivusi PHP-koodit varsinkin juuri siitä kohdasta, jossa sivu katkeaa.

joah [21.02.2014 18:39:53]

#

Sivun lataus loppuu <?php tagin alkuun, ja kyseisessä skriptissä on aiemmin toiminut koodi. Koodi on ohjelmointiputkan PDO-oppaasta kopioitu yhteydenmuodostus, joka yhditää tietokantaani.

Testasin tota virheilmotusjuttua, mutta mitään ei tullut. Tosin Hostinger juuri ilmoitti uudesta toimistostaan ja koko paneelin ulkoasu muuttui, samalla sanottiin, että muitakin uudistuksia pitäisi, olla, ei sanonut siitä mitään enempää. En tiedä, onko PHP päivitetty samalla... Lähti tiketti hostingerille päin.

Metabolix [21.02.2014 19:28:38]

#

Jos et ole varma virheilmoitusten toimivuudesta, voit kokeilla laittaa omia virheilmoituksia funktiolla trigger_error. Fataalit virheet eivät ehkä näy asetuksista huolimatta, joten kyse voi olla esimerkiksi siitä, että jokin käyttämäsi luokka tai funktio puuttuu. Voit debugata sivua lisäämällä PHP-koodiin ylimääräisiä tulostuksia, kunnes saat haarukoitua tarkan kohdan, jossa koodi kaatuu. Voit sitten katsoa funktioilla class_exists ja function_exists ym., löytyvätkö kaikki siinä kohdassa käytetyt nimet.

joah [22.02.2014 18:36:58]

#

Nyt ei kyllä mene hyvin. Nyt koko sivu ei edes lataudu. Edes virheilmoitus-funktioiden lisääminen ei näytä mitään. Nyt siis ei ole samasta sivusta kysymys, vaan kahdesta eristä. Nyt kyllä ihmettelen, miten tää voi olla näin ongelmallista... Kysymys on tästä:

Ongelma no 1 (games.php):

<table>
<?php
            include("mysql.php");
            $kysely = $yhteys->prepare("SELECT * FROM games");
            $kysely->execute();
            while($row = $kysely->fetch()) {
                echo "<tr>";
                echo "<td><img src=\"" . $row['kuva'] . "\" alt=\"Kuva\"></td>";
                echo "<td>" . $row['nimi'] . "</td>";
                echo "<td>" . $row['lisatietoa'] . "</td>";
                echo "<td><a href=\"http://www.youtube.com/playlist?list=" . $row['playlist'] . "\">Avaa soittolista</a></td>";
                echo "</tr>\n\r";
            }
            ?>
        </table>

(Pahoittelen rivitystä, koska kopioin ton koodieditorista, jonka takia rivitykset menee aikalailla huonosti.)

Ongelma no. 2 (normaali.php -> css tiedosto, värit haetaan tietokannasta):

<?php
    header("Content-type: text/css; charset: UTF-8");
    include("../mysql.php");
    $kysely->prepare("SELECT * FROM theme");
    $kysely->execute();
    $row = $kysely->fetch();
    $box_border = $row['box_border'];
    // Seuraavat muotoilu on vain esimerkki
?>
#box {
    border: 1px solid <?php echo $box_border; ?>;
    background-color: green;
}

Metabolix [22.02.2014 18:47:37]

#

Kun et ilmeisesti yhtään tiedä, missä kohti vika voisi olla, sinulla on kaksi vaihtoehtoa: 1) ota itse selvää, 2) päästä joku muu palvelimellesi.

Kaatumiskohdan etsiminen ei todellakaan ole vaikeaa. Jos olet muuttanut koodia edellisen toimivan version jälkeen, tarkista ensin, että koodissa ei ole syntaksivirheitä. Tämä onnistuu vaikka kotikoneella komennolla php -l koodi.php. Kokeile sitten laittaa koodiin eri kohtiin die-rivejä, kunnes löydät viimeisen kohdan, jossa die("moi") tulostaa tekstin näkyviin. Vielä kun on tiedossa, että koodi on aiemmin toiminut – ja toivottavasti et ole sen jälkeen hätäpäissäsi sotkenut sitä vailla järjen häivää –, vika voi hyvin olla juurikin jonkin funktion tai luokan puuttuminen. Jos kerran vika ilmenee myös tuossa lyhyessä CSS-viritelmässäsi, vika löytyy luultavasti mysql.php:stä ja puuttuva asia saattaa olla PDO-luokka tai sen MySQL-ajuri.

Otsikon charset-määreeseen kuuluu yhtäsuuruusmerkki eikä kaksoispiste.

joah [24.02.2014 07:49:06]

#

Sain ongelman ratkaistua, nykyään palvelin ei tykkää tälläisistä:

$nimi = "Jaakko";
echo "Nimi: " . $nimi;

Vaan se pitää tehdä näin:

$nimi = "Jaakko";
echo "Nimi: {$nimi}";

Eli ei tykkää pisteistä. Aina yksi lisärivi tuostahan tulee koska $joku = $rivi['rivi'].

Ja CSS-tiedostossa oli vikana se, että on tullut aina tuo temppuiltua, jos includettaa alihakemistosta sen tiedoston, joten koko yhteydenmuodostusta ei ollutkaan :D

Kiitos avusta!

Grez [24.02.2014 08:33:29]

#

joah kirjoitti:

Eli ei tykkää pisteistä.

Eli palvelin vaihtoon :D ...ellei sitten kyse oikeasti ole jostain muusta.

Metabolix [24.02.2014 16:30:16]

#

Joo, ei voi oikeasti olla pisteestä kiinni, koska se on PHP:n perusominaisuus ja aivan varmasti toimii jokaisessa PHP-tulkissa.

The Alchemist [24.02.2014 19:33:57]

#

joah kirjoitti:

Aina yksi lisärivi tuostahan tulee koska $joku = $rivi['rivi'].

No jätä kirjoittamatta tuo rivi, niin ei tule lisäriviä. Duh.

Teuro [25.02.2014 07:47:27]

#

joah kirjoitti:

Sain ongelman ratkaistua, nykyään palvelin ei tykkää tälläisistä:

Millä tavalla palvelin ei tykkää tuosta? Laitatko virheilmoituksen esille, niin katsotaan mitä sieltä saadaan. Tosiaan merkkijonojen katenointi suoritetaan piste-operaattorilla, joten sen tulisi toimia aina.

joah [26.02.2014 22:27:38]

#

Siis vaikka laittaisinkin ini_setillä ja muilla funktiolla virheilmoituksen, ei mitään virheilmoitusta tule. Ainoastaan tällein toimii ( {$joku} ).

Ja sillä ylimääräisellä rivillä tarkoitan tätä:

Tämä ei toimi:

echo "Nimi: {$rivi['nimi']}";

Mutta tämä toimii:

$nimi = $rivi['nimi'];
echo "Nimi: {$nimi}";

Siinähän tuli uusi rivi, huh?

Ja ongelmat (lähinnä pisteongelmat) kun hostingerilla päivittyi cpanel ja kaikkea muuta...

Metabolix [26.02.2014 23:03:53]

#

En edelleenkään usko sanaakaan noista jutuistasi. Edes Hostinger ei voi olla niin huono, että PHP:n perusominaisuudet eivät toimisi. Nyt mielestäsi pisteen lisäksi on rikki myös aaltosulkusyntaksi taulukoiden kanssa?

Tee nyt kokeeksi ihan uusi PHP-skripti, jossa lukee tasan näin eikä mitään muuta:

<?php
echo "PHP-testi. ";
$a = array("alku" => "Kaikki ", 'keski' => "toimii", 'loppu' => " hienosti!");
echo "{$a['alku']}" . $a['keski'], $a['loppu'];

Jos vakavissasi kehtaat väittää, että tuo koodi ei toimi, kokeile vielä tätä:

<?php
echo "PHP-testi evalilla. ";
eval(base64_decode("
JGEgPSBhcnJheSgiYWxrdSIgPT4gIkthaWtraSAiLCAna2Vza2knID0+ICJ0b2ltaWkiLCAnbG9w
cHUnID0+ICIgaGllbm9zdGkhIik7CmVjaG8gInskYVsnYWxrdSddfSIgLiAkYVsna2Vza2knXSwg
JGFbJ2xvcHB1J107Cg==
"));

Grez [27.02.2014 08:50:55]

#

pistemies kirjoitti:

Kuten metabolix jo selvensi, niin tämä pikku muutos auttanee:

echo "Nimi: ".{$rivi['nimi']};

Ei auttane, kun tuo ei toimi. Siis ihan yleisesti. Miksi olet laittanut muuttujan aaltosulkuihin? (PHP Parse error: syntax error, unexpected '{')

Ja alunperinhän lähdettiin väitetystä ongelmasta, että piste ei toimisi merkkijonojen yhdistämiseen, niin minusta on vähän hassua tarjota ratkaisua, jossa käytetään pistettä merkkijonojen yhdistämiseen.

pistemies kirjoitti:

Kannattaa totutella itsensä siihen että `katkaisee` merkijonon noin muuttujan kohdalla.

Miksi? Eikö muuttujien laittaminen merkkijonon sisään ole ihan normaalia PHP-toimintaa. Vai voisiko yhtä hyvin sanoa että "kannattaa käyttää jotain muuta kieltä"?

qeijo [27.02.2014 10:22:03]

#

Ehdottomasti paras tapa on seuraava jota itse käytän:

$muuttuja = base64_encode(strrev(base64_decode('aXJhbmll') . '$'));

echo ("Nimi "), (substr("'\{\'"  . '{}' .  base64_decode(($muuttuja)) . '{}' .  "'}'", 8, 6));

The Alchemist [27.02.2014 11:03:39]

#

pistemies kirjoitti:

Tämä on vähän selkeämpi koska muuttujat ei muutenkaan toimi hipsujen sisällä, kuten on laita lainausmerkeillä. Kannattaa totutella itsensä siihen että `katkaisee` merkijonon noin muuttujan kohdalla.

Paitsi että nuo sun yritelmäsi eivät ole syntaksinsa puolesta sallittuja php:ssä, niin mielestäni muuttujien ja merkkijonojen katenointi on järkyttävän huono käytäntö. Koodin luettavuus heikkenee radikaalisti. Olisi järkevämpää opetella merkkijonojen muotoilu. Siis ns. format-funktion käyttäminen. Php:n vakiokirjastosta löytyvät c-tyyliset funktiot sprintf() ja printf().

printf("Welcome, %s, to this website!\n", $name);
printf('%d + %d = %d' . PHP_EOL, 2, 3, 5);

Metabolix [27.02.2014 16:00:24]

#

pistemies kirjoitti:

Kuten metabolix jo selvensi, niin tämä pikku muutos auttanee:

echo "Nimi: ".{$rivi['nimi']};

En ole ehdottanut mitään tuollaista, vaan olen antanut ainoastaan toimivia koodeja. En ole myöskään ehdottanut minkäänlaista muutosta merkkijonojen käsittelyyn (alkuperäiseen tilanteeseen nähden), vaan koko ajan olen ollut sitä mieltä, että PHP:n päivitys ei vaadi mitään muutosta koodin merkkijono-operaatioihin.

joah [27.02.2014 19:57:48]

#

Metabolix kirjoitti:

...
Tee nyt kokeeksi ihan uusi PHP-skripti, jossa lukee tasan näin eikä mitään muuta:

<?php
echo "PHP-testi. ";
$a = array("alku" => "Kaikki ", 'keski' => "toimii", 'loppu' => " hienosti!");
echo "{$a['alku']}" . $a['keski'], $a['loppu'];

...

Okei, se oli mun taidoista kiinni. Oon onnistunut möhlimään koko skriptin, jolloin virhe on varmaan tullut. Kiitos selvennyksestä, nyt tiedän ainakin, että harjoittele enemmän, ei se serverin virhe aina ole. Ja tässähän vasta ollaan vähän alle vuosi PHP-ohjelmointia tullut tekemään, joten harjoitusta ja harjoitusta. Kiitos kun autoitte taas tän ongelman kanssa :)

The Alchemist [27.02.2014 23:47:09]

#

Mulla oli ongelmana joskus se, että onnistuin syöttämään koodiin non-breaking spacen tavallisen välilyönnin sijaan. Monet tekstieditorit eivät korosta kyseistä merkkiä mitenkään mutta ainakaan gcc:n c++-kääntäjästä taikka tavallisesta php-tulkista ne eivät mene läpi. Alt Gr + space syöttää siis non-breaking spacen Linuxilla. Windowsilla kai sitä ei kovin helposti ainakaan vahingossa voi syöttää.

Grez [28.02.2014 04:27:00]

#

The Alchemist kirjoitti:

Windowsilla kai sitä ei kovin helposti ainakaan vahingossa voi syöttää.

Windowsilla "helppous" riippuu ihan puhtaasti käytetystä editorista.


Sivun alkuun

Vastaus

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

Tietoa sivustosta