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.404
339
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.039
192
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.039
192
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
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1

Discussioni simili