PHP使用即时变量从数据库中获取多语言数据

PHP使用即时变量从数据库中获取多语言数据,php,mysql,sql,multilingual,Php,Mysql,Sql,Multilingual,我想要的是存储每个单词/句子/。。。在这样的数据库选项卡中: 表名: translate 栏目: id, var, dutch, english, french 例如: '1', 'titleOne', 'Hallo Wereld!', 'Hello World!', 'Bonjour le monde!' 我想打印变量,例如在标题部分: <?php echo $titleOne; ?> 由于将有数百行,我不想为每行设置$titleOne=$row['titleOne']

我想要的是存储每个单词/句子/。。。在这样的数据库选项卡中:

表名:

translate
栏目:

id, var, dutch, english, french
例如:

'1', 'titleOne', 'Hallo Wereld!', 'Hello World!', 'Bonjour le monde!'
我想打印变量,例如在标题部分:

<?php
echo $titleOne;
?>

由于将有数百行,我不想为每行设置
$titleOne=$row['titleOne']

谁能帮我一个好的查询,拉,取,数组,循环。。。你怎么称呼这个?(或者一个好的替代方法也很好!)

这是纯PHP,不使用任何框架

PS:我根本不是PHP专家,所以请尽量保持简单:-)


非常感谢

直接回答您的问题。您可以按如下方式查询当前设置:

-- For Dutch (pseudocode)
$query = 'SELECT var, dutch FROM translate';

$translations = array();   
while loop ($row = $query) {
    $translations['var'] = $row['dutch'];
}

// Then, to access translations you would:
echo $translations['titleOne'];
但是您不想这样做。这种表格结构会让你走上后悔的道路。注意我们的警告。有很多方法可以做到这一点,您选择了SQL路线,因此这里有一些提示

更改表结构,这样就不必在每次添加新语言时都添加新列

表:语言(添加新行以支持新语言)

表:翻译(添加新行以添加翻译)

translations.locale
应该是指向语言的外键,但我不确定您的SQL级别是什么,所以请尽我所知将其保持清晰

我假设您可以了解如何从PHP查询数据库。您要做的是:

  • 找出要使用的区域设置。这将是最棘手的部分之一。例如,您是否应该使用URL、会话和浏览器设置中指定的内容?如果这些都没有指定,会发生什么?后备区域设置是什么?有关一些想法,请参见中的my
    getLanguage()
    函数
  • 提取该区域设置的所有翻译并将其存储在内存中。下面是一个基本查询,用于获取给定区域设置的所有翻译


    我支持他人对您的表结构给出的建议,但要回答您的问题,您可以使用

    $row = array(
        col_1 => 'a', 
        col_2 => 'b', 
        col_3 => 'c' 
    )
    
    extract($row);
    
    
    // results in:
    
    //   $col_1  assigned value 'a'
    //   $col_2  assigned value 'b'
    //   $col_3  assigned value 'c'
    

    您是否使用任何框架?或者在核心PHP中编码?什么包含典型的
    $row
    数组?关于使用翻译键,您的想法是正确的,但不要对每种语言使用一列。您不希望每次添加/删除语言时都必须修改表结构。有许多方法可以实现多语言站点。这里有一个我用于中小型站点的简单方法-。如果你想让i18n拥有更多的功能,那么从一个框架中寻找一个软件包——Symfony的很好。呼应@Waterlomatt立即停止使用你正在使用的设计,并在此
    Translate
    表上后退一步。它至少应该是
    id | var | language | translation
    。其中一个条目看起来像
    1 |“titleOne”|“english”|“Hello World”
    。然后当您查询它时,您会选择var,translation FROM translate WHERE language='english'现在,您可以为一种语言参数化对此表的查询,而不是在代码中切换列,这将使您免于潜在的sql注入向量,并使您的应用程序可以在不不断更改DB模式的情况下进行扩展。@KevinGoethals-您可以但不应该将变量直接嵌入sql语句中(SQL注入攻击)。相反,您应该使用prepared语句将变量绑定到查询中。但是,prepared语句不支持也不应该将列名作为占位符。请参阅此处的详细信息-。设计师的工作是理解这一点,并使用一种运行良好的设计。这些限制是有原因的。听起来您已经准备好了要深入SQL查询,请从PDO开始-
    id, locale, translation_key, translation
    
    1, en_CA, 'hello', 'Hi from Canada'
    2, en_US, 'hello', 'Hi from the US'
    3, en_UK, 'hello', 'Hi from the UK'
    4, es_ES, 'hello', 'Hi from Spain'
    5, es_MX, 'hello', 'Hi from Mexico'
    ...
    
    <?pseudocode 
    $locale = 'en_CA';    
    
    // Find all translations for a given locale
    $dbQuery = 'SELECT translation_key, translation
    FROM translations
    WHERE locale = :locale';
    ;
    
    <?pseudocode 
    $translations = array();
    while loop ($row = $dbQuery) {
        $translations[$row['translation_key']] = $row['translation'];
    }
    
    $row = array(
        col_1 => 'a', 
        col_2 => 'b', 
        col_3 => 'c' 
    )
    
    extract($row);
    
    
    // results in:
    
    //   $col_1  assigned value 'a'
    //   $col_2  assigned value 'b'
    //   $col_3  assigned value 'c'