1

我试图让我的用户选择以更多语言加载文章。我正在尝试显示用户尚未选择的可用语言列表,并在顶部选择已选择的语言供用户从他们的选项中删除。

这是我到目前为止所得到的:

class Options_model extends CI_Model{

    protected $options = array(
            'en' => 'English',
            'it' => 'Italiano',
            'fr' => 'Français',
            'de' => 'Deutsch',
            'es' => 'Español',
            'no' => 'Norsk',
            'ru' => 'Русский язык',
            'ar' =>'العربية',
            'zu' => '中文',
            );

    public function my_lang($user_id) {
            $sql = 
            "SELECT lang_id 
            FROM languages 
            WHERE user_id = :user_id";

            $stmt = $this->db->conn_id->prepare($sql);
            $stmt->bindParam(':user_id', $user_id);
            $stmt->execute();
            return $result = $stmt-> fetch();
    }

    public function languages($result) {
            return array_diff_key($this->options, $result);
    }
}

并在我的视图文件中(为了测试,我将在控制器运行时将其中的一些放入控制器中,并添加链接以删除语言并从我的数据库中删除表)。

$mylang = $this->Options_model->my_lang($user_id);
print_r($mylang);
foreach ($mylang as $value) {
    echo "Value: $value<br />\n";
}

$options = $this->Options_model->languages($mylang);
echo form_dropdown('languages', $options);

我的数据库结构如下:

| id | user_id | lang_id |
|------------------------|
| 1  | 12      | en      |
|————————————————————————|

当我尝试返回我的 $myLang 变量时,我得到的只是“数组”。我无法让我的 array_diff_key 函数工作,并且 print_r 看起来完全不像我想象的那样。我只想让自己回到我的图形设计舒适区,并消除这个后端头痛。有没有更简单的方法来做到这一点?或者我应该如何编码用户选项而不看起来像个白痴?

4

1 回答 1

1

我对 PDO 不是很熟悉,但我认为您应该使用 fetchAll() 而不是 fetch,因为这将获取所有语言,而不仅仅是下一行。您还想告诉它使用 FETCH_COLUMN 模式,例如

return $result = $stmt->->fetchAll(PDO::FETCH_COLUMN, 0);

然后,这将返回您期望的所有语言的数组,然后您应该能够对其进行 array_diff_key 操作。

于 2012-11-15T16:41:35.733 回答