2015-10-26 2 views
1

Я создал эту функцию, которая будет вставлять записи в базу данных, которые я буду использовать позже. Однако половина функции отлично работает другая половина вызывает ошибки (Ошибки не отображаются в логах)Magento Observer, функция Ошибка

<?php 
class Envato_CustomConfig_Model_Observer 
{ 
    public function adminSystemConfigChangedSection() 
    {   

    /** 
    *Insert new job Request 
    * 
    **/ 
     $tablename_c = Mage::getStoreConfig('customconfig_options/section_one/custom_field_one'); 
     $email = Mage::getStoreConfig('customconfig_options/section_two/custom_field_two'); 
     $days = Mage::getStoreConfig('customconfig_options/section_two/custom_field_three'); 

     $bind = array(
      'id' => ' ', 
      'tablename_c' => $tablename_c, 
      'email' => $email, 
      'days' => $days, 
      'timeStamp' => now(), 
     ); 

     //Open Database Conenction 
     $write = Mage::getSingleton("core/resource")->getConnection("core_write"); 

     $query = " 
     insert into Envato_CustomConfig_Job (Job_Id, tablename_colummname, email_template, days, timeStamp) 
     values (:id, :tablename_c, :email, :days, :timeStamp); 
     "; 

     $write->query($query, $bind); 

    /** 
    *Get Job Queue Ready 
    * 
    **/ 

     $res = " 
     SELECT Job_Id, tablename_colummname, email_template, days FROM Envato_CustomConfig_Job 
     WHERE tablename_colummname = :tablename_c 
     AND email_template = :email 
     AND days = :days 
     AND timeStamp =:timeStamp 
     AND Job_Id != :id 
     LIMIT 1; 
     "; 

     $result = $write->query($res, $bind); 

     foreach($result as $record) { 

      $Job_Id = $record['Job_Id']; 
      $tablename_colummname = $record['tablename_colummname']; 
      $days = $record['days']; 
      $email_template = $record['email_template']; 

      $email_Details[] = explode(".",$tablename_colummname);   

      if(!isset($email_Details['0']['2'])) 
      { 
       $email_Details['0']['2'] = time(); 
      } 
     } 

     $bind = array(
      'Job_Id' => $Job_Id, 
      'tableName' => $email_Details['0']['0'], 
      'email' => $email_Details['0']['1'], 
      'email_template' => $email_template, 
      'days' => $days, 
      'timeStamp' => $email_Details['0']['2'], 
     ); 

     $query = " 
     insert into Envato_CustomConfig_Job_Running (Job_Id, tableName, email, email_template, days, timeStamp) 
     values (:Job_Id, :tableName, :email, :email_template, :days, :timeStamp); 
     "; 

     $write->query($query, $bind); 

код, приведенный ниже, когда он включен в функции скрипт перестает работать, эта часть не работает в Magento , Прежде чем вы порекомендуете разбить его на более мелкие функции, я попытался, однако, когда я запустил или даже поместил еще одну функцию в класс, сайт не работает.

switch ($bind['timeStamp']) { 
     case is_numeric($bind['timeStamp']): 
      //¨calculate email send date 

      $email_Send_Date = strtotime('+'.$bind['days'].' day', $bind['timeStamp']); 
      $email_Send_Date = date('M d, Y', $email_Send_Date); 

      $bind['timeStamp'] = date('M d, Y', $bind['timeStamp']); 

      //Select Emails 
      $selectBind = array(
      'email' => $email_Details['0']['1'], 
      'tableName' => $email_Details['0']['0'], 
      ); 

      $res = " 
      SELECT :email FROM :tableName; 
      "; 

      $result = $write->query($res, $selectBind); 

      foreach($result['email'] as $record) {  

      $binding = array(
       'Job_Id' => $bind['Job_Id'], 
       'email' => $record, 
       'tableName' => $bind['tableName'], 
       'email_template' => $bind['email_template'], 
       'timeStamp' => $bind['timeStamp'], 
       'email_Send_Date' => $email_Send_Date, 
      ); 


      $res = " 

      insert into Envato_CustomConfig_Job_Queue 
      values (:Job_Id, :email , :tableName, :email_template, :timeStamp, :email_Send_Date); 

      "; 

      $result = $write->query($res, $binding); 
      } 


      break; 
     default: 
      //timestamp is given. 
      //Select Emails 
      $selectBind = array(
      'email' => $email_Details['0']['1'], 
      'timeStamp' => $email_Details['0']['2'], 
      'tableName' => $email_Details['0']['0'], 
      ); 

      $res = " 
      SELECT :email, :timeStamp FROM :tableName; 
      "; 

      $result = $write->query($res, $selectBind);   

      $i = 0; 
      foreach ($result['timeStamp'] as $value) { 

       switch($value) 
       {         
       case is_numeric($value): 
        // time() 
        $value = strtotime('+'.$bind['days'].' day', $value); 
        $value = date('M d, Y', $value); 
        break; 
       default: 
        // days + Unix 
        $value = strtotime(str_replace(',', '', $value)); 
        $value = strtotime('+'.$bind['days'].' day',$value); 
        $value = date('M d, Y', $value); 
        break; 
       } 

       $binding = array(
       'Job_Id' => $bind['Job_Id'], 
       'email' => $result['email'][$i], 
       'tableName' => $bind['tableName'], 
       'email_template' => $bind['email_template'], 
       'timeStamp' => $bind['timeStamp'], 
       'email_Send_Date' => $value, 
       ); 

       $res = " 

       insert into Envato_CustomConfig_Job_Queue 
       values (:Job_Id, :email , :tableName, :email_template, :timeStamp, :email_Send_Date); 

       "; 

       $result = $write->query($res, $binding); 

       $i = $i+1; 
      } 

     break; 
     } 

    } 

} 
?> 

EDIT ::

Я разбил его много, и было отладки кода. Я получил эту ошибку, я попытался переписать сценарий, но все же конечный результат тоже. любые идеи о следующей ошибке?

Произошла ошибка при сохранении этой конфигурации: SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' nfr_familypack '' в строке 1, запрос был: SELECT: email FROM: tableName;

ответ

1

Вы не можете использовать именованные параметры для объектов базы данных, как вы пытаетесь сделать здесь:

SELECT :email FROM :tableName 

Когда вы думаете о том, что подготовленный заявление и делает (что позволяет MySQL для предварительной планировки запроса, не зная, какие конкретные параметры должны быть переданы ему), должно быть очевидно, что вы не можете параметризовать критические данные, которые MySQL должен подготовить для запроса. Например, как MySQL знает, какая таблица создает план выполнения запроса?

1

Я просто попытался напечатать полный запрос и он выглядит как этот

SELECT email FROM 'nfr_familypack'; 

Обратите внимание на одинарные кавычки вокруг TABLENAME. PDOStatement обернул параметры привязки одинарными кавычками. Таким образом, это приведет к ошибке синтаксиса Mysql

Смежные вопросы