通过不带循环

时间:2018-01-08 23:29:40

标签: php mysql sql arrays

我正试图通过两个阵列从网站上的数据库中获取价值。我真的不知道该怎么做,也找不到我的问题的好答案。

所以,我想制作一个包含3种语言的多语种网页。我创建了一个包含wordidwordenderu列的数据库,我希望在其中一个列中获取一个值语言。

这是我的表:

WORDID     WORD          EN      DE      RU
1          admin_hello   Hello  Hallo  Privet

我希望得到一个类似$ lang ['admin_hello'] ['de']的值,没有循环。

PHP:

$translation = "SELECT word_id, word, en, ru, lt FROM translation";
$translation_result = mysql_query($translation);

if ($translation_result) {
    while ($lang = mysql_fetch_assoc($translation_result)) {

    echo $lang['admin_hello']['en'];
    echo $lang['admin_hello']['de'];
    echo $lang['admin_hello']['ru'];
    }
}

是的,它使用while,但它不起作用。如何在没有循环的情况下获得$lang['admin_hello']['en']之类的值,因为对于每一行,它都会打印一个值,所以我希望它没有循环,以翻译整个页面。

任何想法,我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:1)

我会快速解决这个问题:你应该立即停止使用mysql_ *函数,而是使用mysqli或PDO。在PHP 7中已经完全删除了mysql_ *函数。其次,没有循环就无法完成这种事情。 PHP只能将MySQL行映射到单维数组。你可以挖掘一个用于数据透视表或其他东西的库,但你也可以自己写一些这么简单的东西。

话虽如此,您的代码似乎没有做您想要的。 admin_hello数组键必须与您未选择的admin_hello列对应。

如果您尝试将整个translation表映射到以word(或word_id)作为第一个键的数组,并使用语言(en / de / ru)作为第二个键,你可以在一个循环中buld数组。我将保留你的mysql_ *函数,以便更容易看到发生了什么,但努力重构mysqli或PDO的代码。

// Load the words
$words = array();
$language_whitelist = array('en', 'de', 'ru')
$translation = "SELECT word_id, word, en, ru, de FROM translation";
$translation_result = mysql_query($translation);

if (mysql_num_rows($translation_result)) {
    while ($row = mysql_fetch_assoc($translation_result)) {
        foreach ($language_whitelist as $language) {
            $words[$row['word_id']][$language] = $row[$language];
        }
    }
}

// Display all the words as a demo
foreach ($words AS $word) {
    print_r($word);
}

// Or, get a specific word
print $words['admin_hello']['ru'];

或者,如果您只想按需调用单词,则可以将其直接写入查询。这是您可能使用的示例函数。同样,我正在使用过时且不安全的mysql_ *函数来使事情变得可以理解。请勿按原样使用此代码。使用预准备语句来清理针对SQL注入的查询(例如,如果您尝试翻译“你是”这个词,可以想象)。

function translate ($word, $language)
{
    $sql = "SELECT {$language} FROM translation WHERE word='{$word}'";
    $result = mysql_query($sql);

    if (mysql_num_rows($result)) {
        $row = mysql_fetch_assoc($result);
        return $row[0];
    }
    else { 
        // Return the original word if no result is found
        return $word;
    }
}

// And a demo (assuming you have a translation for "Hello World"):
print "This is how you say 'Hello World' in Russian: " . translate("Hello World", "ru");