Newsgroup: it.comp.www.php
Titolo: parse error

mi sapete dire dov'č l'errore? mi da' parse erorr in t_if riga  2
<?php $lang=$_GET['lang']
if ($lang = FALSE)
{
 $lang = "it";
}
require("{$lang}.php");
?> 

 ha scritto nel messaggio 
news:4c0952a9$0$18997$4faf...@reader5.news.tin.it...
mi sapete dire dov'è l'errore? mi da' parse erorr in t_if riga  2
<?php $lang=$_GET['lang']
if ($lang = FALSE)
{
 $lang = "it";
}
require("{$lang}.php");
?>
ok mancava il ; dopo il get pero ora mi dice che non trova il php del 
require
come mai?? 

?> 
Di errori ce ne sono diversi.
Partiamo dai primi tre:
	if ($lang = FALSE)
Qui tu credi di verificare se $lang sia FALSE. Ma in realtà stai
assegnando FALSE a $lang, e il test che fai è sempre vero, cosi'
che avrai sempre e solo, poi, $lang uguale a "it". Per evitarlo,
in futuro puoi abituarti a scrivere i test al contrario:
	if (FALSE == $lang)
in modo che, se ti dimentichi un =, abbia un errore di sintassi.
Inoltre, FALSE non è il valore per cui devi testare, perche', se
la variabile lang non è definita, hai UNDEFINED. Che nel test ti
dia lo stesso valore di FALSE perché entrambi equivalgono a zero
è una pura botta di culo.
Quindi dovresti scrivere:
	$lang = isset($_GET['lang']) ? $_GET['lang'] : 'it';
ovvero: $lang vale il valore del parametro lang, se questo c'e',
altrimenti vale 'it'.
E questo ci porta a un altro errore... ti stai fidando di quello
che l'utente ti passa nel parametro "lang".
Metti che anziche' "it" o "en" o "fr" io ti passi
	lang=
http://sitomalvagio.it/scriptmaligno
...a quel punto tu lo accetti, e fai eseguire - nel contesto del
tuo web server - qualsiasi codice io abbia piazzato all'URL
 
http://sitomalvagio.it/scriptmaligno.php
che, come il nome fa capire, NON è una cosa che vorresti :-)
Quindi devi per forza fare un qualche controllo su $lang. E dato
che $lang non ha motivo di contenere / o ., puoi fare:
	$lang = isset($_GET['lang']) ? $_GET['lang'] : 'it';
	$lang = basename($lang);
	if (file_exists($langfile = "./languages/$lang.php"))
	{
		include $langfile;
	}
	else
	{
		include './languages/it.php';
	}
Leonardo
-- 
The thoughts of others were light and fleeting,
Of lovers' meeting, or luck, or fame.
Mine were of trouble, and mine were steady:
So I was ready when trouble came.

 ha scritto nel messaggio 
news:hfvk06tscolr38596...@L.Serni...


spiegazione esemplare!
facendo cosi quindi non devo piu mettere il require it.php ecc giusto?

}
ultima cosa: se l'utente scegli la lingua francese per trascinarsi dietro il 
linguaggio scelto in tutte le altre pagine che visitera' occorre scrivere <a 
href="index.php?lang=<?php echo $_GET['lang']; ?> in tutti i collegamenti 
presenti in tutte le pagine? 

facendo cosi quindi non devo piu mettere il require it.php ecc giusto?
No, � gi� tutto l� dentro.
Per rispondere alla tua altra domanda, ti conviene mettere il linguaggio
scelto in sessione, e a meno che uno lo cambi, tenere quello:
<?php
	session_start();
	if (!isset($_SESSION['lang']))
	{
		$lang	= 'it';	// Default
		// Se una richiesta � presente, ed � valida
		if (isset($_GET['lang']))
		if (preg_match('/^[a-z][a-z]$/', $_GET['lang']))
		if (file_exists('./languages/'.$_GET['lang'].'.php'))
			$lang = $_GET['lang'];
		$_SESSION['lang'] = $lang;
	}
	include "./languages/$_SESSION[lang].php";
?>
...questa roba qua sopra la chiami "language.php" e in tutti i tuoi file
ti limiti, all'inizio, a scriverci
	require_once 'language.php';
Poi, volendo, puoi passare alle cosiddette pottate, per esempio:
	/* Leggo i linguaggi disponibili {{{ */
	if (!isset($_SESSION['available_languages']))
	{
		$langs	= array();
		// Cerco nella directory tutti i file del tipo xy.php
		$dd = opendir("./languages");
		while($file = readdir($dd))
			if (preg_match('/^([a-z][a-z])\.php$/', $file,
$matches))
				$langs[] = $matches[1];
		closedir($dd);
		$_SESSION['available_languages'] = $langs;
	}
	/* fine lettura linguaggi }}} */
Avendo cosi' l'elenco delle lingue, sai che:
a) La pagina attuale � nella lingua $_SESSION[lang]
b) Ce ne sono altre "N" in $_SESSION[available_languages]
Quindi:
	$flags = '<div style="flags">';
	foreach($_SESSION['available_languages'] as $newlang)
	{
		if ($_SESSION['lang'] == $newlang)
			continue;
		$flags .= <<<SAMEPAGEDIFFERENTLANGUAGE
	<a href="?lang=$newlang">
		<img border="0" src="./flags/$newlang.png" />
	</a>
SAMEPAGEDIFFERENTLANGUAGE;
	}
	$flags	.= '</div>';
...poi, dove ti pare nella pagina, ci schiaffi
	<?=$flags?>
e l� ti compare la lista delle bandierine, meno quella attuale com'e'
logico.


 wrote:
e lě ti compare la lista delle bandierine, meno quella attuale com'e'
logico.
Leonardo
-- 
The thoughts of others were light and fleeting,
Of lovers' meeting, or luck, or fame.
Mine were of trouble, and mine were steady:
So I was ready when trouble came.
grazie mille!
mi rimane ancora una cosa da risolvere
io vorrei richiamare una parola in una certa lingua con questa stringa:
 <?php echo $row_categorie1['"category_".$lang']; ?>
e in teoria vorrei che richiamasse:
 $row_categorie1['category_eng'];
$row_categorie1['category_it'];
oppure $row_categorie1['category_fr'];  a seconda della lingua 
prescelta.....
..... pero' non esce fuori nulla anche se la query č corretta....dove 
sbaglio??? 

sbaglio??? 
L'errore diciamo così puntuale è che metti tutto fra apici singoli, che
bloccano l'espansione di $lang. L'elemento che cerchi dentro la riga e'
	"category_".$lang
(scritto proprio cosi') e non
	category_fr
Dovresti piuttosto scrivere:
	<?php echo $row_categorie1["category_$lang"]; ?>
Poi c'e' un "errore" procedurale: visto che sei agli inizi, ti serve, e
parecchio, avere un feedback su quello che succede:
<?php
	error_reporting(E_ALL);
	...
?>
in questo caso lì ti avrebbe avvertito dell'assenza della chiave.
Ultima cosa, strutturale, considera che se hai (come e' la regola) piu'
prodotti che categorie, una tabella prodotti del tipo
NomeIT		NomeENG		CatIT	CatENG		Costo	Mater
giacchio	castnet		pesca	fishing		32	Nylon
e' abbastanza un massacro quando devi andare ad aggiungere lingue, o a
risistemare le categorie. Ti conviene di piu'
Nome		Cat	Costo	Mater
giacchio	pesca	32	Nylon
e poi una tabella di traduzione:
nome		contesto	lingua	parola
giacchio	NomeART		ENG	castnet
pesca		CategART	ENG	fishing
pesca		NomeART		ENG	peach
Qui sopra ho messo una soluzione al problema degli omonimi. Un'altra è
nome			lingua	parola
categ-pesca-sport	ITA	pesca
art-pesca-verbo		ITA	pesca
art-pesca-frutto	ITA	pesca
categ-pesca-sport	ENG	fishing
art-pesca-verbo		ENG	he fishes
art-pesca-frutto	ENG	peach
giacchio		ITA	giacchio
giacchio		ENG	castnet
...qui, dove non ci sono omonimi, non servono nomi tanto complicati.
Il vantaggio diventa enorme (BTDTGTTS) quando devi per es.:
a) Far tradurre il sito in cinese, consegnando una tabella e ottenendo
   un'altra tabella. L'approccio che io chiamo babel-17 e' piu' veloce
   e ha molti meno duplicati, il che incide sui costi.
b) Dare al committente l'accesso alla traduzione per personalizzarsela
   (è una richiesta comune, non so perché). Intanto, il babel-17 e' lo
   stesso qualunque sia il sito - e quindi riuso di codice a rondemàn.
   Poi l'interfaccia si presta a "Scaricati tutto in Excel e rimandami
   i risultati", che è sempre una cosa (sigh, sob) bene accetta.


 Due. Una è quotare bene :-D
:-D
grazie di tutto 

 require_once 'language.php';
il codice contenuto in language.php lo devo mettere al posto di:
$lang = isset($_GET['lang']) ? $_GET['lang'] : 'it';
$lang = basename($lang);
if (file_exists($langfile = "./languages/$lang.php"))
{
include $langfile;
}
else
{
include './languages/it.php';
}
oppure prima di questo codice o dopo?
e il require_once language.php dove lo piazzo? 

e il require_once language.php dove lo piazzo? 
Ovunque :-) -- be', in tutti i file dove ti serve distinguere per
linguaggio.


 linguaggio.
ok ma non mi trascina la lingua scelta.....non capisco come mai!
ma il vecchio codice scritto da te e riportato qui sotto lo mantengo 
comunque?


comunque?
No, quello è incorporato in "language.php".



non mi si aprono piu le pagine perchè non riesce a pescare il category_$lang 
dalla query sottostante...
$query_categorie1 = "SELECT idcategory, category_$lang, companyid FROM 
category_product WHERE companyid = 1 ORDER BY idcategory ASC"; 

 category_product WHERE companyid = 1 ORDER BY idcategory ASC";
Notice: Undefined variable: lang in /home//index.php on line 39
Unknown column 'category_' in 'field list'
linea 39: $query_categorie1 = "SELECT idcategory, category_$lang,....
tutto ciņ suppongo a causa del language.php:
session_start();
if (!isset($_SESSION['lang']))
{
$lang = 'it'; // Default
// Se una richiesta č presente, ed č valida
if (isset($_GET['lang']))
if (preg_match('/^[a-z][a-z]$/', $_GET['lang']))
if (file_exists('lang/'.$_GET['lang'].'.php'))
$lang = $_GET['lang'];
$_SESSION['lang'] = $lang;
}
include "lang/$_SESSION[lang].php"; 

tutto ciň suppongo a causa del language.php:
session_start();
if (!isset($_SESSION['lang']))
{
	$lang = 'it'; // Default
	// Se una richiesta č presente, ed č valida
	if (isset($_GET['lang']))
	if (preg_match('/^[a-z][a-z]$/', $_GET['lang']))
	if (file_exists('lang/'.$_GET['lang'].'.php'))
		$lang = $_GET['lang'];
	$_SESSION['lang'] = $lang;
}
else $lang = $_SESSION['lang'];
/* Aggiungi la riga qua sopra. */
include "lang/$_SESSION[lang].php"; 
Non avevo considerato che tu usi $lang ovunque, non $_SESSION[lang] :-)


 Non avevo considerato che tu usi $lang ovunque, non $_SESSION[lang] :-)
non funziona!
quando apro la homepage apre in italiano (prima sessione) ma se clicco sul 
francese o inglese non traduce niente seppure l'url abbia il lang=en o 
lang=fr...
sulla homepage ho questo codice: <?php
require_once 'language.php';
?>
che richiama:
<?php
session_start();
if (!isset($_SESSION['lang']))
{
$lang = 'it'; // Default
// Se una richiesta è presente, ed è valida
if (isset($_GET['lang']))
if (preg_match('/^[a-z][a-z]$/', $_GET['lang']))
if (file_exists('lang/'.$_GET['lang'].'.php'))
$lang = $_GET['lang'];
$_SESSION['lang'] = $lang;
}
else $lang = $_SESSION['lang'];
include "lang/$_SESSION[lang].php";
?>
per le bandierine della homepage ho questo codice:
<div class="nav0">
          <ul>
            <li><?php echo "<a href='" . $_SERVER['PHP_SELF'] . 
"?lang=it'><img src='img/flag_italy.gif'/></a>"; ?></li>
            <li><?php echo "<a href='" . $_SERVER['PHP_SELF'] . 
"?lang=fr'><img src='img/flag_france.gif'/></a>"; ?></li>
            <li><?php echo "<a href='" . $_SERVER['PHP_SELF'] . 
"?lang=en'><img src='img/Flag_UK.gif'/></a>"; ?> </li>
          </ul>
        </div>
ed ovviamente ho i file it.php en.php e fr.php 

lang=fr...
C'e' un po' di graffe di troppo, mi sa che ho fatto casino io:
<?php
	session_start();
	// Default
	$lang = isset($_SESSION['lang']) ? $_SESSION['lang'] : 'it';
	// Se una richiesta è presente, ed e' valida, e il file c'e'
	if (isset($_GET['lang']))
	if (preg_match('/^[a-z][a-z]$/', $_GET['lang']))
	if (file_exists('lang/'.$_GET['lang'].'.php'))
		$lang = $_GET['lang'];
	$_SESSION['lang'] = $lang;
	include "lang/$_SESSION[lang].php";
?>
Leonardo



questo è perfetto! grazie mille!