我最近将项目包从Codeigniter 2X版本切换到了Codeigniter 3X版本。
以前,我所有的代码都能正常工作,但是现在有了新软件包,它显示了一些我无法运行代码的微小错误。
以下是错误: 消息:非法字符串偏移:
我的控制器:
public function proflist(){
$data = "";
$this->load->model('feedbackmodel');
$data['teachers'] = $this->feedbackmodel->getFaculty();
$this->load->view('feedback/proflist',$data);
}
我的模特:
public function getFaculty(){
$query = $this->db->query('SELECT * FROM teacher');
return $query->result_array();
}
我的观点:
<?php
if(!empty($teachers)) {
foreach($teachers as $y){
?>
<tr>
<td><?php echo $y->fid; ?></td>
<td><?php echo $y->fname." ". $y->lname; ?></td>
<td><?php echo $y->email; ?> </td>
<td>
...
有什么错误吗?我该如何更改。请让我知道:)谢谢。
答案 0 :(得分:0)
原因很可能是您使用的PHP版本。在PHP 7.1之前,它仅是因使用非法偏移而引发的声明。 7.1+现在会发出警告。您可以通过在有问题的数组中的控制器中包装' isset 来避免这种情况。确保也强制转换数组。
You'll find a good explanation for it here.
public function proflist() {
$data = "";
$this->load->model('feedbackmodel');
$data['teachers'] = (array) $this->feedbackmodel->getFaculty();
if(!isset($data['teachers'])) {
$data['teachers'] = '';
}
$this->load->view('feedback/proflist',$data);
}
要确定您正在运行的PHP版本,可以使用phpinfo();
。
答案 1 :(得分:0)
您需要更多地了解变量类型是什么。
在您的控制器中
public function proflist(){
$data = "";
$this->load->model('feedbackmodel');
$data['teachers'] = $this->feedbackmodel->getFaculty();
$this->load->view('feedback/proflist',$data);
}
您通过$data = "";
然后您将通过
决定它将成为一个数组$data['teachers'] = $this->feedbackmodel->getFaculty();
正确的是,应将$ data声明为空数组,而不是空字符串。
public function proflist(){
$data = array(); // Using the older style of declaring an array.
$this->load->model('feedbackmodel');
$data['teachers'] = $this->feedbackmodel->getFaculty();
$this->load->view('feedback/proflist',$data);
}
现在在您的模型中,通过以下方式创建返回的数据
return $query->result_array();
如果您在此查找codeigniter文档,它将告诉您结果数据是关联数组,即$ data ['teachers']的格式为
$data['teachers']['fid']
等
您的视图要求它是一个对象。 因此,您可以从...更改需要$ teachers成为对象的视图。
<?php
// $teachers should be returned from result() which is an object.
if(!empty($teachers)) {
foreach($teachers as $y){
?>
<tr>
<td><?php echo $y->fid; ?></td>
<td><?php echo $y->fname." ". $y->lname; ?></td>
<td><?php echo $y->email; ?> </td>
<td>
...
收件人
<?php
// $teachers is returned from result_array() which is an associative array.
if(!empty($teachers)) {
foreach($teachers as $y){
?>
<tr>
<td><?php echo $y['fid']; ?></td>
<td><?php echo $y['fname']." ". $y['name']; ?></td>
<td><?php echo $y['email']; ?> </td>
<td>
...
或者只需更改模型的收益率(一个班轮即可)。因此,更改您的模型
public function getFaculty(){
$query = $this->db->query('SELECT * FROM teacher');
return $query->result_array(); // Return an associative array
}
收件人
public function getFaculty(){
$query = $this->db->query('SELECT * FROM teacher');
return $query->result; // Return an object
}
所以简短的版本是:
检查返回的数组结构。您应该为此使用var_dump()。
更改您的代码以适合。
将模型的收益从result_array()更改为result()或
将视图从寻址对象更改为关联数组。
在这个阶段,我被迫抽出时间来详细讨论,但这应该可以帮助您了解正在发生的事情。