Autor Zpráva
Fisak
Profil *
Zdravím... mám malý problém... objektování mi moc nejde ale snažím se udělat překladatele a nejde mi načíst proměnná z jednoho souboru do druhého... mám soubor index.php:
function translate($string)
{
include("cs.php");
return $result[$string];
}
echo translate("nelze_nacist");
a soubor cs.php
<?php
$result = array(
        "nelze_nacist" => "Soubor nenačten",
        "lze_nacist" => "Soubor:"
        );
?>
bohužel problém je v tom že se ta proměnná $result nenačte do toho druhýho souboru.. pokud ten kód z cs.php přesunu do funkce translate tak je vše v poho ale jakmile je v cs.php tak už to nefachá... předem děkuji za odpověď...
fandaa
Profil
Fisak:
Tvá ukázka mi funguje bez problémů. Vypisuje ti to nějakou chybu?

Zvolil bych spíše INI soubory a funkci parse_ini_file() pro tento účel. Jsou dle mého přehlednější (při použití bloků v poli se musí vytvářet další pole, což je složitější na čitelnost a někteří editoři by s tím mohli mít problémy) a lépe srozumitelné pro případné jazykové editory.
Nox
Profil
Tady není objektového nic

Includování ve funkci je dost špatný nápad, načítá a parsuje se zbytečně soubor při každém volání. Zrovna tady by se ten objekt hodil, aby se mu nastavil ten zdroj a jazyk a už se pak jenom volal string, jinak by asi bylo lepší zdroje předávat.

Myslím si, že obecně by to mělo fungovat

Máš error_reporting() na E_ALL a display_errors na on (nebo 1) (pomocí ini_set nebo .htaccess ... případně zagoogluj)? Možná to ten soubor totiž nenašlo, takže to nemohlo najít ani $result
Fisak
Profil *
php_flag display_errors on


a soubor to našlo to sem ověřoval tim že sem přehodil proměnný a do cs.php sem dal echo "ahoj"; a pak sem tam hodil result translate(); a facha to ale pokud je tam ten array tak to nefachá ... podle mě tam je chyba že se ta proměnná $result nepromítne do tý funkce


ne prostě se nenačítá z cs.php ta proměnná $result jinak je vše v poho ;-) když tam dám echo do toho cs.php tak to funguje normálně ...
nethor
Profil
Tvůj script funguje správně.
... ale řešil bych to taky jinak.

Zhus si vypsat $result ve fci, co to vypíše ? :
function translate($string) { 
    include("cs.php"); 
    echo "<xmp>";var_dump($result);echo "</xmp>";
    return $result[$string]; 
    } 
Fisak
Profil *
Píše to "NULL"
Fisak
Profil *
zajímavý je že když dam místo toho obsahu cs.php cokoliv jinýho tak to stejně nefunguje.. jakože se to nenačítá do toho index.php ale když napíšu do cs.php echo "ahoj"; tak to normálně fachá.. zatímco když napíšu result "ahoj"; a pak normálně vypíšu echem tu fci tak to nefachá...
Nox
Profil
zkus místo $result = dát return a ve funkci potom $result = include(...
Fisak
Profil *
jooo to fachá paráda děkuji moc :-) ty bláho...
Ugo
Profil
A teď se přiznej, žes to celou dobu měl jinak než jsi napsal? (bez $result=) Jinak sem totiž asi totální blázen páč nechápu proč ti to nefunguje.
Fisak
Profil *
Nn fakt sem to měl tak jak sem psal... klidně ti to streamnu že to prostě tak nefachá :-)
Ugo
Profil
To sem slyšet nechtěl :-D
Jedině mě napadá jestli to neni nastavení serveru nějaký buffering třebas. Protože toto mi nejde do hlavy a ani zběžná prohlídka dokumentace žádný takový chování neříká. (stejně jako fandaa jsem to totiž samozřejmě odzkoušel a vše v pohodě). Nevim co by to mohlo bejt za nastavení nebo bug, zvláště když i na windowsim apachi kde půlka věcí funguje špatně to jde :)
Fisak
Profil *
noo může to být serverem :-) to mě taky napadlo.. ale ještě sem to neozkoušel na jinym serveru :-) takže nevím... nicméně tady je complet kód:
soubor cs.php
<?php 
return array( 
/*----------------------------------------------------------------------------------------------------*/

         "save_change" => "uložit změny",
        "restore" => "obnovit",
        "delete" => "smazat",
        "create" => "vytvořit",
        "save" => "uložit",
        "cancel" => "zrušit",
        "moduls" => "moduly",
        "logon" => "přihlásit",
        "logout" => "odhlásit",
        "edit" => "upravit",
        "url" => "URL",
        "rename" => "přejmenovat",
        "check_all" => "zaškrtnou vše",
        "uncheck_all" => "odškrtnout vše",
        "name" => "název",
        "category" => "kategorie",
        "size" => "velikost",
        "gallery" => "galerie",
        "file_manager" => "správce souborů",
        "all_right_reserved" => "všechna práva vyhrazen", 
        "no_loading" => "nenačteno",
        "loading" => "načítání"
        
 /*----------------------------------------------------------------------------------------------------*/
        ); 
?>

a zde je soubor idex.php
<?php
//překladač
function translate($string) {
    $result_translate = require("cs.php");
    return $result_translate[$string];  
} 
echo translate("save_change");
?>
Nox
Profil
Chápeš tedy ale, že pokud zavoláš translate() 1000x, tak se 1000x poleze na disk? (http://i.imgur.com/X1Hi1.gif)

Dej require jednou a už to ber z toho
Mastodont
Profil
Trošku si to uprav ...
function translate($string) { 
    static $result_translate = false;
    if ($result_translate === false) {
        $result_translate = require("cs.php"); 
    }
    return $result_translate[$string];   
}  
Fisak
Profil *
Mastodont: proč v 3. řádku je 3x === ????
Nox
Profil
Pokud se použije ==, PHP používá porovnávání podle tabulky http://php.net/manual/en/types.comparisons.php
Při === se musí přesně shodovat i typ proměnné (zde false ~ boolean)
Poměrně velký význam má ten rozdíl u objektů, ale o tom tu není teď řeč

Pokud bys tam např. neměl překlady a měl tam tudíž return array(), načítalo by to pořád znova.

Jinak to tu asi není vyloženě kritické, ale není to na škodu
Někdo preferuje upřednosťnovat === a jen tam, kde to dává smysl, používat ==
Mastodont
Profil
Někdo preferuje upřednosťnovat === a jen tam, kde to dává smysl, používat ==
Kdysi jsem v nějakém článku o mikrooptimalizacích četl, že === je i rychlejší (protože odpadá casting), ale to vem čert ... je ovšem třeba dávat bedlivý pozor tam, kde fukce může vrátit false i nulu a každý údaj znamená něco jiného.
Fisak
Profil *
Mastodont: prosím tě dá se ještě nějak upravit moje připojení do db tak aby se taky nepřipojovalo do db 1000x když tam budu mít 1000 dotazů ?? nějak tím tvým způsobem?? kód:
function db_connect($db_name){
      if(!@mysql_connect(db_server,db_login,db_pass)){
            $this->__err_message();
            return -1;
          } else {
            if(!@mysql_select_db($db_name)){
                $this->err = "Nepodařilo se vybrat databázi.";
                return -1;
            } else {
                mysql_query("SET character_set_results = utf8");
                mysql_query("SET character_set_connection = utf8"); 
                mysql_query("SET NAMES utf8");
                
                 return 1;
            }  
          }  
    }
    
 function db_system($retezec)
{
db_connect(db_name_system);
return @mysql_query($retezec); 
}
Nox
Profil
Fisak:
třeba

function db_system($retezec) 
{ 
static $connected = false;
if( $connected === false ) 
    db_connect(db_name_system); 
return mysql_query($retezec);  
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0