Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: include-kysymys

Sivun loppuun

Toshiba [16.05.2008 08:52:49]

#

Tervehdys, elikkä ongelma olisi seuraavanlainen:

Eli index.php tiedostossa on seuraavanlainen kohta:

echo "<img src='gallery.php?id=".$id."'>"; ja jostain syystä tekemäni funktiot.php tiedosto ei toimi tai avaa tietokantayhteyttä gallery.php:n sisällä? Sama ongelma tuli vastaan muuallakin, jossa on img src:n sisällä oleva php tiedosto.

funktiot.php on includattuna index.php tiedossa ja toimii tosiaan hyvin kaikkialla muualla. Kokeilin includettaa sitä suoraan ton gallery.php sisään tuloksetta. gallery.php tiedostoon toki saa tietokantayhteyden auki kirjoittamalla tunnukset jne. sinne sisälle, mutta haluaisin kaiken hoidettavan funktiot.php tiedoston kautta!

Wizard [16.05.2008 09:07:54]

#

Näytä koko koodi jotta voi ottaa kantaa.

Jos käytät include_once funktiota, otetaan file mukaan todellakin vain kerran koko scriptin aikana. Include ja include_once eivät tuota virheilmoituksia ollenkaan.

Voisit kokeilla käyttää require komentoa joka tuottaa virheilmoituksen ja on muuten toiminnallisuudeltaan käytännössä samanlainen kuin include.

Yleensäkin suosittelen käyttämään require komentoa includen sijaan. Koodin virheidenkäsittely on kertaluokkaa silloin parempi, koska virheet tulee helpommin esiin jo koodatessa.

-W-

Toshiba [16.05.2008 09:25:47]

#

Tässä lyhennelmä, koska en jaksa koko koodia kopsia :)

funktiot.php

<?PHP
$config['server'] = 'jepjep';
$config['user'] = 'jep';
$config['password'] = 'jepjepjep';
$config['database'] = 'jep';

function Tietokantayhteys($config)
{
$link = mysql_connect($config['server'], $config['user'], $config['password'])
or die("Tietokannan: " . mysql_error());
if (!$link)
{
echo ("Virhe.\n" . mysql_error());
exit;
}
$db = mysql_select_db($config['database'], $link);
return $link;
}
?>

index.php

<?PHP
include 'toiminnot.php';
echo "<img src='gallery.php?id=".$id."'>";
?>

gallery.php

<?PHP
$link = Tietokantayhteys($config);
?>

Voipi olla virheitä, kun tein pikaversion, mutta pääpointti on siinä, ettei tossa gallery.php:ssä avaudu yhteystietokantaan, mikä taas onnistuu muualla käyttämällä

$link = Tietokantayhteys($config);

Wizard [16.05.2008 12:58:28]

#

Todennäköisesti MUUALLA käytät tuota gallery.php sivua includella ja tuossa esimerkissä teet UUDEN kutsun kyseiseen sivuun. Palvelimelle tuo on kaksi täysin eri asiaa ja kaksi eri prosessia. Includella kyseessä on vain yksi prosessi. Ongelma siis liittynee siihen, että välillä sinulla on resurssi $link määritelty ja välillä ei?

Suomeksi: tarvitsen tuohon gallery.php alkuun jotakuinkin seuraavanlaista:

<?php

if(! in_array('funktiot.php', get_included_files())):
    include('functiot.php');
endif;

?>

Tuo koodipätkä nyt ihan ulkomuistista. Jos ei toimi, niin tarkista metodien syntaksi php.net sivulta.

-W-

kayttaja-2791 [16.05.2008 14:50:33]

#

Wizard kirjoitti:

Include ja include_once eivät tuota virheilmoituksia ollenkaan.

Tuottavat kyllä virheilmoituksen. Requiren ja includen ero on siinä että jatketaanko lopun koodin suoritusta virheestä huolimatta.

Wizard [16.05.2008 16:15:30]

#

Include tuottaa VAROITUKSEN, mutta ei FATAL ERRORia. Monesti Warning on kytketty pois päältä palvelimen asetuksista kun taas fatalia harvemmin. Monessa paikassa tuota varoitusta ei luokitella virheeksi, se on "kosmeettinen virhe". ;)

Siinä olet kyllä oikeassa, että includen varoituksen jälkeen voidaan suoritusta jatkaa kun taas requiren kohdalla suoritus loppuu samantien.

Toshiba [17.05.2008 11:49:35]

#

Eli varmaan yllä olevalla menetelmällä saa tarkistettua onko kyseistä tiedostoa liitetty vai ei. Kuitenkin get_included_files palauttaa koko pathin, eikä pelkästään funktiot.php, joten se ei sen takia suoraan toimi.

<?php
if(! in_array('funktiot.php', get_included_files())):
    include('functiot.php');
endif;
?>

eli pitää ilmeisestikkin palauttaa get_included_files funktiolla johonkin muuttujaan tiedot ja sitten yrittää parsia sieltä erilleen funktiot.php, koska in_array ei osaa suoraan erotella sitä pitemmästä merkkijosta.

Toshiba [17.05.2008 12:29:03]

#

Eipä tämäkään näy auttavan. Tämä kyllä havaitsee onko includattu funtiot.php ja jos ei ole niin sitten lisää sen uudelleen. Tiedä sitten vaikuttaako toi img src tuolla index.php:ssä vai se että gallery.php:ssä content typenä on image/jpeg


$included_files = get_included_files();
$merkkijono = implode(" ", $included_files);

if(!strpos($merkkijono, "funktiot.php"))
{
include 'funktiot.php';
}


Sivun alkuun

Vastaus

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

Tietoa sivustosta