PHP include classe

tucu49

Nuovo Utente
15 Apr 2019
7
0
1
Ciao a tutti,

Sono un vecchio informatico al quale costa molto entrare nella logica delle nuove piattaforme. Da giorni sto sbattendo la testa con un problema che forse sarà banale ma non trovo una soluzione né una letteratura che mi possa aiutare.

Nella pagina index.php (nella root) includo due file:
PHP:
include (“classi/classMySqlDb.php”);
include (“applicazioni/full_user.php”);

in realtà, mi aspettavo che la classe “GestioneDb” costruita in “classMySqlDb.php” sia accessibile anche su full_user.php ma non è così.

Se dentro ad una funzione di full_user.php dichiaro
PHP:
$conn = new Gestione Db;
php si incazza: “Fatal error</b>: Uncaught Error: Class 'GestioneDB' not found in
C:\xampp\htdocs\itango\applicazioni\full_user.php:1193”

Se invece pretendo includere nuovamente la classe in “full_user.php” con
PHP:
include (“../classi/ classMySqlDb.php”);
php si incazza di meno ma si incazza comunque dandomi un
Warning: include(../classi/classMySqlDb.php): failed to open stream: No such file or directory in C:\xampp\htdocs\itango\applicazioni\full_user.php on line 31

Se in “full_user.php” non includo la classe (perché suppongo che è già inclusa), quando cerco di inizializzare la variabile
PHP:
$conn = new Gestione Db; anche fuori delle funzioni, php
si incazza come una iena e mi da

<b>Fatal error</b>: Uncaught Error: Class 'GestioneDB' not found in C:\xampp\htdocs\itango\applicazioni\full_user.php:33

Io so che voi tutti siete al mare ma se qualcuno legge mi può dare qualche diritta?


grazie e buone vacanze
chau
 
Ultima modifica di un moderatore:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.181
312
83
@tucu49
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
o il tag
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti


Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
supponendo tu voglia passare "$conn" per eseguire operazioni sul db,
dentro ad una funzione di full_user.php puoi dichiarare
PHP:
    function xyz()
    {
        global $conn;
ovviamente "$conn" è stata valorizzata prima di richiamare la funzione "xyz"
 

tucu49

Nuovo Utente
15 Apr 2019
7
0
1
Ciao Marino51,
ciao, innanzitutto grazie per rispondermi e sistemare il mio post. E’ la prima volta che scrivo, imparerò anche questo.

Allora tu mi consigli
index.php
PHP:
include ("classi/classMySqlDb.php");
include ("applicazioni/full_user.php");
$conn = new Gestione_Db;
full_user.php
PHP:
function xyz(){
      global $conn;
      ......
}
Così funziona, l'avevo provato già ma, l'avevo scartato perché in questo caso, $conn sarà sempre lo stesso oggetto. Scusa forse sto dicendo una cavolata, tutto questo per me è cinese, magari la cosa funziona lo stesso anche se una funzione di full_user che usa $conn chiama un'altra funzione che anche essa usa $conn. Per questo motivo, avevo pensato di creare una funzione in index:
PHP:
funzione objDb(){
      $conn = new Gestione_Db;
      return $conn;
}
in modo di ottenere un nuovo oggetto $conn da full_user valorizzando
PHP:
$conn = objDb();
ma il problema è che, curiosamente, da full_user.php, che è stato incluso in index.php e quindi, sarebbe come un unico script, non riesce a vedere la funzione objDb().
A questo punto, cosa fare? faccio tutte le operazioni nel database con lo stesso $conn?
ti saluto
 

marino51

Utente Attivo
28 Feb 2013
2.865
153
63
Lombardia
devi considerare le regole di visibilità delle variabili,
normalmente le variabili sono visibili dove dichiarate la prima volta
non sono visibili nelle funzioni se non sono passate esplicitamente come parametri della funzione o con la "global"
per ridurre al minimo l'incrocio, tutte le funzioni afferenti una "finalità" dovrebbero stare nella stessa classe
ovvero tutti i metodi (funzioni) che afferiscono al db meglio metterle nella stessa classe
cercando di renderle il più "anonime" possibile al fine di utilizzarle "sempre"

ti propongo due letture, più serie di quanto scritto da me,
https://www.culttt.com/2012/10/01/roll-your-own-pdo-php-class/
https://phpdelusions.net/pdo
 

tucu49

Nuovo Utente
15 Apr 2019
7
0
1
Ciao Marino51,
grazie ancora per rispondere e per i link consigliati che ho letto. Ciò nonostante il problema non riguarda la classe o pdo che funziona perfettamente e se ti va lo puoi comprovare entrando nel sito che sto preparando in

https://www.airesdetango.it
facendo doppio click sul logo del "sito en preparazione" apparirà un campo e un bottone dove dovrai inserire il seguente codice "z4BqKjhD" la parte funzionante sono tutti i menu della barra superiore (tranne la geolocalizzazione automatica) e i tre menu del piede pagina. Cioè potrai registrarti, confermare la registrazione, loggarti e uscire, chi siamo, collaboratori e contattaci.

Tutte le operazioni col database (MySql) sono a carico della classe "classMySqlDb.php" e tutte le operazioni con gli utenti sono a carico di "full_user.php" che non è una classe perché, con la mia età e la mia formazione, mi risulta molto più facile la programmazione di tipo procedurale e ti chiedo di comprendermi.

Quando iniziai con questo capriccio di fare un sito di tango (giacché sono argentino), ogni volta che volevo provare se funzionava in remoto dovevo cambiare i parametri del database e delle directory. Allora per evitare questo ho creato in locale un file texto “localhost.txt” che quando parte index.php vado a testare la esistenza con la funzione di php “is_file” e imposto la $_SESSION[‘LOCALHOST’]. Secondo questa sessione sia true o false predispongo le opzioni. In questo modo ho dei programmi che funzionano simultaneamente sia in locale che in remoto senza dover modificare nulla.

Siccome i contenuti dei boxs di tutti i forms sono nel database, ho bisogno della classe in "classMySqlDb.php" per prelevare i dati e quindi, devo per forza includerla in ogni form

PHP:
//PARAMETRI BOX1  ///////////////
///////////////////////////////////////
// box1 background_color
//$box1_bg_color = "";
///////////////////////////////////////
// box1 background_image
//$box1_bg_img = "url('immagini/testata/testata-sinistra/logo_airesdetango.png')";
//$box1_cover_contain = "contain";
///////////////////////////////////////
// box1 immagine con link
//$box1_href = "";//"http://www.todotango.com/";
//$box1_imgsrc = "";//"immagini/links/link1/todotango.png";
///////////////////////////////////////
// box1 titolo
//$box1_titolo = "";
//$box1_font_size_h1 = "24px";
//$box1_color_h1 = "red";
//////////////////////////////////////
// box1 paragrafo
//$box1_paragrafo = "";//"<BR>";
//$box1_font_size_p = "";
//$box1_color_p = "";
//////////////////////////////////////
// box1 elenchi puntati con link
//$box1_elenco_link1 = "";//"#";
//$box1_elenco_v1 = "";
//$box1_elenco_link2 = "";//"#";
//$box1_elenco_v2 = "";
//$box1_elenco_link3 = "";//"#";
//$box1_elenco_v3 = "";
//$box1_font_size_ul = "30px";
//$box1_color_ul = "red";
//////////////////////////////////////
// box1 link
//$box1_link = "";
//$box1_link_v = "";
//$box1_link_font_size = "";
//$box1_link_color = "";
///////////////////////////////////////
// box1 footer
//$box1_footer = "";
//$box1_footer_font_size = "";
//$box1_footer_color = "";
// FIN BOX1
Certamente, le operazioni per registrazioni utenti, logon, logout, ecc, a carico del programma "full_user.php" anche questo ha bisogno della classe "classMySqlDb.php" per interagire col database.

In questo modo, nel “index.php” devo includere la classe e anche “full_user”. Secondo quanto avevo letto, la classe dovrebbe essere disponibile anche nel full_user ma non è così. Allora includo con “include_once” anche la classe in “full_user” e così funziona in remoto ma, in localhost mi dà un warning:

Warning: include_once(../classi/classMySqlDb.php): failed to open stream: No such file or directory in C:\xampp\htdocs\itango\applicazioni\full_user.php on line 31

Bene, di tanto provare e provare, adesso scopro che l’include prende la directory del programma chiamato, in questo caso l’index che sta sulla root del localhost, e quando fa l’include nel “full_user” utilizzando, appunto, un indirizzo relativo “../” non trova “full_user” perché (almeno sembra) ha in memoria la root dell’index.php. Facendo l’include della classe con l’indirizzo assoluto C:/xampp/htdocs/itango/classi/classMySqlDb.php funziona tutto ok ma, mi costringe ad una programmazione meno flessibile giacché l’utilizzo di $_SERVER[‘PHP_SELF’] per determinare dove sono risulta inutile.

E poi, se in un "prog_01" includo “classi/class_xx” e “applicazioni/prog_02”, perché in "prog_02" non ho a disposizione class_xx ?

Saluti
 

tucu49

Nuovo Utente
15 Apr 2019
7
0
1
Ho verificato che se nella stessa directory ho "prog_01.php" e "prog_02.php" e se in
"prog_01.php"
PHP:
include ("classi/class_xx.php");
in questo caso "class_xx.php" è disponibile anche nel "prog_02.php".
Mi sembra che, contrariamente a quello che avevo letto e credevo, la funzione php include() non copia lo script dentro l'altro rendendolo come un unico script ma funziona come un segnalibro che ha come punto di partenza la directory del primo programma chiamato. Per questo se nei programmi inclusi ci sono altri include() con percorso relativi, questi file non sono trovati "failed to open stream: No such file or directory". Il problema si potrebbe risolvere utilizzando il percorso assoluto.
 

Marko97

Nuovo Utente
18 Ago 2019
2
0
1
Più semplicemente puoi usare questo:
PHP:
include_once $_SERVER['DOCUMENT_ROOT'].'tuofile.php'; //se si trova nella root
include_once $_SERVER['DOCUMENT_ROOT'].'FOLDER/tuofile.php'; //se si trova in qualche sottocartella.
Inoltre ti consiglio di utilizzare include_once anziché include in quanto è in grado di verificare se è già stato precedentemente incluso, e funziona esattamente come include.
 

tucu49

Nuovo Utente
15 Apr 2019
7
0
1
Grazie Marko97,

Il problema era l'include, indicando il percorso assoluto funziona. Giacché non c'entra la classe, credo che si dovrebbe cambiare il titolo per INCLUDE PERCORSO ASSOLUTO e in più aggiungere RISOLTO que non so come farlo.

Grazie e alla prossima