Variabile globale e funzioni

di il
4 risposte

Variabile globale e funzioni

Ciao a tutti. Sto riscontrando un problema in un file php che contiene 15 funzioni, questo file (backend) viene richiamato da un altro file (frontend) tramite Ajax ed esegue tutte le 15 funzioni che fanno delle query dal db con relativi calcoli ed altro e restituiscono i risultati. Nell'insieme (frontend e backend) funziona tutto e bene per quello che deve fare, ma nello scrivere ho inserito in ogni funzione come prime istruzioni i parametri di connessioni al db e la connessione stessa. Ora vorrei eliminare ogni volta la connessione al db e farla una sola volta all'inizio del codice, così da evitare di ripeterlo per ogni funzione, quindi l'ho inserito all'inizio del codice, fuori da tutte le funzioni. Per farvi capire, un risultato simile a questo:

<?php
	include("conn_db.php"); // $conn connessione al db
	funzione 1{
		$conn->query($sql);
	}
	funzione 2{
		$conn->query($sql2);
	}
	ecc...
?>
Il codice di conn_db.php è il seguente:

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die('Connection failed: ' . $conn->connect_error);
}
Ovviamente le variabili servername user e simili sono inizializzate. L'errore restituito è il seguente:

Notice: Undefined variable: conn in C:\xampp\htdocs\backend.php on line 101
Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\backend.php:101
La variabile conn dell'errore è la stessa del file conn_db.php. Ho anche provato ad inserire il codice del file nel backend senza successo. La cosa che non capisco, è che la funzione 1 si connette al db, ma la seconda no. Infatti la riga 101 appartiene alla funzione 2 ed è
$result2 = $conn->query($sql2);
uguale alla 1° funzione tranne per il nome delle variabili. Credo sia un discorso di variabili globali, ma facendo ricerche e varie prove non sono venuto a capo. Spero possiate aiutarmi, ogni suggerimento è utile.

4 Risposte

  • Re: Variabile globale e funzioni

    Nel file conn_db.php devi dichiarare
    global $conn;
    e poi avvii la connessione
    $conn = ....
    poi in ogni singola funzione dichiari subito
    global $conn;
    e la utilizzi.

    Questa soluzione è obsoleta e poco sicura, ti consiglio di utilizzare delle classi.
  • Re: Variabile globale e funzioni

    Grazie, così funziona!
    In che modo useresti le classi? Considerando che questo script funzionerà solo in locale, non mi preoccuperei tanto della sicurezza, o magari mi sbaglio.
  • Re: Variabile globale e funzioni

    Figurati.
    Quando si parla di sicurezza non è solo a livello di attacco esterno.
    Parlando di sicurezza si intende anche nell'esecuzione del codice stesso, di manipolazione dati etc.
    Una variabile GLOBAL usata male - esempio pratico - puo' compromettere il corretto instradamento dei dati oppure generare un'errata scrittura su database con perdita dei dati etc etc. piuttosto che mostrare a video dei dati errati oppure, peggio ancora, che non andrebbero mostrati.
    L'utilizzo delle classi ti viene in aiuto nella semplificazione del codice e migliora le performances di esecuzione.
    Quando fai una chiamata alla tua pagina e questa deve eseguire 15 funzioni con 15 query diverse e devi richiamare 15 volte la variabile global $conn in memoria di sicuro vai ad influenzare negativamente il carico di lavoro.
    Considera che quando una funzione termina la sua esecuzione il contenuto occupato dalle variabile dichiarate (non quelle static) al suo interno viene liberato in memoria cosa che non avviene per le variabili global.

    tomrecensioni ha scritto:


    In che modo useresti le classi?
    Esistono delle linee guida di principio che vanno seguite e rispettate, puoi dare un'occhiata qui https://www.w3schools.com/php/php_oop_classes_objects.asp e prendere spunti per realizzare le tue classi che fondamentalmente dovrebbero essere almeno due...una per la connessione al DB ed una per le funzioni che ti servono.
  • Re: Variabile globale e funzioni

    Ho capito, secondo me è anche meglio parlando di scrittura del codice, se dovrò scrivere un altro script con altrettante funzioni (o di più), mi tornerebbe utile la classe. Grazie del suggerimento!
Devi accedere o registrarti per scrivere nel forum
4 risposte