PHP include classe

Discussione in 'PHP' iniziata da tucu49, 13 Agosto 2019.

  1. tucu49

    tucu49 Nuovo Utente

    Registrato:
    15 Aprile 2019
    Messaggi:
    7
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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 (../classiclassMySqlDb.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 Dbanche fuori delle funzioniphp
    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: 13 Agosto 2019
  2. Max 1

    Max 1 Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    29 Febbraio 2012
    Messaggi:
    3.867
    Mi Piace Ricevuti:
    286
    Punteggio:
    83
    Sesso:
    Maschio
    @tucu49
    Da regolamento del forum, come tutti noi sei tenuto ad usare il tag [​IMG] o il tag [​IMG] per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti
    [​IMG]

    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
     
  3. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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"
     
  4. tucu49

    tucu49 Nuovo Utente

    Registrato:
    15 Aprile 2019
    Messaggi:
    7
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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
     
  5. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
     
  6. tucu49

    tucu49 Nuovo Utente

    Registrato:
    15 Aprile 2019
    Messaggi:
    7
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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
     
  7. tucu49

    tucu49 Nuovo Utente

    Registrato:
    15 Aprile 2019
    Messaggi:
    7
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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.
     
  8. Marko97

    Marko97 Nuovo Utente

    Registrato:
    18 Agosto 2019
    Messaggi:
    2
    Mi Piace Ricevuti:
    0
    Punteggio:
    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.
     
  9. tucu49

    tucu49 Nuovo Utente

    Registrato:
    15 Aprile 2019
    Messaggi:
    7
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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
     
Sto caricando...

Condividi questa Pagina