HTTP400 intermitente (solicitud incorrecta) al usar FQL con file_get_contents()

Mis páginas web usan PHP para hacer una solicitud FQL que obtiene el conteo de amigos del usuario conectado, aquí está el código:

$graph = 'https://graph.facebook.com/fql?q=';
$graph .= 'SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29';
$graph .= '&access_token=' . $access_token;
$result = file_get_contents($graph);

Aproximadamente el 80% de las veces esto funciona bien, pero a veces recibo una solicitud incorrecta 400. Me doy cuenta de que esto parece ser causado por el ampersand que separa la 'q' del 'access_token' que se está escapando; es decir, me sale esto (no funciona):

https://graph.facebook.com/fql?q=SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29&access_token=AAAF8VR3YZCpQBAGiX16jvZAwaEciTwZB1QZAaUjcjy82Ce7Ov7nPqNxjsKM1SAZASGVcZCJ80R9KJZBJYrjKmsDVK6YNrPGA7plPVuwCFZCaOwZDZD

En lugar de esto (funciona, la misma solicitud pero '&' ha sido reemplazada por '&'):

https://graph.facebook.com/fql?q=SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29&access_token=AAAF8VR3YZCpQBAGiX16jvZAwaEciTwZB1QZAaUjcjy82Ce7Ov7nPqNxjsKM1SAZASGVcZCJ80R9KJZBJYrjKmsDVK6YNrPGA7plPVuwCFZCaOwZDZD

Traté de ajustar mi código en consecuencia para que PHP le diga explícitamente a la cadena que reemplace el ampersand escapado, pero fue en vano:

$graph = 'https://graph.facebook.com/fql?q=';
$graph .= 'SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29';
$graph .= '&access_token=' . $access_token;
$result = file_get_contents($graph);
$graphNoEscape = str_replace('&', '&', $graph);
$result = file_get_contents($graphNoEscape);

¿Alguien sabe la solución al problema? Es molesto que este código funcione a veces, ¡pero no todo el tiempo!

preguntado el 03 de mayo de 12 a las 17:05

1 Respuestas

Para cualquiera que encuentre esto y tenga el mismo problema, así es como lo resolví:

Primero, le dije al servidor que usara un php.ini en la carpeta public_html/www, PHP versión 5.3.

Luego edité mi código de la siguiente manera:

$graph = 'https://graph.facebook.com/fql?q='; 
$graph .= urlencode('SELECT friend_count FROM user WHERE uid = me()');
$graph .= '&access_token='.$access_token; 
$graphNoEscape = str_replace('&', '&', $graph); 
$file_contents = file_get_contents($graphNoEscape); 
$fql_result = json_decode($file_contents); 
$friend_count = mysql_real_escape_string($fql_result->data[0]->friend_count);

Es cierto que es posible que lo haya hecho en exceso con str_replace (), pero funciona de todos modos :)

Espero que esto pueda ayudar a alguién.

contestado el 06 de mayo de 12 a las 19:05

& solo es necesario (pero tampoco es absolutamente necesario) si está utilizando el & carácter en la URL como parte de los atributos HTML. Normalmente, no debería aparecer en las URL. - usuario234932

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.