【问题标题】:Can't display values for a user profile in CodeIgniter?无法在 CodeIgniter 中显示用户配置文件的值?
【发布时间】:2018-05-19 16:23:54
【问题描述】:

我正在为 CodeIgniter 练习制作一个简单的 twitter 克隆,但我很难从我的用户那里回显 first_namelast_namedate_joined 值我的 user.php 视图中的表。我只想显示当前登录用户的值。

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

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

这是我尝试回显 $user['first_name']、$user['last_name] 等的时候。在像这样简单地回显之前,我已经让它工作了,但现在我不能了。 如果我执行 $user 的 var_dump,我只会得到以下信息:

/app/www/application/views/user.php:5: 类 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>

【问题讨论】:

  • 如果 $users 后跟该值不起作用是什么意思?您的意思是如果出现数据库错误,您将如何处理?
  • 我强烈建议不要重新设计轮子并使用Ion_Auth 来满足您的登录/用户管理需求。它是最新的,并且一直在测试/改进,而且效果很好。

标签: php codeigniter


【解决方案1】:

您收到此错误是因为 $query->row() 返回一个对象,这意味着您使用 $user->user_id 获取值,而不是 $user['user_id']。如果你想使用 $user['user_id'],改变

$user = $query->row();

$user = $query->row_array();

【讨论】:

  • 我更新了问题,如果我感到困惑,抱歉。我只是无法让 $user['first_name']、$user['last_name'] 和 $user['date_joined'] 像这样在我的用户视图中回显。它正在工作,但后来停止了,我不确定为什么。
  • 好吧,这是有道理的,我将它作为一个对象保留。但是我仍然知道该属性是未定义的,例如:Message: Undefined property: stdClass::$first_name 当我键入 echo $user->first_name; 时,这是在将其作为对象保留之后。
  • 您的查询可能没有返回任何行。做一个 $query->row() 的 var_dump 以确保。您确定 $_SESSION['username'] 设置正确吗?如果您使用 CI 的会话库设置会话,它不会使用 PHP 的本机会话库。您可以在此处阅读有关 CI 会话库的更多信息:codeigniter.com/user_guide/libraries/sessions.html 在您的视图中返回用户信息之前,我还会检查行数。
  • 好吧,我只设置了会话的用户名,我根据 $username 查询的其他信息(first_name、last_name 和 date_joined),正如您在 Login_model.php 中看到的那样。所以做一个 var_dump 的会话只返回用户名。好的,所以我做了 var_dump($query->row());在我的用户视图中并得到:消息:未定义变量:查询文件名:views/user.php 行号:5 消息:在 null 文件名上调用成员函数 row():/app/www/application/views/user.php行号:5
  • 是的!我确实得到了我需要的值(first_name ...等),但是现在如何回显?
【解决方案2】:

通常,任何名称中不包含 array somwhere 的 CI db 函数调用都会返回一个对象,例如 row()result(),其对应的数组为 row_array()result_array()

在视图中访问数组的方式类似于$arr['somevalue'],而访问对象的方式类似于$obj-&gt;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-&gt;db-&gt;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 中的所有内容也保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多