Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Trying to get property of non-object

punppis [11.03.2009 01:12:30]

#

Ajattelin tässä ruveta tekemään ensimmäistä olio-pohjaista testiprojektia PHP:lla. Alkumetreillä tuli ongelmia, johon ei mistään tunnu saavan apua. Suurin osa googlesta saaduista vastauksista vaan neuvoo laittamaan error reportingin pois päältä tai pienemmälle tasolle...

Virheilmoitus:

Notice: Undefined variable: settings in mysql.php on line 10

Notice: Trying to get property of non-object in mysql.php on line 10

mysql.php

<?php
	require_once("settings.php");

	class MySQL {
		private $handle;
		function __construct($ip = "default", $user = "default", $pass = "default") {
			if($ip == "default" && $user == "default" && $pass == "default") {
				$ip = $settings->mysqlIp;
				$user = $settings->mysqlUser;
				$pass = $settings->mysqlPass;
			}
			echo "<h1>".$settings->mysqlIp."</h1>";
			$this->handle = mysql_connect($ip, $user, $pass) or die($lang->mysqlConnectFail."<br/>\n".mysql_error());
		}
		function __destruct() {
			mysql_close($this->handle); echo "debug";
		}
	}

	$mysli = new MySQL;
?>

settings.php

<?php
	class Settings {
		public $defaultLang = "en";
		public $mysqlIp = "localhost";
		public $mysqlUser = "root";
		public $mysqlPass = "";

		function __construct() {
			if(!@include_once("../lang/".$this->defaultLang.".php")) {
				die("Language file could not be found!<br/>\nKielitiedostoa ei löydy!");
			}
		}
	}

	$settings = new Settings;
?>

Yritän myös echottaa tuota muuttujaa tuossa h1-tageihin, mutta eipä tulosta mitään. Kumma kun kuitenkin tuo kielen asetus onnistuu settings.php-tiedostossa...

Kutsutaanko luokkien __destruct-funktiota aina kun skriptin suoritus lopetetaan, vai onko tämä joku php.inin asetuksista? On meinaan melko kätevä tuo destructin yhteydessä myslin yhteyden sulkeminen. Ei tarvitse erikseen sitä sitten sulkea.

Edittiä: Niin ja tuleehan tuo valitus tietysti jokaisesta tulostusyrityksestä, eikä pelkästään tuon ip:n kohdalla. Rivit 10,11,12,14 ja 15 siis kyseessä.

Edit2: Sain toimimaan kun laitoin __construct-funtion sisään rivin "global $settings". Aivot vähän jäässä.

Teuro [11.03.2009 07:19:12]

#

Onko todella tarvetta luoda $settings olio staattisia mysql asetuksia varten, koska nuo muuttujat tuskin muuttuvat koskaan. Muutenkin tuota ajattelua voisi ehkä hiukan muuttaa toiseen suuntaan.

Olisiko tällaisesta muutoksesta apua?

<?php
***mysql.php
class mysql{
  private $yhteys;
  private $kanta;
  private $kayttaja;
  private $salasana;
  private $osoite;

  public function __costruct( $os, $tu, $pa, $ka ){
    $this -> kayttaja = $tu;
    $this -> salasana = $pa;
    $this -> osoite = $os;
    $this -> kanta = $ka;
  }

  public function yhdista(){
    $this -> yhteys = mysql_connect( $this -> osoite, $this -> tunnus, $this -> salasana );

  mysql_select_db( $this -> kanta );
  }
}

Varsinaisen sivun puolella lisäät vaikkapa asetukset.php sivun, jossa on luotu tuo $settings olio. Esimerkiksi näin voisi hoitaa tuon puolen.

***index.php
<?php
require("liita/asetukset.php");

$asetus = new Asetus( "localhost", "root", "", "kanta" );
$mysql = new mysql( $asetus -> osoite, $asetus -> tunnus, $asetus -> salasana, $asetus -> kanta );
?>

Metabolix [11.03.2009 10:45:49]

#

Itse ongelma on, että globaalit muuttujat eivät oletusarvoisesti näy funktioiden sisällä.

<?php
$i = 1;
function f() {
  $i = 2; // paikallinen $i, eri kuin globaali
}
function g() {
  global $i; // käytetään globaalia $i:tä
  $i = 2;
}
f();
echo $i, "\n"; // edelleen 1
g();
echo $i, "\n"; // nyt 2
?>

Jos asetuksia on vain yhdet, voit tehdä näinkin:

<?php
class Settings {
  public $asetus = 1;
  private static $settings;
  public function get() {
    if (!self::$settings) {
      self::$settings = new Settings();
    }
    return self::$settings;
  }
}

echo Settings::get()->asetus, "\n";
?>

Toisaalta tällöin on luultavasti järkevää käyttää täysin staattisia funktioita ja muuttujia, jolloin yhtään Settings-oliota ei tarvitse luoda.

<?php
class Settings {
  public static $asetus = 1;
}

echo Settings::$asetus, "\n";
?>

punppis [11.03.2009 12:06:43]

#

Tarkoitus on siis sellainen, että loppukäyttäjän tarvitsee muokata pelkästään tuonne settings.php-tiedostoon omat asetuksensa. Ehkä jossain vaiheessa voisi tehdä jonkun installerin, joka tekisin tämän käyttäjän puolesta. Koska koodi on näin alkuvaiheessa, ei tuonne asetuksiin ole vielä muita muuttujia päässyt.

Metabolix [11.03.2009 12:28:15]

#

Voin melkeinpä suositella ini-tiedostojen käyttöä. Luultavasti loppukäyttäjäkin ymmärtää paremmin niitä kuin PHP-muuttujia.

Vastaus

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

Tietoa sivustosta