为什么CodeIgniter在模型I中创建了“调用未定义的方法”?

时间:2012-08-27 17:02:43

标签: php codeigniter email

因此,我的任务是为我们的会员数据库创建一个功能,该功能将每月提醒某人他们的会员资格何时到期。如果一个人的会员资格到期时间为6个月或更短,我们会发送一封电子邮件,如果他们是3个月,我们会发送另一封电子邮件。没有大呐喊。我首先创建一个这样的模型:

class Email extends CI_Model {

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

// -----------------EMAIL-----------------
function emailMessage($message = 1,$recipient = 1777) { // Default "Test" Numbers
    $rInfo = $this->db->query("SELECT * FROM Members WHERE intKey = " . $recipient)->row();
    $eInfo = $this->db->query("SELECT * FROM Emails WHERE intKey = " . $message)->row(); 

    // Replacements?
    $bodyCopy = $eInfo->txtEmail;
    $bodyCopy = str_replace("[firstname]",$rInfo->strFirstName,$bodyCopy);  

    $this->load->library('email');
    $this->email->from('someone@example.com','John Q Public');
    $this->email->to($rInfo->strEmail); 
    $this->email->subject($eInfo->strTitle);
    $this->email->message($bodyCopy);
    $this->email->send();
    $this->email->clear();
}
}

一切都很好,当我从我建立的网站的任何其他部分调用此模型时,它工作正常。这是处理必须发送给我们选区的任何股票电子邮件的好方法。通常,它在代码中就是这样的东西:

$this->load->model('email');
$this->email->emailMessage(8,$this->session->userdata('memberKey'));

像魅力一样工作。我之前使用过的地方与我现在使用它的地方之间的最大区别在于我在循环中将模型的调用括起来如下:

public function warningEmails() {
    $this->load->model('email');
    $sql = 'SELECT
                *, FLOOR(
                    DATEDIFF(dtAccreditationEnd, now())/ 30
                )AS diff
            FROM
                tblMembers
            WHERE
                enmAccredited = "yes"
            AND dtAccreditationEnd < DATE_ADD(now(), INTERVAL 6 MONTH)
            ORDER BY
                diff
    ';  
    $emailSend = $this->db->query($sql);
    foreach ($emailSend->result() as $row) {
        if ($row->diff <= 3) {
            $letter = 10;
        } else {
            $letter = 9;
        }
        $this->email->emailMessage($letter,$row->intMembersKey);
    }
}

第一次通过循环时效果很好,并且在循环的下一次迭代中失败并显示以下消息:

致命错误:在线路 /home/contract/public_html/members/application/controllers/staff.php 中调用未定义的方法CI_Email :: emailMessage()强> 1033

第1033行是这一行:

  $this->email->emailMessage($letter,$row->intMembersKey);

我有一个问题,这个模型只能在给定的实例中调用一次?我究竟做错了什么?提前感谢您的协助!

编辑:我要添加一个var_dump($ this-&gt; email);看看它可能是什么......

  

对象(CI_Email)#30(46){[“useragent”] =&gt;串(11)   “CodeIgniter”[“mailpath”] =&gt; string(18)“/ usr / sbin / sendmail”
  [ “协议”] =&GT; string(4)“mail”[“smtp_host”] =&gt; string(0)“”
  [ “smtp_user”] =&GT; string(0)“”[“smtp_pass”] =&gt; string(0)“”
  [ “SMTP_PORT”] =&GT; string(2)“25”[“smtp_timeout”] =&gt; INT(5)
  [ “smtp_crypto”] =&GT; string(0)“”[“wordwrap”] =&gt;布尔(真)
  [ “wrapchars”] =&GT; string(2)“76”[“mailtype”] =&gt; string(4)“text”
  [ “字符集”] =&GT; string(5)“utf-8”[“multipart”] =&gt;串(5)   “mixed”[“alt_message”] =&gt; string(0)“”[“validate”] =&gt;
  bool(false)[“priority”] =&gt; string(1)“3”[“newline”] =&gt;
  string(1)“”[“crlf”] =&gt; string(1)“”[“send_multipart”] =&gt;
  bool(true)[“bcc_batch_mode”] =&gt; bool(false)[“bcc_batch_size”] =&gt;   int(200)[“_ safe_mode”] =&gt; bool(false)[“_subject”] =&gt;串(0)   “”[“_body”] =&gt; string(357)“Geoffrey,

     

这提醒您,您的PDCA认证将于3日到期   个月。访问您的会员仪表板,查看所有完整和   不方便的课程工作在您方便。会员仪表板   将帮助您完成整个过程。更多   如有任何信息,请通过Someone@example.com或联系   1-800-555-1212。​​“[”_ _ finalbody“] =&gt; string(0)”“
  [ “_alt_boundary”] =&GT; string(0)“”[“_ atc_boundary”] =&gt;串(0)   “”[“_header_str”] =&gt; string(0)“”[“_ smtp_connect”] =&gt;
  string(0)“”[“_encoding”] =&gt; string(4)“8bit”[“_ IP”] =&gt;
  bool(false)[“_ smtp_auth”] =&gt; bool(false)[“_replyto_flag”] =&gt;
  bool(false)[“_ debug_msg”] =&gt; array(0){} [“_recipients”] =&gt;
  string(17)“recipient@example.com”[“_ cc_array”] =&gt;数组(0){}   [ “_bcc_array”] =&GT; array(0){} [“_headers”] =&gt; array(5){       [ “从”] =&GT;       string(54)“”有人举例“”       [ “返回路径”] =&GT;       string(28)“”       [ “抄送”] =&GT;       string(16)“copy@example.com”       [ “密送”] =&GT;       string(17)“blindcopy@example.com”       [ “主题”] =&GT;       string(49)“=?utf-8?Q?PDCA_Accreditation_Expiration_Warning?=”} [“_attach_name”] =&gt; array(0){} [“_attach_type”] =&gt; array(0){   } [“_attach_disp”] =&gt; array(0){} [“_protocols”] =&gt;阵列(3)   {       [0] =&GT;       string(4)“mail”       [1] =&GT;       string(8)“sendmail”       [2] =&GT;       string(4)“smtp”} [“_ base_charsets”] =&gt;数组(2){       [0] =&GT;       string(8)“us-ascii”       [1] =&GT;       string(9)“iso-2022-”} [“_ bit_depths”] =&gt;数组(2){       [0] =&GT;       string(4)“7bit”       [1] =&GT;       string(4)“8bit”} [“_priorities”] =&gt; array(5){       [0] =&GT;       string(11)“1(最高)”       [1] =&GT;       string(8)“2(High)”       [2] =&GT;       string(10)“3(Normal)”       [3] =&GT;       string(7)“4(Low)”       [4] =&GT;       string(10)“5(最低)”}}

4 个答案:

答案 0 :(得分:2)

我有类似的症状,但由于不同的问题。我最近通过我选择的编辑器将我的模型的文件名从name_model.php更改为Name_model.php,我几乎没有意识到我的编辑器实际上没有删除旧的name_model.php文件,因此有两个文件位于具有相同名称和不同大小写的目录。

我在我的模型中创建了一个新函数,但是它正在读取旧的模型文件,它让我持续了好几个小时,直到我看到目录中的实际文件。

简单地删除旧文件有助于解决我的问题。

答案 1 :(得分:1)

也许我误读了这个,但不是这一行:    $这 - &GT;负载&GT;库( '电子邮件');

加载写入此行的电子邮件库?我认为你是递归杀死自己。

答案 2 :(得分:1)

尝试将官方电子邮件库重命名为另一个,

$this->load->library('email', NULL, 'ci_email');

然后通过这样做来访问它,

$this->ci_email->from('someone@example.com','John Q Public');

当前的电子邮件库已覆盖您的电子邮件模型。

答案 3 :(得分:0)

我无法使用autoload

加载我的库类MbSec {}
$autoload['libraries'] = array('database', 'mbsec');

或控制器中的负载。

$this->load->library('mbsec');

但似乎与Capitals合作,是不是违背逻辑?

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