我正在使用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>
答案 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
中保持一致。