Eli täytyy kysyä täältä kun ongelma ei meinaa ratketa.
Kun teen tuosta kyselystä funktion, paukahtaa seuraavat virheet:
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/xxxx/public_html/xxxx/xxxx.php on line 13
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/xxx/public_html/xxxx/xxxx.php on line 15
Tässä PHP-koodi:
<?php function kysely_sivut(){ define('polku', '/home/xxx/public_html' ); require_once(polku . '/xxxx/konfig.php'); $kysely = "SELECT * FROM sivut WHERE sivu_osoite = 'etusivu'"; //suoritetaan kysely //suoritetaan kysely $haku = mysql_query($kysely, $yhteys); //rivien määrä $maara = mysql_num_rows($haku); //käydään läpi hakutulokset for ($i == 0; $i < $maara; $i++) { //haetaan nimi, hinta ja määrä muuttujiin $sivu_n = mysql_result($haku, $i, "sivu_nimi"); $sivu_o = mysql_result($haku, $i, "sivu_osoite"); $sivusisalto = mysql_result($haku, $i, "sivu_sisalto"); } echo "$sivusisalto"; } ?>
Ongelma käy suoraan ilmi ensimmäisestä virheilmoituksesta: Et ole määritellyt muuttujaa $yhteys.
Jos virheilmoitusraportointi olisi laajempi, niin se kertoisi tuonkin että "Undefined variable: yhteys"
Grez kirjoitti:
Ongelma käy suoraan ilmi ensimmäisestä virheilmoituksesta: Et ole määritellyt muuttujaa $yhteys
Eikös require_once
:lla pysty hakemaan tarvittavat tiedot, tässä tapauksessa $yhteys -löytyy konfig.php:tä.
Edit: Kyllähän tuolla require_once
:lla pystyy hakemaan yhdistämiseen tarvittavat tiedot, ilman että kyselystä on tehty funktio, skripti toimii.
Mielestäni require_once:n määrittäminen funktion sisällä tuolla tavalla on huonoa ohjelmointikäytäntöä. Eikä pelkästään sen takia, että jos olet määritellyt saman tiedoston require_once:lla myös funktion ulkopuolella, niin se ei ota sitä enää uudelleen mukaan funktion sisällä. (Once = kerran)
Valitettavasti en tiennyt, että $yhteys määriteltiin konfigissa, koska et ole laittanut sitä näkyville.
Joka tapauksessa, $yhteys ei ole funktion sisällä validi MySQL-Link resurssi.
Grez kirjoitti:
Mielestäni require_once:n määrittäminen funktion sisällä tuolla tavalla on huonoa ohjelmointikäytäntöä. Nyt on sitten vaikea sanoa onko sama tiedosto require_oncettu funktion ulkopuolellakin ja toisaalta millä tavalla ko. tiedostosas tuo $yhteys määriteltiin, koska et ole laittanut sitä näkyville.
Joka tapauksessa, $yhteys ei ole funktion sisällä validi MySQL-Link resurssi.
MySQL yhteys on määritelty ihan normaalisti samalla lailla kuin täällä Putkassa on PHP ja MySQL -oppaassa kerrottu.
Jaahas, include näyttää toimivan paremmin kuin require_once, silloin ei tule virheilmoitusta. No nyt toimii.
include(); sisällyttää tiedoston, mutta require(); palauttaa virheilmoituksen jos kyseistä tiedostoa ei voi ladata (sivun latautuminen keskeytyy).
combo kirjoitti:
Jaahas, include näyttää toimivan paremmin kuin require_once, silloin ei tule virheilmoitusta. No nyt toimii.
Vaikka jokin asia toimii oikein jollakin tavalla, ei se silti tarkoita sitä, että se olisi hyvää ohjelmointikäytäntöä. Kuten jo Grez sanoi aikaisemmin, niin muiden tiedostojen sisällyttäminen funktion sisään ei ole hyvä idea.
Ja taas kerran ongelman syynä on globaalien muuttujien käyttö. Siitä kannattaa ihan oikeasti opetella eroon.
Eihän siellä tällä kertaa käytetty globaalia muuttujaa vaan muuttuja määriteltiin includoimalla se funktion sisään. En tosin osaa sanoa kumpi on pahempi, molemmat huonoja.
Tuskinpa tuo on läheskään ainoa kohta, jossa "konfig.php" inklusoidaan. PHP:ssä on "onneksi" huomioitu tällaiset purkkaviritelmät, ja mysql_connect oletuksena ei luo uutta yhteyttä, jos samoilla parametreilla on jo yhdistetty. Muutenhan tuloksena olisi uusi tietokantayhteys kaikissa funktioissa, joissa tuo include on.
Globaalit muuttujat ovat joka tapauksessa PHP:ssä vielä pahempi asia kuin monissa muissa kielissä (esim. C:ssä), koska PHP:ssä niitä voi erityisen helposti käyttää myös vahingossa.
Ongelman voi nopeasti ratkaista laittamalla tietokantayhteyden esimerkiksi luokan tai funktion sisään. Tällöin require_once yhdessä paikassa riittää ja käytössä on nimi, jota ei voi vahingossa ylikirjoittaa.
Funktioratkaisu:
function yhteys() { static $yhteys = null; if ($yhteys === null) { $yhteys = plaa_connect(plaa); } return $yhteys; } // require_once ja mysql_query("PLAA", yhteys())
Luokkaratkaisu:
class yhteys { public static $yhteys = null; } if (yhteys::$yhteys === null) { yhteys::$yhteys = plaa_connect(plaa); } // require_once ja mysql_query("PLAA", yhteys::$yhteys)
Lisäksi kannattaa muistaa sekin vaihtoehto, että kun tietokantayhteyksiä on vain yksi, sitä ei tarvitse edes antaa parametrina MySQL-funktioille.
Metabolix kirjoitti:
Globaalit muuttujat ovat joka tapauksessa PHP:ssä vielä pahempi asia kuin monissa muissa kielissä (esim. C:ssä), koska PHP:ssä niitä voi erityisen helposti käyttää myös vahingossa.
En tiedä puhutaanko me nyt samasta asiasta, mutta eikö PHP:ssä funktion sisään pidä kirjoittaa
global $muuttuja
jos haluaa käyttää globaalimuuttujaa $muuttuja. Eli en nyt heti ymmärrä miten tuo tapahtuu vahingossa.
Ja toisaalta funktioiden ja luokkien ulkopuolella ei kai voi käyttääkään mitään muita kuin globaalimuuttujia? (Tai luokkien julkisia muuttujia, mutta oliot on kuitenkin globaalimuuttujissa)
Aihe on jo aika vanha, joten et voi enää vastata siihen.