【问题标题】:Get values from MySQL by arrays without loop通过没有循环的数组从 MySQL 中获取值
【发布时间】:2018-01-08 23:29:39
【问题描述】:

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

所以,我想制作一个包含 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'] 这样的值,因为对于每一行,它都会打印一个值,所以我希望它没有循环,以翻译整个页面。

任何想法,我该怎么做?

谢谢。

【问题讨论】:

    标签: php mysql sql arrays


    【解决方案1】:

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

    话虽如此,您的代码似乎并没有按照您的意愿行事。 admin_hello 数组键必须对应于您未选择的 admin_hello 列。

    如果您尝试将整个 translation 表映射到以 word(或 word_id)作为第一个键,语言 (en/de/ru) 作为第二个键的数组,您可以在循环中构建数组。我会保持你的 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 注入(例如,想象一下,如果您试图翻译单词“you're”)。

    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");
    

    【讨论】:

    • 感谢您抽出宝贵时间提供有关防止 SQL 注入的安全性的有用信息,当然也可以回答我的问题。工作正常,所以我要了解 PDO ar mysqli。
    猜你喜欢
    • 2016-03-23
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多