我正在使用当前版本的CodeIgniter(2.1.3)。我有三个MySQL表:
id name
========
1 ACME
id tag
=======
1 bar
2 foo
id operator_id tag_id
=======================
1 1 1
2 1 2
因此,运营商ACME标记有两个标签(bar和foo)。
尝试删除这样的标记时出错:
//file: controllers/tag.php (function contained in class Tag extends CI_Controller)
//this function should remove the tag with the id $id and redirect back to the edit page for the operator
public function remove($id){
$operator_id = $this->operator_model->get_operator_for_tag_id($id);
$this->operator_model->remove_tag_from_operator($id);
redirect('operator/edit/'.$operator_id);
}
...
//file: models/operator_model.php (functions contained in class Operator_model extends CI_Model)
public function get_operator_for_tag_id($id){
$query = $this->db->select('operator_id')->from('operator_tag')->where('id',$id)->get();
return $query->row()->operator_id;
}
public function remove_tag_from_operator($id){
$this->db->delete('operator_tag',array('id' => $id));
}
如果我调用该函数从操作符中删除标记“foo”(id:2),则打开网址http://example.com/tag/remove/2(成功调用控制器“tag” - > function“remove”with参数“2”。但是大多数时候我收到以下错误
A PHP Error was encountered
Severity: Notice
Message: Trying to get property of non-object
Filename: models/operator_model.php
Line Number: XX (which is line with `return $query->row()->operator_id;`)
看来,DELETE查询是在SELECT查询之前执行的。 (我试图在(第二个)remove_tag_from_operator
函数中添加一个INSERT查询,并在(第一个)get_operator_for_tag_id
函数中回显该表的所有结果,该函数神秘地包含了删除函数中的行(先前生成的)
CodeIgniter是否并行执行查询,或以任何特殊顺序询问它们?如果是这样,是否有可能禁用此功能?提前谢谢!
@luc我将代码更改为以下(添加的回显行)以进行调试:
//file: controllers/tag.php
public function remove($id){
echo '-1. CONTROLLER '.$id.'<br>';
$operator_id = $this->operator_model->get_operator_for_tag_id($id);
echo '-2. CONTROLLER '.$id.'<br>';
$this->operator_model->remove_tag_from_operator($id);
echo '-3. CONTROLLER '.$id.'<br>';
redirect('operator/edit/'.$operator_id);
}
//file: models/operator_model.php
public function get_operator_for_tag_id($id)
{
echo '-1.1 GET '.$id.'<br>';
$query = $this->db->select('operator_id')->from('operator_tag')->where('id',$id)->get();
echo '-1.2 GET '.$id.'<br>';
$result = $query->row()->operator_id;
echo '-1.3 GET '.$id.'<br>';
return $result;
}
public function remove_tag_from_operator($id){
echo '-2.1 REMOVE '.$id.'<br>';
$this->db->delete('operator_tag',array('id' => $id));
echo '-2.2 REMOVE '.$id.'<br>';
}
在调用http://example.com/tag/remove/41
时输出如下内容-1. CONTROLLER 41
-1.1 GET 41
-1.2 GET 41
**A PHP Error was encountered**
Severity: Notice
Message: Trying to get property of non-object
Filename: models/operator_model.php
Line Number: 236 (which is the row with `$result = $query->row()->operator_id;`)
-1.3 GET 41
-2. CONTROLLER 41
-2.1 REMOVE 41
-2.2 REMOVE 41
-3. CONTROLLER 41
**A PHP Error was encountered**
Severity: Warning
Message: Cannot modify header information - headers already sent by (output started at .../application/controllers/tag.php:242) (which is the output generated by `echo '1. CONTROLLER '.$id.'<br>';`)
Filename: helpers/url_helper.php
Line Number: 542
所以$ id正确传递,回声的顺序正确。只有数据库查询以神秘的方式执行。
@itachi我更改了以下代码进行调试(如果找不到值,则输出整个operator_tag-table)
//file: controllers/tag.php
public function get_operator_for_tag_id($id)
{
$query = $this->db->select('operator_id')->from('operator_tag')->where('id',$id)->get();
if ($query->num_rows() > 0){
return $query->row()->operator_id;
}else{
$query = $this->db->get('operator_tag');
print_r($query->result());
}
}
在调用http://example.com/tag/remove/44
时输出如下内容Array ( [0] => stdClass Object ( [id] => 3 [operator_id] => 40 [tag_id] => 1 ) )
A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information - headers already sent by (output started at .../application/models/operator_model.php:236) (which is the line with `print_r($query->result());`)
Filename: helpers/url_helper.php
Line Number: 542
我试图重现工作示例,但我失败了。如果我注释掉它的$this->db->delete('operator_tag',array('id' => $id));
行(将我重定向到operator / edit / $ id)。
答案 0 :(得分:0)
发生该错误主要是因为查询字符串不完整。你有$ this-&gt; uri-&gt;段(3)来获取$ id吗?我在你的代码中没有看到它。 $ id定义在哪里?
尽量回应它的价值,我认为这就是问题所在。
答案 1 :(得分:0)
我总是遇到同样的错误(试图获取非对象的属性),无法创建代码工作 的场景。
所以我试着冲洗桌子。第一行按预期删除。在删除(大约id = 9左右)时,我收到了相同的错误(没有机会让它再次运行)。
我再次刷新了表格,现在我无法再次重现错误 。我尝试了这个程序大约5次,每次插入/删除约40次。
我从来没有经历过这样的错误。也许数据库/表已损坏?也许MySQL-Server有像多线程一样的“性能改进”设置?也许这是主机的故障(有一段时间我遇到了很多HTTP 500错误,当我忘记分号或类似的东西时,它会重定向到主机的/ 404页面)。无论如何,由于我的客户希望保留他的奇怪主机,我别无选择。
谢谢大家,感谢您的大力支持!