2015-01-10 14 views
6

Sto cercando di recuperare più dati da un database con una funzione PHP, ma in qualche modo quando lo faccio più volte dà un errore di connessione MySQL.Chiama una funzione PHP più volte crea l'errore MySQL

$heat=getStat("heat", $userid); 
$cash=getStat("cash", $userid); 
echo mysql_error(); 

Io uso il codice sopra per assegnare le variabili chiamando una funzione che recupera le statistiche da un database.

Quando uso i codici di cui sopra separatamente, funzionano. Ma quando li metto insieme falliscono.

Si tratta di un semplice errore di programmazione di tipo no-beginner-noob?

Ho dimenticato di inviare la funzione così qui è:

function getStat($statName,$userID) { 
    require_once 'config.php'; 
    $conn = mysql_connect($dbhost,$dbuser,$dbpass) 
     or die('Error connecting to MySQL' . mysql_error()); 
    mysql_select_db($dbname); 
    $query = sprintf("SELECT value FROM user_stats WHERE stat_id = (SELECT id FROM stats WHERE display_name = '%s' OR short_name = '%s') AND user_id = '%s'", 
    mysql_real_escape_string($statName), 
    mysql_real_escape_string($statName), 
    mysql_real_escape_string($userID)); 
    $result = mysql_query($query); 
    list($value) = mysql_fetch_row($result); 
    return $value;   
} 
+5

Avremmo bisogno di vedere la definizione della funzione 'getStat()' per avere idea di ciò che fa, come pure come qualsiasi connessione al database correlato e codice di interrogazione. –

+0

Un colpo totale al buio - la funzione 'getStat()' _close_ una connessione globale al database MySQL che non si è aperta, quindi la stessa connessione non è presente per le chiamate successive. –

+2

Che errore ottieni in modo specifico? Questo non sembra un errore _unless_ hai un numero limitato di connessioni MySQL e ne apri troppe. Sarebbe preferibile chiamare 'mysql_connect()' solo _once_, al di fuori di questa funzione, piuttosto che aprire una nuova connessione ogni volta che la funzione è calle.d –

risposta

-2

prova per il successo della prima chiamata a tale funzione, prima di passare alla prossima chiamata. Chiamarli in modo contiguo, senza attendere il risultato dell'altro, potrebbe non rilevare errori. È necessario attendere e reagire alla risposta del server dalla chiamata al database.

Confermare la chiamata al database, quindi passare a richiamare la funzione. Non basta interrogare ciecamente un database senza la capacità di catturare e reagire agli errori.

if($heat=getStat("heat", $userid)){ 
     $cash=getStat("cash", $userid); 
    } 

Recuperare uno - attendere/verificare i risultati - recuperare l'altro.

+3

Le query PHP e MySQL non vengono eseguite in modo asincrono. Si aspetta sempre il precedente per natura procedurale. –

+1

se li chiami in modo contiguo - senza aspettare il risultato dell'altro - allora sei destinato a fallire. Devi aspettare e reagire alla risposta del server ... non solo il PHP "asincronia" inoltre - ha pubblicato la funzione dopo aver commentato ...e grazie per la negatività @cybermonkey – Kreeverp

+1

Anche se questo non cambia la mia risposta. È la stessa cosa che sospettavo prima di vedere la funzione - si chiama la stessa funzione due volte - senza nemmeno preoccuparsi di controllare, testare, gestire un errore o persino dare un'occhiata ai risultati di una chiamata al database. l'OP non si è nemmeno preoccupato di postare l'errore che sta ottenendo ... quindi quale altro potrebbe essere il problema ... la funzione sta fallendo alla chiamata e lui non la sta gestendo in alcun modo. Resto in attesa della mia risposta - prova per i risultati - chiama il prossimo. – Kreeverp

5

Il problema è probabilmente causato dallo require_once. Poiché è qui che stai inserendo la tua configurazione per la connessione al database. La seconda volta che viene eseguita la richiesta, non verrà inserito il codice richiesto per definire la connessione del database vars.

Come ha dichiarato @MichaelBerkowski, sarebbe molto meglio avere una connessione globale quando lo script viene caricato e utilizzare questa connessione per ogni richiesta al database. Tuttavia, se si vuole rimanere con il modo in cui si dispone attualmente, questo dovrebbe risolvere il problema:

function getStat($statName,$userID) { 
    require 'config.php'; /// <-- note this has changed to just require 
    $conn = mysql_connect($dbhost,$dbuser,$dbpass) 
     or die ('Error connecting to mysql'); 
    mysql_select_db($dbname); 
    $query = sprintf("SELECT value FROM user_stats WHERE stat_id = (SELECT id FROM stats WHERE  display_name = '%s' OR short_name = '%s') AND user_id = '%s'", 
     mysql_real_escape_string($statName), 
     mysql_real_escape_string($statName), 
     mysql_real_escape_string($userID)); 
    $result = mysql_query($query); 
    list($value) = mysql_fetch_row($result); 
    return $value;  
} 
+0

Oh, ben individuato. Non sarebbe un problema se non per scope variabile nella funzione. –

+1

Io sposterei la connessione al di fuori della funzione completamente però ... –

+0

oke, grazie ad entrambi per il vostro aiuto ragazzi! Proverò a spostare la connessione al di fuori della funzione (sono davvero nuovo per SQL e php) ma prima proverò a richiedere il cambiamento! – Mark

Problemi correlati