PHP:funzione che opera una query su argomento

davideb93

Nuovo Utente
19 Feb 2016
5
0
0
Sera a tutti mi sono imbattuto in un potenziale problema. E' possibile creare funzionioni di questo tipo in php?

function f1($a,$b){
$prova = $con->query("SELECT * FROM tabella WHERE attributo1 = $a AND attributo2 = $b");}

function f(2$table){
$prova = $con->query("SELECT * FROM $table");}

Poi mi servirebbe poterle chiamare nel seguente modo

f1("val1","val2") e f2("tabella1")

Ho provato anche cose del tipo "SELECT....attributo1 = ".$a." AND "etc.. ma non funzionano.

Io ho definito le funzioni nello stesso file in cui vengono richiamate e il mio presentimento sull'errore (query riferita a un non oggetto) è che quando viene effettuato il parsing del file quando raggiunge la riga dentro la funzione f1 esegua subito la query senza considerare che è solo il corpo di una funzione e chiaramente da errore perchè $a e $b non sono stati definiti. Qualcuno ha qualche idea? Buonaserata
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
purtroppo non hai definito $con all'interno della funzione,
per non doverla passare come parametro puoi definirla come global
ovvero la variabile definita nel corpo, vale anche nelle funzioni
PHP:
function f2($table){
    global $con;
    $prova = $con->query("SELECT * FROM $table");}
 

davideb93

Nuovo Utente
19 Feb 2016
5
0
0
Grazie per la risposta , ecco il mio codice:

PHP:
$user = "***";
$pass = "***";
$db = "***";
$host = "localhost";

$con = mysqli_connect($host,$user,$pass,$db);
        if (mysqli_connect_errno())
       {
           echo "Failed to connect to MySQL: " . mysqli_connect_error();
       }

function f2($table){
    $prova = $con->query("SELECT * FROM $table");}
devo comunque impostare la variabile global come hai fatto tu? anche se è già definita sopra?
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
devo comunque impostare la variabile global come hai fatto tu?
SI
anche se è già definita sopra?
a differenza di altri linguaggi, php vuole tutte le variabili definite all'interno della funzione, non considerando quelle già definite altrove,
alla funzione si passano i valori come parametri e/o con "global" (un metodo non esclude l'altro),
trattandosi della "connessione" al db, la riterrei "global" in tutte le funzioni che hai definito
ciao
Marino

ps,
nel tuo codice non vedo la chiamata alla funzione, suppongo tu abbia postato un "pezzetto" di codice a sostegno dell'argomento

nella funzione manca anche il return ...., ovvero scritta a quel modo, non ti ritorna nulla
anche in questo caso puoi usare "return $prova" o mettere "$prova" nel global
 
Ultima modifica:

davideb93

Nuovo Utente
19 Feb 2016
5
0
0
nel tuo codice non vedo la chiamata alla funzione, suppongo tu abbia postato un "pezzetto" di codice a sostegno dell'argomento
esatto.
Comunque una cosa non capisco , la mia funzione dovrebbe solo effettuare una query con il database può anche non ritornare niente.
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
occorre distinguere il risultato di un operazione, dalla logica con cui ottenerlo e trattarlo,

l'operazione di ricerca (select) nel database (query), restituisce sempre un risultato,
il risultato può essere "pieno", nel caso abbia trovato dei dati, o "vuoto", nel caso la selezione non abbia trovato nulla,
in relazione alle condizioni poste

la funzione fa parte della logica, con cui viene eseguita la sequenza delle operazioni, che portano ad avere un determinato risultato finale

di conseguenza il corpo del programma e le funzioni devono integrarsi, logicamente tra loro,
scambiando le dovute informazioni

perchè la funzione deve restituire il risultato "pieno" o "vuoto" che sia ?
perchè il programma (script) possa operare nell' ottenere il risultato per cui é stato impostato

d'altra parte perché passare alla funzione dei parametri con cui operare e non ottenere il risultato dell'operazione ?

il codice riscritto sotto, fa trovare nel corpo (main) del programma il risultato su cui operare

spero sia sufficiente
ciao
Marino

PHP:
$user = "***";
$pass = "***";
$db = "***";
$host = "localhost";

$con = mysqli_connect($host,$user,$pass,$db);
        if (mysqli_connect_errno())
       {
           echo "Failed to connect to MySQL: " . mysqli_connect_error();
       }
$prova = f2("nomedellatabella");
echo "elementi trovati : ".count($prova);

function f2($table)
{
  global $con
  return $con->query("SELECT * FROM $table");
}
ma si poteva anche scrivere
PHP:
$prova = f2($con, "nomedellatabella");
function f2($con, $table)
evitando il "global"
 

davideb93

Nuovo Utente
19 Feb 2016
5
0
0
Ciao marino. .si mi stavo confondo. .chiaro che se selezioni qualcosa da qualche parte andrà messo il risultato...ero convinto stessimo parlando di inserimento. Per quello il discorso è analogo?
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
nei tuoi esempi c'è una select per questo sono rimasto stupito nel non vedere gestito il risultato,

in ogni caso per rispondere alla tua ultima domanda, questo è il metodo che uso nel caso di insert update e delete in tutte le mie applicazioni
PHP:
public function queryM($sql, $params=array())    // return the involved rows counted (insert update delete)
{
  return $this->BindParams($sql, $params)->rowCount();
}
come vedi mi restituisce sempre come risultato, il numero di elementi coinvolti nell'operazione,
se inserisco, modifico, cancello qualche elemento nel database, voglio essere sicuro che l'operazione venga eseguita
non eseguo una query di questo tipo per caso, ma perchè deve agire, quindi ne controllo il risultato

altri potranno dirti che non lo fanno, ma io ho sempre preferito le certezze
ciao
Marino