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中编码?什么包含典型的
数组?关于使用翻译键,您的想法是正确的,但不要对每种语言使用一列。您不希望每次添加/删除语言时都必须修改表结构。有许多方法可以实现多语言站点。这里有一个我用于中小型站点的简单方法-。如果你想让i18n拥有更多的功能,那么从一个框架中寻找一个软件包——Symfony的很好。呼应@Waterlomatt立即停止使用你正在使用的设计,并在此$row
表上后退一步。它至少应该是Translate
。其中一个条目看起来像id | var | language | translation
。然后当您查询它时,您会选择var,translation FROM translate WHERE language='english'代码>现在,您可以为一种语言参数化对此表的查询,而不是在代码中切换列,这将使您免于潜在的sql注入向量,并使您的应用程序可以在不不断更改DB模式的情况下进行扩展。@KevinGoethals-您可以但不应该将变量直接嵌入sql语句中(SQL注入攻击)。相反,您应该使用prepared语句将变量绑定到查询中。但是,prepared语句不支持也不应该将列名作为占位符。请参阅此处的详细信息-。设计师的工作是理解这一点,并使用一种运行良好的设计。这些限制是有原因的。听起来您已经准备好了要深入SQL查询,请从PDO开始-1 |“titleOne”|“english”|“Hello World”
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'