[PHP] selezione automatica lingua

  • Creatore Discussione Creatore Discussione eleumas
  • Data di inizio Data di inizio

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao, ho trovato, proprio su questo sito, questo codice per la selezione automatica della lingua.
Se ho capito bene la selezione della lingua avviene in base alla lingua che l'utente ha impostato sul browser. Per tanto se l'utente ha il browser impostato il lingua inglese verrà visualizzata la parte in inglese del sito e cosi via...

Ora però questo codice mi restituisce 2 errori. Come posso risolvere? A seguire trovate il codice e gli errori che vengono rilevati.

Grazie!

PHP:
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);

$lang_config = array(
    "it" => "it/",
    "en" => "en/",  
    "default" => "it/");

if(array_key_exists($lang, $lang_config))
{
    $location = $lang_config[$lang];
}
else
{
    $location = $lang_config['default'];
}

header('Location: ' . $location);
?>


PHP Notice: Undefined index: HTTP_ACCEPT_LANGUAGE in /home/samxxxx/public_html/ilrxxxx/index.php on line 2

PHP Warning: array_key_exists(): The first argument should be either a string or an integer in /home/samxxxx/public_html/ilrxxxx/index.php on line 9
 
Ciao.
Copia e incolla il seguente codice e posta qui l'output.
PHP:
<?php

foreach ($_SERVER as $key => $value) {
    echo "<br>".$key.": ".$value;
}
 ?>
 
PATH: /usr/local/bin:/usr/bin:/bin
TEMP: /tmp
TMP: /tmp
TMPDIR: /tmp
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
HTTP_ACCEPT_ENCODING: gzip, deflate, sdch
HTTP_ACCEPT_LANGUAGE: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
HTTP_CONNECTION: keep-alive
CONTENT_LENGTH: 0
HTTP_HOST: samuelesantoni.com
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
HTTP_UPGRADE_INSECURE_REQUESTS: 1
HTTP_DNT: 1
UNIQUE_ID: V-vDHVBYV@8ACo@dLDIAAAAW
SERVER_SIGNATURE:
SERVER_SOFTWARE: Apache
SERVER_NAME: sxxxxxxxx.com
SERVER_ADDR: 80.88.87.239
SERVER_PORT: 80
REMOTE_ADDR: 95.237.29.92
DOCUMENT_ROOT: /home/samxxxx/public_html
REQUEST_SCHEME: http
CONTEXT_PREFIX:
CONTEXT_DOCUMENT_ROOT: /home/samxxxx/public_html
SERVER_ADMIN: [email protected]
SCRIPT_FILENAME: /home/samxxxx/public_html/ilxxxx/test.php
REMOTE_PORT: 52545
SERVER_PROTOCOL: HTTP/1.1
REQUEST_METHOD: GET
QUERY_STRING:
REQUEST_URI: /ilrxxxx/test.php
SCRIPT_NAME: /ilrxxxx/test.php
PHP_SELF: /ilriccio/test.php
REQUEST_TIME_FLOAT: 1476117277.2111
REQUEST_TIME: 1476117277
 
Il tuo problema è molto strano.
Prova a eseguire il seguente codice e vedi cosa stampa.
PHP:
echo array_key_exists("HTTP_ACCEPT_LANGUAGE", $_SERVER)?"trovato":"non trovato";
 
PHP:
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);

sostituisci con

$lang = empty( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ? "default" : substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
 
@marino51 Sarebbe meglio capire prima quale sia il problema prima di adottare questa soluzione. In ogni caso, darebbe comunque errore poiché non viene trovata quella chiave all'interno dell'array, per cui sarebbe più corretta una funzione del tipo array_key_exists() o isset().

@eleumas Il problema è che non viene trovato l'elemento con chiave HTTP_ACCEPT_LANGUAGE all'interno dell'array $_SERVER. Tuttavia, quando stampi a video tutto il contenuto di $_SERVER, ecco che l'elemento con chiave HTTP_ACCEPT_LANGUAGE appare (alla settima riga: HTTP_ACCEPT_LANGUAGE: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4). E ciò è molto strano (questo è il motivo per cui ti sto facendo stampare a video determinati output).
 
Sarebbe meglio capire prima quale sia il problema prima di adottare questa soluzione. In ogni caso, darebbe comunque errore poiché non viene trovata quella chiave all'interno dell'array, per cui sarebbe più corretta una funzione del tipo array_key_exists() o isset().
quell'elemento non è sempre presente (non so perché)
empty fa anche le veci di isset ed in questo caso è comodo usarlo, probabilmente risolvendo il problema
 
questo è quello che esce (se non ho sbagliato qualcosa):
echo array_key_exists("HTTP_ACCEPT_LANGUAGE", $_SERVER)?"trovato":"non trovato";

Grazie a tutti per l'aiuto che mi state dando.
 
Si esatto...avessi inserito i tag php magari il tuo codice sarebbe stato eseguito correttamente :p
Comunque il risultato del tuo codice è: trovato.

E' buon segno?
 
ciao
una curiosità, stavo guardando la discussione
ho caricato in remoto lo script di adeknite
PHP:
<?php
foreach ($_SERVER as $key => $value) {
    echo "<br>".$key.": ".$value;
}
 ?>
output
......
HTTP_CACHE_CONTROL: max-age=0
HTTP_CONNECTION: keep-alive
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_COOKIE: __utma=128218271.61801269.1443201390.1476261246.1476263978.868; __utmz=128218271.1447253911.121.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); block=set; PHPSESSID=2h6p28qruqje4u7m6bjo5uv180; __utmc=128218271
HTTP_HOST: www.borgo-italia.it
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 5.1; rv:48.0) Gecko/20100101 Firefox/48.0
HTTP_UPGRADE_INSECURE_REQUESTS: 1
......
tra gli HTTP non c'è HTTP_ACCEPT_LANGUAGE
caricando
PHP:
<?php
var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);
?>
uotput
???
 
qualcosa non va...onestamente mi sono un po' perso...ma mi sembra chiaro che ci sia un problema.
 
@borgo italia Evidentemente il server in cui hai lanciato quel codice non fornisce l'informazione sulla lingua (HTTP_ACCEPT_LANGUAGE appunto), ma c'è congruenza tra le operazioni da te effettuate poiché non te la trova qualunque sia il codice che scrivi. Ciò però non accade con @eleumas, poiché nonostante la variabile risulti presente facendo un var_dump di $_SERVER, se va a richiamarla attraverso $_SERVER['HTTP_ACCEPT_LANGUAGE'], gli viene detto di aver fornito un indice indefinito, il che significa che non è presente.

A sto punto, @eleumas, ti chiedo: il codice che hai scritto fino a ora è stato eseguito sempre sullo stesso server in cui hai ricevuto l'errore?
 
Si. Il codice è stato sempre eseguito sullo stesso server. L'ho provato su siti diversi e ovunque mi da lo stesso errore. Potrebbe dipendere dalla versione o modulo di PHP in uso?
 

Discussioni simili