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.449
338
83
@tucu49
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code-gif.6007
o il tag
php-png.6009
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box-inserisci-2-png-jpg.6008


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
3.203
207
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
3.203
207
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
 
Discussioni simili
Autore Titolo Forum Risposte Data
A include in classe PHP PHP 3
G [PHP][RISOLTO] Include/Require non funzionante PHP 9
B sitoweb responsivo problema con include php HTML e CSS 1
G Problema php include PHP 8
C Include PHP e Javascript PHP 4
L Refresh include php con jquery problemi negli script dopo load jQuery 2
filomeni include in php SEO e Posizionamento 3
C Include php PHP 4
G funzione include di php e paramentri variabili PHP 4
Jonn Strutturazione di sito web con Include PHP PHP 2
A [php]Include PHP 12
neo996sps Passare variabile su include di file php PHP 2
M include php, come fare? PHP 11
Z include di php e html PHP 1
P Box form che include codice php PHP 0
D Include PHp PHP 11
G Galleria immagini | funzione include in php PHP 2
F PHP Include e motori di ricerca PHP 7
D Container e include php (incompatibili) HTML e CSS 6
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0

Discussioni simili