【问题标题】:Illegal string offset codeigniter非法字符串偏移codeigniter
【发布时间】:2013-09-30 17:33:13
【问题描述】:

您好,我一直在尝试从我的数据库中检索记录,但我在多个字段中不断收到此错误“严重性:警告消息:非法字符串偏移”。

这是我的控制器 view_logs.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class View_Logs extends CI_Controller {

function View_Logs()
 {
   parent::__construct();
 }  

function Logs(){
    $id = $this->uri->segment(3);

    $this->load->model('log_listmodel');
    $this->log_listmodel->log_list_get($id);    
}
}
?>

这是我的模型 log_listmodel.php

<?php
class Log_Listmodel extends CI_Model{

    function Log_Listmodel()
    {
      parent::__construct();
    }

    function log_list_get($id){
    $query = $this->db->get_where('test_request_log', array('test_request_id' => $id));
    //return $query->result();
    $results=$query->result_array();


    $data['query']=$results[0];
    $this->load->view('logs_list_view',$data);
    }
}
?>

这是我的查看页面 log_list_view.php

<table class="list_header" bgcolor="#ffffff" border="0" width="1020px" cellpadding="4px">

            <?php foreach($query as $row): ?>
            <tr> 
                <td><b>Updated</b></td>
                <td><?php echo $row['id'];?>.</td>
                <td><?php echo $row['new_testing_reason'];?></td>
                <td><?php echo $row['new_applicant_name'];?></td>
                <td><?php echo $row['new_authorizer_name'];?></td>
                <td><?php echo $row['new_received_by'];?></td>
                <td><?php echo $row['new_test_required'];?></td>
                <td><?php echo $row['new_laboratory_number'];?></td>
                <td><?php echo $row['log_date'];?></td>
                <td><?php echo $row['who'];?></td>
            </tr>
            <?php endforeach; ?>
        </table>

【问题讨论】:

  • 你哪里出错了?
  • 与手头的问题无关,但您的 MVC 结构有点混乱。你真的应该在控制器中调用你的视图。 问题:您只从数据库返回一行,然后使用foreach 在视图中循环遍历该行列。删除 foreach 并访问 $query['id'] 之类的数据,或者在您的模型中将数据设置为 $data['query'] = $results
  • var_dump($row) 看看它是什么(应该是一个包含您尝试访问的索引的数组)

标签: php codeigniter


【解决方案1】:

您的代码结构不正确,我只是对其进行了重构并使其变得简单。 希望它有效。

首先让我们加载您的数据库库。

转到 application/config/autoload.php 找到这一行然后自动加载数据库

/*
| -------------------------------------------------------------------
|  Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your application/libraries folder.
|
| Prototype:
|
|   $autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/

$autoload['libraries'] = array('database');

控制器视图

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class View_Logs extends CI_Controller {

function View_Logs()
 {
   parent::__construct();
   $this->load->library('database');   // if you didn`t load 'database' in your autoload.php
   $this->load->model('log_listmodel');
 }  

function Logs(){
    $id = $this->uri->segment(3);


    $data['query'] = $this->log_listmodel->log_list_get($id)->result();

    $this->load->view('logs_list_view',$data);
}
?>

模型视图

<?php
class Log_Listmodel extends CI_Model{

    function Log_Listmodel()
    {
      parent::__construct();
    }

    function log_list_get($id){
        return $this->db->get_where('test_request_log', array('test_request_id' => $id));

    }
}
?>

查看模式

<table class="list_header" bgcolor="#ffffff" border="0" width="1020px" cellpadding="4px">

            <?php foreach($query as $row): ?>
            <tr> 
                <td><b>Updated</b></td>
                <td><?php echo $row->id;?>.</td>
                <td><?php echo $row->new_testing_reason;?></td>
                <td><?php echo $row->new_applicant_name;?></td>
                <td><?php echo $row->new_authorizer_name;?></td>
                <td><?php echo $row->new_received_by;?></td>
                <td><?php echo $row->new_test_required;?></td>
                <td><?php echo $row->new_laboratory_number;?></td>
                <td><?php echo $row->log_date;?></td>
                <td><?php echo $row->who;?></td>
            </tr>
            <?php endforeach; ?>
</table>

【讨论】:

  • result() 将整个结果集作为对象返回,您将在视图中获得一个array to string conversion error。另外,使用__construct()而不是与类同名的方法,即php4
  • @DamienPirsy 感谢纠正忘记将加载结果集更改为 obj。
  • @Kaii 尝试了你的方法,但它给了我另一个错误致命错误:“在非对象上调用成员函数 log_list_get()”
  • 您是否在 autoload.php 上加载了 database 库?正如我在第一行所说的......
  • 或者在调用你的模型$this-&gt;load-library('database')之前加载你的数据库..
【解决方案2】:

您已将$data['query'] 设置为结果的第一行,但在视图中您正在使用它,因为它将拥有整个数据集。

所以你需要改变

$data['query']=$results[0];

$data['query']=$results;

$data['query']=$query->result_array();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2020-11-29
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多