PDA

View Full Version : [PHP]Fatal error: Using $this when not in object context


Mattyfog
17-10-2010, 21:35
Come mai con questo codice ricevo l'errore
Fatal error: Using $this when not in object context in D:\Program Files\EasyPHP-5.3.2i\www\Mattyfog CMS\config.php on line 15 ?
class Database {

//impostazioni
private $nomeutente = "root";
private $password = "";
private $host = "127.0.0.1";
private $database = "mattyfog_cms";
private $prefisso = "cms_";
//fine impostazioni

public static function Connetti() {

$mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);
}
}

Grazie!

tomminno
17-10-2010, 23:39
Sarà mica che il metodo è statico? :D

Mattyfog
18-10-2010, 07:22
:D

Mattyfog
18-10-2010, 19:49
Ho controllato... E' una classe!

Supdario
18-10-2010, 20:25
Ho controllato... E' una classe!

Penso che si riferisse a questo:
public static function Connetti() {

Mattyfog
18-10-2010, 21:17
No, l'errore si riferisce alla riga 15 che è quella della connessione mysqli.

tomminno
18-10-2010, 23:15
No, l'errore si riferisce alla riga 15 che è quella della connessione mysqli.

Ma hai capito almeno che errore ti viene segnalato?
Secondo te un metodo statico come fa ad avere un riferimento a $this?

kevinpirola
19-10-2010, 12:37
infatti il problema viene segnalato sulla riga 15 perchè un metodo statico non può usare $this... ma ovviamente vale anche l'affermazione contraria, cioè che this non può essere usato in una classe statica, o cambi uno o cambi l'altro....

Mattyfog
26-10-2010, 17:13
Ok, capito. Questo problema l'ho risolto ma ora ne ho un altro.
Fatal error: Call to a member function query() on a non-object in D:\Program Files\EasyPHP-5.3.2i\www\Mattyfog CMS\config.php on line 36

<?php

class Database {

//impostazioni
private static $nomeutente = "root";
private static $password = "";
private static $host = "127.0.0.1";
private static $database = "mattyfog_cms";
private static $prefisso = "cms_";
private static $mysqli;
//fine impostazioni

public static function Connetti() {

$mysqli = new mysqli(self::$host, self::$nomeutente, self::$password, self::$database);

if (mysqli_connect_errno())
{
$mysqli = new mysqli(self::$host, self::$nomeutente, self::$password, self::$database);

if (mysqli_connect_errno())
{
echo "Errore durante la connessione al DBMS: ".mysqli_connect_error();
exit();
}
}
}

public static function Chiudi() {
close();
}

public static function Query($query) {

$result = self::$mysqli->query($query);
return $result;
}
}

Come posso risolverlo?
Grazie!

tomminno
26-10-2010, 17:25
Ma perchè stai usando tutti metodi statici?
La tua è una normalissima classe, dovresti abolire tutti gli static presenti nel codice.

Mattyfog
26-10-2010, 17:33
Ma non esiste un modo per evitare di inizializzare la classe visto che tanto le variabili nella classe avranno sempre gli stessi valori?

Mattyfog
26-10-2010, 17:41
Comunque faccio come mi dici ;)
Edit: ho modificato la classe ma ho lo stesso errore di prima:

<?php

class Database {

//impostazioni
private $nomeutente = "root";
private $password = "";
private $host = "127.0.0.1";
private $database = "mattyfog_cms";
private $prefisso = "cms_";
private $mysqli;
//fine impostazioni

public function Connetti() {

$mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);

if (mysqli_connect_errno())
{
$mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);

if (mysqli_connect_errno())
{
echo "Errore durante la connessione al DBMS: ".mysqli_connect_error();
exit();
}
}
}

public function Chiudi() {
close();
}

public function Query($query) {

$result = $this->mysqli->query($query);
return $result;
}
}

tomminno
26-10-2010, 20:23
Hai un debugger php a disposizione?
Hai provato a vedere cosa contiene $this->mysqli?
Ecco ti consiglio di indagare in quella direzione perchè ci sono evidenti errori nel tuo codice

Mattyfog
26-10-2010, 21:19
Debugger? Uso Eclipse e Easy PHP (apache mysql5).
Come posso installare o usare un debugger?

tomminno
27-10-2010, 08:45
Debugger? Uso Eclipse e Easy PHP (apache mysql5).
Come posso installare o usare un debugger?

E' un pezzo che non uso più php ma io usavo il debugger con Netbeans.

Comunque usa sempre $this per le variabili d'istanza ;)

Mattyfog
27-10-2010, 18:41
Capito ;)
Ma è possibile creare una classe in un'altra classe? Se si come?
Intendo qualcosa del tipo
class Ciao {
classi Pippo {}
}

kk3z
28-10-2010, 18:10
Ma non esiste un modo per evitare di inizializzare la classe visto che tanto le variabili nella classe avranno sempre gli stessi valori?
Non è vero, a meno che non vuoi inizializzare mysqli ogni volta che viene chiamato il metodo Query().

Così dovrebbe funzionare (devi usare $this->variabile sia per assegnare che per richiamare)

<?php

class Database {

//impostazioni
private $nomeutente = "root";
private $password = "";
private $host = "127.0.0.1";
private $database = "mattyfog_cms";
private $prefisso = "cms_";
private $mysqli;
//fine impostazioni

public function Connetti() {

$this->mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);

if (mysqli_connect_errno())
{
$this->mysqli = new mysqli($this->host, $this->nomeutente, $this->password, $this->database);

if (mysqli_connect_errno())
{
echo "Errore durante la connessione al DBMS: ".mysqli_connect_error();
exit();
}
}
}

public function Chiudi() {
close();
}

public function Query($query) {

$result = $this->mysqli->query($query);
return $result;
}
}


EDIT: a parte che non ho capito perchè inizializzi due volte mysqli con gli stessi valori... se non funziona una volta non è che la volta dopo funziona :D

Mattyfog
28-10-2010, 19:01
Il mio "Capito" pensavo facesse intendere che avevo risorlto il problema. Comunque ho 2 domande:
1) è possibile dichiarare una classe dentro una classe?
2) una classe come questa è davvero poco sicura: chiunque conosca la struttura della classe potrebbe accedere al database e farci quello che vuole. Come ovviare a questo? L'unica idea che mi è venuta in mente è di passare i dati per la connessione al db alla classe e di non salvarli in essa

Mattyfog
29-10-2010, 23:54
Mannaggia a voi... Come farò a passare la notte davanti al pc se non mi rispondete??
Scherzo, grazie di tutto! :)
Up!

tomminno
30-10-2010, 12:21
Il mio "Capito" pensavo facesse intendere che avevo risorlto il problema. Comunque ho 2 domande:
1) è possibile dichiarare una classe dentro una classe?


Una rapida ricerca con google dice che non è possibile in PHP dichiarare nested class. Personalmente non ne ho mai sentito il bisogno in PHP, quindi non so se ci siano vie traverse per ottenere un equivalente.


2) una classe come questa è davvero poco sicura: chiunque conosca la struttura della classe potrebbe accedere al database e farci quello che vuole. Come ovviare a questo? L'unica idea che mi è venuta in mente è di passare i dati per la connessione al db alla classe e di non salvarli in essa

Che vorrebbe dire poco sicura? Quella classe serve per accedere al database quindi nei limiti del previsto dalla classe stessa chiunque può usare il database a suo piacimento.
Eventualmente i dati di accesso li puoi tenere su un file di configurazione, non mi pare certo una buona idea replicare le credenziali di accesso al db su tutti i possibili chiamanti.

Mattyfog
30-10-2010, 13:18
Ah, si chiamano nested class. Non sapevo ;)
Per quanto riguarda la sicurezza mi chiedevo questo:
un software opensource, ad esempio Joomla, ha tutti i dati salvati in un file però non credo che chiunque conosca la struttura della classe (cosa che chiunque può sapere poichè si tratta di software open source) riesca ad accedere al database.
Invece un sito che usa questa mi classe può essere facilmente hackerato da chiunque conosca il codice della classe. Come ovviare?

tomminno
31-10-2010, 11:16
Per quanto riguarda la sicurezza mi chiedevo questo:
un software opensource, ad esempio Joomla, ha tutti i dati salvati in un file però non credo che chiunque conosca la struttura della classe (cosa che chiunque può sapere poichè si tratta di software open source) riesca ad accedere al database.


Scusa ma cosa intendi di preciso? Qualcuno che ha a che fare con Joomla non ha accesso diretto alle classi per l'accesso al db. E così nel tuo software ci sarà sempre almeno un'interfaccia utente davanti. Quindi la tua classe potrà essere usata solo nei limiti imposti dall'interfaccia utente che la utilizza (Sql Injection e XSS permettendo).


Invece un sito che usa questa mi classe può essere facilmente hackerato da chiunque conosca il codice della classe. Come ovviare?

Perchè scusa?
Diciamo che la tua classe è molto molto debole nei confronti di attacchi, in quanto utilizzi query dirette per cui sicuramente soggette ad injection, ma non la puoi richiamare direttamente da browser.

Mattyfog
31-10-2010, 11:39
Quindi per esempio Joomla non rilascia gli script relativi alla connessione php?
Comunque quello che dico io è che credo che chiunque possa scrivere in un proprio script php

include ("posizione del mio script");
$database = new Database();
$database->Connetti();
$risultati = Database->Query("query maligna");

E' giusto quello che dico o no?
Forse se all'inizio dell'inizializzazione di un oggetto di tipo Database venissero richiesti i dati di accesso al database si risolverebbe la cosa.
E' sbagliato ciò dico?
Dell'sql injection ora leggo qualcosina su internet...

tomminno
31-10-2010, 11:46
Quindi per esempio Joomla non rilascia gli script relativi alla connessione php?
Comunque quello che dico io è che credo che chiunque possa scrivere in un proprio script php

include ("posizione del mio script");
$database = new Database();
$database->Connetti();
$risultati = Database->Query("query maligna");

E' giusto quello che dico o no?
Forse se all'inizio dell'inizializzazione di un oggetto di tipo Database venissero richiesti i dati di accesso al database si risolverebbe la cosa.
E' sbagliato ciò dico?
Dell'sql injection ora leggo qualcosina su internet...

Scusami tanto, ma questo chiunque dovrebbe avere accesso fisico al server. Se ha tale privilegio la classe per l'accesso al db se la scrive da solo, spulcia i file sul server prende le credenziali d'accesso e via.

Mattyfog
31-10-2010, 11:55
Ma il fatto è che siccome le credenziali di accesso al database usando la mia classe non vengono richieste allora chiunque potrebbe esseguire query. No?

Mattyfog
31-10-2010, 19:32
Insomma, quello che non ho capito è chi potrebbe utilizzare il mio script tramite un semplice include("url script").

tomminno
01-11-2010, 11:53
Insomma, quello che non ho capito è chi potrebbe utilizzare il mio script tramite un semplice include("url script").

Qualcuno che ha accesso ai file presenti sul tuo server.

Se io da remoto provassi a fare l'include del tuo codice tramite url, la richiesta verrebbe elaborata dal tuo server tramite l'interprete PHP, e non riuscirei ad ottenere il codice della tua classe.

Mattyfog
01-11-2010, 11:59
Perfetto! Ho però ancora una domanda: io ho acquistato un hosting condiviso visto che un server non mi serve e costerebbe solamente di più.
Dunque, con un hosting condiviso ci sono più siti presenti su uno stesso server fisico. Ora mi chiedo: gli altri siti che si trovano sul mio stesso server potrebbero riuscire ad includere il mio file php oppure in realtà il mio sito si trova su un server virtuale che quindi figura come server separato dal loro in modo tale che essi non possano accedere ai miei file php?
Spero di essermi spiegato.

tomminno
01-11-2010, 12:22
Perfetto! Ho però ancora una domanda: io ho acquistato un hosting condiviso visto che un server non mi serve e costerebbe solamente di più.
Dunque, con un hosting condiviso ci sono più siti presenti su uno stesso server fisico. Ora mi chiedo: gli altri siti che si trovano sul mio stesso server potrebbero riuscire ad includere il mio file php oppure in realtà il mio sito si trova su un server virtuale che quindi figura come server separato dal loro in modo tale che essi non possano accedere ai miei file php?
Spero di essermi spiegato.

Un servizio di hosting condiviso per definirsi tale dovrebbe certamente impedire l'accesso ai file di altri utenti tramite l'impostazione di permessi sul server in maniera opportuna.
Se anche il tuo hosting fosse su un server virtuale dovrebbe comunque convivere con altri domini.

Mattyfog
01-11-2010, 12:34
Capito ;)
Ora studio un po' di roba con sql injection... Nel frattempo se sai aiutarmi nell'altro thread (che riguarda sempre questa classe) mi faresti un grande piacere ;)