2012-07-13 7 views
11

Il seguente codice è per interrogare un dizionario dei sinonimi online per un motore di ricerca che sto creando come progetto universitario, ma sto riscontrando problemi con file_get_contents"impossibile aprire lo stream" errori. Quando invio una parola che il thesaurus non riconosce, genera un errore. Sto cercando di scrivere un pezzo di codice che sarà ignorare l'errore e procedere senza le informazioni.Ignorare gli errori in file_get_contents HTTP wrapper?

$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php"; 
$result_thesaurus=file_get_contents($thesaurus_search); 

ho provato:

if (file_get_contents($thesaurus_search) != NULL) 
{ // do stuff } 

... ma la sua non funziona perché restituisce ancora una sorta di stringa.

Cosa posso fare per gestire questi casi?

+1

Che cosa restituisce esattamente quando si verifica un errore? Qualche html? xml? JSON? Dovresti analizzare i dati restituiti per verificare i codici di errore - è improbabile che un API non restituisca semplicemente nulla. –

+0

* "Sto cercando di scrivere un pezzo di codice che ignorerà l'errore e procederà senza le informazioni" *. Come procederesti senza le informazioni? – netcoder

+0

Forse dovrei essere un po 'più specifico, questo codice fa parte di una classe, l'informazione che restituisce non è intrinseca al prodotto finale, è solo un bonus. Quindi se file_get_contents restituisce un errore (perché non ha una corrispondenza per la parola) voglio rompere completamente la classe e non restituire alcun codice. – shanahobo86

risposta

19

Se non si desidera file_get_contents segnalare errori HTTP come avvertimenti PHP, allora questo è il pulito modo per farlo, usando un contesto flusso (c'è qualcosa appositamente per tale):

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true), 
)); 

$result = file_get_contents('http://your/url', false, $context); 
+0

Grazie Netcoder questo è molto meglio, apprezza il tuo aiuto. Smetterò di colpire anche il mio computer con le chiavi :) – shanahobo86

+0

Grazie mille! L'ho trovato all'interno del manuale dopo molte ricerche, ma non mi è stato subito evidente che un'opzione di contesto poteva essere d'aiuto. Sarebbe bello se questo fosse giusto sulla pagina file_get_contents. – Errol

+0

questa è una di quelle cose che mi hanno seccato per un po 'ma non mi sono preoccupato fino ad ora. '@' dovrebbe funzionare ma non è stupido. "** PHP supporta un operatore di controllo degli errori: il simbolo at (@). Se anteposto a un'espressione in PHP, qualsiasi messaggio di errore che potrebbe essere generato da tale espressione verrà ignorato. **" sembra abbastanza semplice ma è una bugia. – billynoah

0

Se ho capito bene, stai tentando di effettuare una chiamata API allo http://words.bighugelabs.com. Hai bisogno di cURL per raggiungere questo obiettivo, quindi se hai installato cURL, questo codice funzionerà per te.

$ch = curl_init(); 
$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php"; 
$options = array(); 
$options[CURLOPT_URL] = $thesaurus_search; 
$options[CURLOPT_RETURNTRANSFER] = true; 
curl_setopt_array($ch, $options); 

// Print result. 
print_r(curl_close($ch)); 
+3

* "È necessario cURL per ottenere questo" *, no non lo fa. – netcoder

1

La soluzione più semplice se stai bene con un solo salvataggio, sarebbe:

if (empty($thesaurus_search)) { 
    return; 
} else { 
    //process with value 
} 

di gestire più pienamente, guardando il API, sembra che si dovrebbe essere il controllo della response header , ad esempio:

$thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php"; 
$result_thesaurus=file_get_contents($thesaurus_search); 
if ($http_response_header[0] = 'HTTP/1.1 200 OK') { 
    //code to handle words 
} else { 
    // do something else? 
} 
+0

Considerando 'file_get_contents' già restituisce' false' per errore, non penso sia necessario. – netcoder

-1

Si potrebbe provare a riccio:

function curl_get_contents($url) { 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); 
    curl_setopt($ch, CURLOPT_MAXREDIRS, 2); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $content = curl_exec($ch); 
    curl_close($ch); 
    return $content; 
}