无法在CodeIgniter中显示用户配置文件的值?

时间:2017-12-05 21:52:45

标签: php codeigniter

我正在使用CodeIgniter进行简单的Twitter克隆练习,并且很难回应用户的 first_name last_name 以及 date_joined 值我的user.php视图中的表。我只想显示当前登录用户的值。

我希望我的视图中的会话用户名下面的值回显。我的控制器,视图和模型如下。现在我收到以下错误:

  

消息:不能使用stdClass类型的对象作为数组

这时我只是试图回显$ user ['first_name'],$ user ['last_name]等等。我之前有这样的工作,只是像这样回声,但现在我做不到。 如果我使用$ user的var_dump,我只需得到以下内容:

  

/app/www/application/views/user.php:5:stlass stdClass#22(1){public $ user_id => string(1)“1”}

控制器:User.php

class User extends CI_Controller
{
 function index()
 {
  $this->load->model('login_model');
  $data['user'] = $this->login_model->get_user();
  $data['tweets'] = $this->tweet_model->usertweets();
  $this->load->view('templates/header');
  $this->load->view('user', $data);
  $this->load->view('templates/footer');
 }
}

型号:Login_model.php

class Login_model extends CI_Model
{
 function can_login($username, $password)
{
 $this->db->where('username', $username);
 $this->db->where('password', $password);
 $query = $this->db->get('users');

 //SELECT * FROM users WHERE username = '$username' AND password = '$password'

 if($query->num_rows() > 0)
 {
  return true;
 }
 else {
  return false;
 }
}

 function get_user()
 {
  $query = $this->db->get('users');

  $username = $_SESSION['username'];
  $this->db->select('user_id', 'first_name', 'last_name', 'date_joined');
  $this->db->from('users');
  $this->db->where('username', $username);
  $query = $this->db->get();
  return $query->row();
 }
}

型号:Tweet_model.php

class Tweet_model extends CI_Model
{
public function __construct()
{
    $this->load->database();
}

public function get_tweets($tweet_id = false)
{
    if ($tweet_id === false) {
        $this->db->join('users', 'tweets.user_id = users.user_id');
        $query = $this->db->get('tweets');
        return $query->result_array();
    }

    $query = $this->db->get_where('tweets', array('tweet_id' => $tweet_id));
    return $query->row_array();
}

public function set_tweet()
{
    $tweet = url_title($this->input->post('tweet'), 'dash', true);

    $query = $this->db->get('users');

    $username = $_SESSION['username'];
    $this->db->select('user_id');
    $this->db->from('users');
    $this->db->where('username', $username);

    if ($this->db->affected_rows())
    {
        $user = $query->row();
        var_dump($user_id);
    }

    $data = array(
      'tweet' => $this->input->post('tweet'),
      'user_id' => $user->user_id
    );

    return $this->db->insert('tweets', $data);
}

function Usertweets() {
  $this->db->flush_cache();

  $username = $_SESSION['username'];
  $this->db->select('user_id');
  $this->db->from('users');
  $this->db->where('username', $username);

  $query = $this->db->get();
  $user = $query->row();

  $this->db->flush_cache();

  $this->db->select('*');
  $this->db->from('tweets');
  $this->db->where('user_id', $user->user_id);

  return $this->db->get()->result();

}
}

查看:user.php

<div class="container">
 <div class="row">
  <div class="col-md-4">
   <h4><?php echo $_SESSION['username']; ?></h4>
  </div>
  <div class="col-md-8">
   <?php foreach ($tweets as $tweet): ?>
    <div class="user-tweet">
     <h4><?php echo $_SESSION['username']; ?></h4>
     <h6><?php echo $tweet->tweet_date; ?></h6>
     <p><?php echo $tweet->tweet; ?></p>
    </div>
   <?php endforeach; ?>
  </div>
 </div>
</div>

2 个答案:

答案 0 :(得分:0)

您收到此错误是因为$ query-&gt; row()返回一个对象,这意味着您使用$ user-&gt; user_id获取值,而不是$ user [&#39; user_id&#39;]。如果您想使用$ user [&#39; user_id&#39;],请更改

$user = $query->row();

$user = $query->row_array();

答案 1 :(得分:0)

通常,名称中不包含array somwhere的任何CI db函数调用都会返回row()result()之类的对象,其数组副本为row_array()并且result_array()

在视图中访问数组$arr['somevalue'],像$obj->somevalue一样访问对象。我无法追踪您的错误,因为一切看起来都不错,但我怀疑您可能没有行,因此foreach失败。 在foreach之前,最好检查一下是否有任何要打印的内容!

<div class="col-md-8">
    <?php if (count($tweets) > 0): ?>
    <?php foreach ($tweets as $tweet): ?>
        <div class="user-tweet">
            <h4><?php echo $_SESSION['username']; ?></h4>
            <h6><?php echo $tweet->tweet_date; ?></h6>
            <p><?php echo $tweet->tweet; ?></p>
        </div>
    <?php endforeach; ?>
    <?php else: ?>
    No tweets!
    <?php endif; ?>
</div> 

代码审查

首先,在get_users函数中删除第一个$query = $this->db->get('users');,因为这是不必要的。

can_login重构为:

function can_login($username, $password) {
    $this->db->where('username', $username);
    $this->db->where('password', $password); 
    return $this->db->count_all_results('users') > 0; // or == 1
}

根据DRY原则重构set_tweet

public function set_tweet() {
    $this->load->model('login_model');
    $tweet = url_title($this->input->post('tweet'), 'dash', true);
    $data = array(
        'tweet' => $this->input->post('tweet'),
        'user_id' => $this->login_model->get_user()->user_id
    );
    return $this->db->insert('tweets', $data);
}

作为一般的良好做法,您应该注意,如果您使用这一点,您应该在登录时将user_id存储在会话中;它会减少数据库的压力。 此外,我假设如果用户未以$user_id身份登录或任何与用户相关的行字段无法访问且您将发出通知,则不会发生任何这些操作如果您尝试访问它们。如果(在您的情况下)$_SESSION['username']未设置,则将用户重定向到某处登录。

按照之前的重构,您可以将Usertweets重构为:

function Usertweets() {
    $this->load->model('login_model');
    //$this->db->select('*'); * is done for you by default
    $this->db->where('user_id', $this->login_model->get_user()->user_id);
    return $this->db->get('tweets')->result(); // object returned
}

您可能需要考虑返回一个对象,以便在get_tweets中保持一致。