2010-10-05 21 views
5

Questo è un po 'strano per me. PHP è il mio forte, e di solito riesco a capire qualsiasi problema che incontro.Funzione PHP 'return' non restituisce

Ho una struttura personalizzata che uso da anni. Mi sono preso la responsabilità di riscriverlo, e sto facendo essenzialmente tutto lo stesso che ero prima. Il problema sta nel seguente costrutto:

function ModPages_GetPage() { 
    $page = ModPages_GetPageByName($_GET['page_name']); 
    if($page != false) { 
     include(TPL_DIR.'pages/pages.view.php'); 
    } else { 
     ErrorMessage('Invalid Page', 'The selected page could not be found.'); 
    } 
} 


function ModPages_GetPageByName($page_name = null) { 
    $db = new Database; 
    $query = ' 
     SELECT * 
     FROM pages 
     WHERE page_name = "'.CleanStr($page_name).'" 
      AND page_enabled = "yes" 
     LIMIT 1 
     '; 
    $page = $db->GetRow($query); 

    return $page; 
} 

Questo codice è chiamato con 'casa' per il valore di $_GET['page_name']. La chiamata a ModPages_GetPageByName() funziona correttamente, ma il valore di $page in ModPages_GetPage() non viene impostato. In effetti, tutte le dichiarazioni di debug generate dopo quella chiamata non riescono a visualizzare nulla.

I hanno display_errors impostato su on e error_reporting impostato su E_ALL. Ricevo un paio di avvisi dalla mia classe Database, ma il gioco è fatto.

L'esecuzione dello script in una shell non genera errori. Quando si utilizza strace, vedo che il processo sputa un 'exit_group (255)'.

Questo mi ha abbastanza sconcertato. Potrei sicuramente usare qualche direzione su questo.

+0

Sembra che tu abbia controllato che, se tu "var_dump ($ page)" prima di 'return $ page', vedi il valore atteso (una matrice o qualcosa di più complicato?). La classe 'Database' ha un distruttore che potrebbe andare storto? – grossvogel

+0

E hai effettivamente provato ** il debug **? Vale a dire. usa Zend Debugger o xdebug, imposta un breakpoint e passa attraverso il tuo codice ... – wimvds

+0

Dovresti aver provato almeno 'var_dump ($ page)' ora; qual è l'output? – meagar

risposta

0

Mentre alcuni di voi hanno dedicato uno sforzo in più a rispondere a questo, nessuno è stato in grado di vedere il quadro completo, anche in base ai dettagli forniti. Non sono stato in grado di rintracciare il problema alla sua origine, ma sono passato a un altro progetto.

+0

troppo male, che non sei riuscito a capirlo. Ho appena incontrato un problema simile.:-( – aurora

+0

questo può probabilmente avere più cause: ho appena capito che il mio problema era relativo a un parametro errato fornito per il costruttore di un'estensione (mongodb). Mi chiedo ancora, perché php è appena morto con un exit_group (255) invece di segnalare un errore: – aurora

+0

Questa è una domanda piuttosto vecchia ma ho riscontrato un problema simile: il problema era che PDO (presumo che tu stia usando questo) stava accedendo a un altro database all'esterno dell'account utente con le impostazioni dell'host locale e anche se la query è stata eseguita correttamente, si è rifiutata di restituire il risultato anche se restituiva un array assegnato manualmente e non restituiva il risultato. L'aggiornamento delle impostazioni a un database sull'account utente associato all'account ha risolto il problema. lo stesso problema, ma suona sicuramente allo stesso modo. –

0

ok prima di arrivare a una soluzione, in primo luogo possiamo essere sicuri che prima di impostare la variabile $ page, prima solo echo $_GET['page_name'] per vedere se è stato ricevuto un valore.

PK

+1

che renderebbe ricorsiva la funzione GetPage e che la funzione non accetta argomenti ... –

+0

ok controlla ora. risolveremo questo insieme lol – Pavan

+0

Se non si dispone di una risposta, si prega di chiedere maggiori informazioni nei commenti, non risposte. Grazie. – deceze

1

Vorrei pensare che sia la tua ricerca, non dovrei semplicemente restituire il nome della pagina, invece di stelle? come star (*) restituirebbe un array che probabilmente viene restituito come valore? solo la mia ipotesi.

$query = ' 
     SELECT * 
     FROM pages 
     WHERE page_name = "'.CleanStr($page_name).'" 
      AND page_enabled = "yes" 
     LIMIT 1 
     '; 

se si fa un print_r sul ritorno $ page penserei che dovrebbe essere un array

$page = $db->GetRow($query); 
echo "Page:<pre>".print_r($page,true)."</pre><br />\n"; 

Poi magari tornare qualcosa di simile

return $page['page_name_field']; 
+0

Lo scopo della funzione è di restituire l'intero record dalla tabella delle pagine. Dopo l'esecuzione della query, la classe Database restituisce correttamente la pagina. È la chiamata a ModPages_GetPageByName() che non viene restituita correttamente. – Skudd

0

La vostra fermata sceneggiatura dopo la chiamata al database, o semplicemente non visualizza alcun output?

Se il primo è vero, allora sembra un errore fatale. Con E_ALL, dovrebbe essere visualizzato, sei sicuro che display_errors e error_reporting sono come dici tu a quel punto e che la funzione GetRow non li altera in alcun modo? Se è così, forse c'è qualcosa nel log degli errori di Apache (a volte gli errori PHP vengono registrati lì).

Se quest'ultimo è vero, sto pensando a un'eccezione generata in un metodo che viene chiamato e catturato in una funzione di livello superiore. Per verificare ciò è possibile inserire la chiamata al database (cioè il punto in cui le cose vanno male) all'interno di un blocco try/catch e vedere se si raggiunge il blocco catch.

+0

Se stampo print_r ($ page) prima del reso, tutto va bene e funziona come previsto. Se stampo print_r ($ page) dopo la chiamata a ModPages_GetPageByName(), è vuoto. – Skudd

+0

Una cosa viene in mente: un metodo esteso. Controlla se ModPages_GetPageByName non è definito in una classe estesa. –

+0

Per controllare in modo più preciso il flusso del codice, eseguire un backtrace dopo la chiamata della funzione: 'debug_print_backtrace()' mostra esattamente quali funzioni sono state richiamate/eseguite. –

0

vorrei provare seguente:

  • sostituire $ _GET con $ _REQUEST (forse il modulo sta usando POST?
  • fare un print_r per controllare il contenuto delle variabili.
  • usa mysql_error per visualizzare eventuali errori, o stampa la tua query mysql nel tuo browser, copia/incolla in phpmyadmin, restituisce qualcosa? errore .. dati?
  • una cosa simile mi è successo una volta, il mio framework è stato codificato in ANSI e il mio file php di chiamata era UTF8 + BOM ... Ho cambiato tutto in UTF8 + BOM e ha funzionato.
  • prova anche un browser diverso, so che potrebbe non essere un problema del browser, ma potrebbe essere che il tuo script sia memorizzato nella cache da qualche parte.
  • stai usando del caching? come Eccelerator?
+0

"La chiamata a ModPages_GetPageByName() funziona correttamente, ma il valore della pagina $ in ModPages_GetPage() non viene impostato." - In tutti i punti in ModPages_GetPageByName() la funzione funziona correttamente. È solo dopo la chiamata a ModPages_GetPageByName() in ModPages_GetPage() che c'è un problema. – Skudd

0

Queste funzioni sono in una classe? Se è così, avrai bisogno di $ page = $ this-> ModPages_GetPageByName().

Inoltre vorrei echo l'argomento e la statistica sql in ModPages_GetPageByName(). In questo modo puoi verificare che non si tratta di un errore SQL.

0

Non posso dire con certezza perché il codice non funzioni, ma posso dare alcuni suggerimenti che potrebbero aiutare a localizzare l'errore.

La prima cosa che noto è che non si controlla che $ db contenga effettivamente un database valido. Non conosco i dettagli del tuo oggetto Database ma presumo ci sia un meccanismo in là per verificare se è effettivamente connesso al database. Dovresti usarlo per determinare se il database è connesso prima di eseguire query su di esso.

$db = new Database(); 
if ($db -> isConnected()) 
{ 
    $query = 'SELECT * (etc etc etc)'; 
    // ... 
} 
else 
{ 
    // Put some kind of DB connection error notification or throw an exception here 
} 

Proprio su una nota stilistica, non c'è bisogno di memorizzare i risultati della tua ricerca DB prima di tornare, a meno che non avete intenzione di fare un po 'di elaborazione sul risultato prima di restituirlo. Puoi solo restituire la ricerca direttamente. Naturalmente questo è solo una scelta stilistica, ma si salva una riga o due :)

return ($db->GetRow($query)); 

Dopo aver eseguito la funzione getPage, mi consiglia vivamente var_dump() ing il risultato. Anche se la tua funzione ha restituito NULL, lo vedrai ancora in var_dump. In caso di dubbio, scaricalo :). Vorrei anche raccomandare l'installazione di xdebug per rendere l'output var_dump più leggibile.

$page = ModPages_GetPageByName($_GET['page_name']); 
var_dump ($page); 

vorrei anche fortemente raccomandare var_dumping la query prima di eseguire solo per essere assolutamente sicuri che si sta eseguendo la query si pensa che si sta eseguendo. Copia e incolla la query emessa in sqlyog o phpmyadmin o qualsiasi altra cosa tu usi per l'accesso interattivo al tuo database e assicurati che restituisca ciò che pensi debba essere restituito.

Altre cose da verificare, la pagina che stai cercando di restituire è effettivamente impostata page_enabled = 'sì'? La colonna page_enabled in realtà memorizza il valore come "sì", o è un bool o un intero o qualcos'altro? Le virgolette sono abilitate o disabilitate? Se sono in uno stato quando pensi di essere nell'altro, possono causare confusione. Gli errori vengono effettivamente segnalati al browser? Aggiungi una riga nella parte superiore del tuo script che è garantito fallire solo per essere sicuro, come un tentativo su un numero intero. Se non vedi un errore, allora forse la segnalazione degli errori non è configurata correttamente. So che sono domande ovvie, ma so anche quanto sia facile ignorare l'ovvio se non ottieni ciò che ti aspetti da una query.

0

Sei sicuro che la pagina $ non è impostata, o è solo che le tue istruzioni di debug non stampano nulla? Prova invece ad accedere ad un file o ad un database; forse il tuo codice ha attivato il buffering dell'output o qualcosa del genere.

Inoltre, si chiama ModPages_GetPageByName prima di dichiararlo. Di solito è normale, ma potrebbe non esserlo in circostanze particolari (ad es. Quando il codice è racchiuso in un blocco if). Prova a scambiare i due.

Inoltre, controllare l'ambiente e disabilitare la memorizzazione nella cache del codice operativo e altre possibili fonti di errore. Ad esempio, APC può chiamare la vecchia versione dello script molto tempo dopo aver modificato il file PHP.

Problemi correlati