Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: [PHP] Funktio ja MySQL kysely

Sivun loppuun

combo [07.05.2011 10:55:42]

#

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";
}
?>

Grez [07.05.2011 11:02:41]

#

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"

combo [07.05.2011 11:09:39]

#

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.

Grez [07.05.2011 11:22:42]

#

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.

combo [07.05.2011 11:29:38]

#

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.

ViKiNGi [11.05.2011 19:09:30]

#

include(); sisällyttää tiedoston, mutta require(); palauttaa virheilmoituksen jos kyseistä tiedostoa ei voi ladata (sivun latautuminen keskeytyy).

Triton [11.05.2011 19:25:42]

#

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.

Metabolix [11.05.2011 23:34:35]

#

Ja taas kerran ongelman syynä on globaalien muuttujien käyttö. Siitä kannattaa ihan oikeasti opetella eroon.

Grez [12.05.2011 01:29:56]

#

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.

Metabolix [12.05.2011 02:25:27]

#

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.

Grez [12.05.2011 02:49:43]

#

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)


Sivun alkuun

Vastaus

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

Tietoa sivustosta