2011-06-04 20 views
7

Estoy tratando de manipular un script PHP para que redirija a una URL en particular en lugar de darme un error de MySQL. Así que fui a este ...Múltiples instancias de encabezado() + die() en línea de código único

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or die('MySQL error: '.mysql_error()); 

... a esto:

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or header("Location: http://www.example.com"); 

que funciona, pero hay dos cosas que me preocupan. En primer lugar, por defecto tiene un redireccionamiento 302, y yo preferiría una redirección 301. En segundo lugar, me preocupa que al eliminar die() de esta línea, el script no salga correctamente después de la redirección.

Ahora, he hecho un poco de tarea aquí, pero no puedo entender si es posible combinar die() con dos instancias de encabezado() en esa única línea de código (es decir, sin cambiar lo que está alrededor de esta línea en particular).

+1

favor, dime que estás desinfectar sus entradas allí. D: – damianb

Respuesta

4

Además del "No deberías hacer esto" notas, aquí es cómo se puede hazlo:

$qs = mysql_query(...) or (header(...) xor die); 

Explicación: xor es como or con la diferencia de que se garantiza que las expresiones en ambos lados se evalúan y no se cortocircuitan. (De acuerdo, xor es algo diferente de or, pero a los efectos de esta respuesta que no importa.)

+4

'... o morir (encabezado (...));' – mario

+0

@mario: Nice one :) – NikiC

+0

Esto lo mantiene muy bien en una sola línea, y funciona de maravilla. Tuve que agregar en el 301 y terminé con '$ qs = mysql_query (...) o die (header ('Ubicación: http: //www.example.com',TRUE,301));' Parece No necesité otra aparición de 'header()' solo para el 301; el parámetro '$ http_response_code' hace lo mismo. ¡Gracias! – redburn

3

Se podría utilizar un bloque de if:

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;"); 
if (!$qs) { 
    header("Location: http://www.example.com"); 
    die('MySQL error: '.mysql_error()); 
} 
+0

mysql_query no usa excepciones; eso sería PDO con ERRMODE_EXCEPTION en uso. – damianb

+0

+1 por solicitar el uso de un manejo excepcional –

+1

¿Cómo va a funcionar esto? 'mysql_query' no genera ninguna excepción. – mario

2

Siempre se puede:

$qs = mysql_query("blah"); 
if (!$qs) { 
    //headers 
    header('Location: blah'); 
    die('MySQL error: '.mysql_error()); 
} 
+0

Debe suprimir el error de 'mysql_query'; de lo contrario, arrojará un error. – mc10

+0

@ mc10 que depende de la configuración de php, pero podría ser un punto válido. – Fosco

+0

Ugh, no veo que esto sea 'mysql_query', no' mysql_connect'. Olvida mi comentario – mc10

3
$query_string = ''; 
$location = ''; 

$qr = mysql_query($query_string); 
if (!$qr) { 
    header ('HTTP/1.1 301 Moved Permanently'); 
    header ('Location: '.$location); 
    die('MySQL error: '.mysql_error()); 
} 
0

No tiene sentido que aparezca el mensaje dado ya que cualquier navegador podría detectar el código de estado HTTP y actuar por consiguiente, ignorando el contenido del documento. Allí deberías estar usando el comando exit() que hace lo mismo, sin hacer eco de nada en el búfer.

que pueda estar usando esta operación de repliegue por qué no sólo lo hacen una función de reserva común:

function fallback($location='/default/path/to/somewhere') { 
    header('HTTP/1.1 301 Moved Permanently'); 
    header('Location: '.$location); 
    exit(); 
} 

$query = mysql_query('...') or fallback('/path/to/somewhere/'); 
+0

fyi, die() es un alias de exit() y se comporta exactamente de la misma manera: http://us3.php.net/manual/en/function.die.php - solo puede usar die() y ganó Tampoco repite nada con el búfer. – damianb

Cuestiones relacionadas