Ir para conteúdo

Jeovane Carvalho

Members
  • Total de itens

    198
  • Registro em

  • Última visita

Posts postados por Jeovane Carvalho


  1. Olá senhoras e senhores, venho aqui tirar uma dúvida !

     

    Eu desenvolvi um projeto em php para um cliente e hospedei na Hostgator,  como já trabalho com a hospedagem Hostgator há alguns anos, nunca tive problema até quando comecei a trabalhar com PREPARE STATEMENT ,  e aí me gerou uma grande dor de cabeça, e como não tinha muita experiência usando instrução preparada,  comecei a desenvolver meus projetos através desta instrução e rodando de boa localmente, e foi só hospedar remotamente e já deu alguns erros, e o principal de foi    *   Call to undefined method mysqli_stmt::get_result() in  *     e consultando o site  stackoverflow  li um seguinte trecho de um desenvolvedor experiente que O mysqli foi introduzido no php 5, já a função get_result pertence ao pacote mysqlnd que é o driver nativo.

     

    E como não tinha ciência desta função MYSQLND  e pelo que eu li, ELA É NATIVA DO MYSQL, e para não perder o plano já contratado, tive que usar em vez de get_result() usar o bind_result (), só que tive dificuldades de alguns dias para resolver, mas consegui fazer com que na classe A, onde esta minhas instruções e conexões com o banco e o loop do while estão , fazer que ao instanciar um objeto e chamar cada variável usando [ ] como array conseguisse pegar todos os dados dentro do loop do while e irei mostrar logo abaixo:

    E a minha dúvida é saber se estaria fazendo de forma correta ou existiria outra forma de usar o foreach para percorrer um array.

     

    Segue abaixo o código de exemplo:

     

     

        CLASSE A:

     

    <?php
    
    	class DadosAmortecedoresEletricos {
    	private $conecta_banco;	
    	public function __construct(){
    	$this->conecta_banco=new Conexao();
    	$this->conecta_banco->Conectar();	
    	}	
    	public $ativo;
    	public $com_foto;
    	public $sem_foto;
    	public $linha;
    	public $id;
    	public $produto_id;
    	public $negocio;
    	public $negocio_tipo;
    	public $tipos;	
    	public $tipo;
    	public $imgP;
    	public $valor;
    	public $negocio_d;
    	public $sqlL_2;
    	public $sqlL_1;
    
    // ESSA CLASSE SERVE PARA PAGINAÇÃO
    	public function BuscarDadosAmortecedoresEletricos(){
    	$conexao=$this->conecta_banco->banco;
    	$Dados=new DadosEmpresa();
        $Dados->BuscarDadosEmpresa();
    	$limit=$Dados->qtd_secao_eletrico;
    	
    	$ativo=$this->ativo=1;
    	$sql_1=$conexao->prepare("SELECT i.id,i.id_produto_tipo,i.id_produto_subtipo,t.tipo,n.tipo_nome FROM dados_anuncio i LEFT JOIN tipo_produto t ON (t.id = i.id_produto_tipo)LEFT JOIN subtipo_produto n ON (n.id = i.id_produto_subtipo) WHERE i.ativo=? AND n.tipo_nome LIKE '%el%' ORDER BY i.id DESC LIMIT ".$limit."");
    	$sql_1->bind_param('s',$ativo);
    	$sql_1->execute();
    	$sqlL_1=$sql_1->bind_result($id,$id_produto_tipo,$id_produto_subtipo,$tipo, $tipo_nome);
    	
    	while ($sql_1->fetch()) {
    	$this->produto_id=$id_produto_tipo;
    	$this->subproduto_id=$id_produto_subtipo;
    	}
    	$dados="";
    	$ativo=$this->ativo=1;
    	
    	
    	// ESSA CLASSE SERVE PARA RESGATAR OS DADOS 
    	
    	$sql_1 = $conexao->prepare("SELECT i.id AS idi,i.id_produto_tipo,i.foto_exibicao,i.foto_grande,foto_titulo,i.valor, t.tipo_nome, n.tipo AS tipo FROM dados_anuncio i 
    	LEFT JOIN subtipo_produto t ON (t.id = i.id_produto_subtipo) 
    	LEFT JOIN tipo_produto n ON (n.id =".$this->produto_id.") WHERE i.ativo=? AND t.tipo_nome LIKE '%el%' AND i.id_produto_subtipo LIKE '%".$this->subproduto_id."%' ORDER BY RAND () LIMIT ".$limit."") ;
    	if($sql_1){
    	$sql_1->bind_param('s',$ativo);
    	$sql_1->execute();
    	
    	$sql_1->store_result();
    	$this->sqlT_3=$sql_1->bind_result($id,$id_produto_tipo,$foto_exibicao,$foto_grande,$foto_titulo,$valor, $tipo_nome, $tipo);
    	
    	while ($sql_1->fetch()) {
    
    		$this->id[]=$id;
    		$this->tipo[]=$tipo;
    		$this->tipo_nome[]=$tipo_nome;
    		$this->foto_exibicao[]=$foto_exibicao;
    		$this->foto_grande[]=$foto_grande;
    		$this->foto_titulo[]=$foto_titulo;
    	$this->valor[]=$valor;
    	}
    	
    	
        
    
        
    }}
    	
    	}
    ?>

    Minha página onde instancio o objeto abaixo:

     

     

    <?php 
    
    // Aqui é onde uso os foreach para percorrer cada variável
    $n=0;
    $tipos=array();
    
    	
        $n=0;
        foreach ($dados_elet->id  as $key=> $thing) {
        $tipos[$n][1] = $thing;
        $n++;
        }
    	if(is_array($dados_elet->tipo)){
        $n=0;
        foreach ($dados_elet->tipo as $thing) {
        $tipos[$n][2] = $thing;
        $n++;
        }}
    	if(is_array($dados_elet->tipo_nome)){
        $n=0;
        foreach ($dados_elet->tipo_nome as $thing) {
        $tipos[$n][3] = $thing;
        $n++;
        }}
    	if(is_array($dados_elet->foto_exibicao)){
        $n=0;
        foreach ($dados_elet->foto_exibicao as $thing) {
        $tipos[$n][4] = $thing;
        $n++;
        }}
    	if(is_array($dados_elet->foto_grande)){
        $n=0;
        foreach ($dados_elet->foto_grande as $thing) {
        $tipos[$n][5] = $thing;
        $n++;
        }}
    	if(is_array($dados_elet->foto_titulo)){
        $n=0;
        foreach ($dados_elet->foto_titulo as $thing) {
        $tipos[$n][6] = $thing;
        $n++;
        }}
    	if(is_array($dados_elet->valor)){
        $n=0;
        foreach ($dados_elet->valor as $thing) {
        $tipos[$n][7] = $thing;
        $n++;
        }}
       foreach($tipos as  $dados_inf){
    
    
    
    	
    
    $imgP= $dados_inf[4];
    $descricao= $dados_inf[6];		
    $id=  $dados_inf[1];
    $negocio= $dados_inf[2];
    $negocio_id= $dados_inf[2];
    $subtipo= $dados_inf[3];
    $negocio_tipo= $dados_inf[2];
    $tipos= $dados_inf[2];
    $valor= $dados_inf[7];
    if($valor=='0.00' || $valor==''){$valor='Consulte-nos';}else{ $valor ="R$ ".$valor;}
    $tipo= $tipos;$tipo= strtolower(str_replace(" ","-",strtr(utf8_decode(trim($tipo)),utf8_decode("áàãâéêíóôõúüñçÁÀÃÂÉÊÍÓÔÕÚÜÑÇ"),"aaaaeeiooouuncAAAAEEIOOOUUNC-")));
    
    $imgP2='img_produtos/thumbs/'.$imgP.'';
    if(file_exists($imgP2)){$foto='<img class="lozad" data-src="'.$Dados->site.'img_produtos/thumbs/'.$imgP.'" alt="'.$tipo.'" />';}else{$foto='<img src="'.$Dados->site.'images/sem_foto.jpg" alt="'.$tipo.'" />';}
    echo $com_foto='<ul class="menu"><div class="favoritos_add"> <a data-id="'.$id.'" data-toggle="modal" title="'.$id.'" data-target="#myModalfavoritos'.$id.'" id="'.$id.'" class="hvr-pulse"><img src="images/coracao_fav_ext.png" alt="Favoritos" /></a></div> <li><a title="'.$tipo.' | valor: '.$valor.'" href="'.$Dados->site.'contato">'.$foto.'</a> 
    <div class="fundo_dados"> 
    <div class="dados_tipo">'.$tipos.' </div> 
    <div class="dados_subtipo">'.$subtipo.'</div>
    <div class="dados_titulo">'.$descricao.'</div>
    <div class="dados_valor">'.$valor.'</div> 
    <div class="informacoes"><a title="'.$negocio.' | '.$tipo.'|  valor: '.$valor.'" href="'.$Dados->site.'contato">MAIS INFORMAÇÕES</a></div>
    <div class="comparar"> <label><input name="comparar[]" type="checkbox" id="comparar" value="'.$id.'" /> Comparar</label><div class="dados_codigo">código: '.$id.'</div></div> </div></li></ul>';
         
         ?>

    Notem que para cada variável eu uso um foreach para varrer as informações do while da outra página e por último eu uso um foreach que pega cada variável do foreach e distribuo as informações de cada variável na sua matriz na ordenação  de [1] , [2], [3]  e assim por diante.

    Resumindo , funciona mas queria saber se existe outra maneira com menos linha de código e que fique mais rápido na hora do php compilar ..

    Lembrando que não posso usar GET_RESULLT().

    E acredito que muitos terão este problema quando começarem a atualizar seus códigos..

    Obrigado :)


  2. Olá pessoal, estou precisando de um help !

     

    Pois eu tenho uma classe assim:

     

    DadosComboClasse.php

     

    	
    	class  DadosComboCidades {
    	private $conecta_banco;
    	
    	public function __construct(){
    	$this->conecta_banco= new Conexao();
    	$this->conecta_banco->Conectar();
    	}	
    	public $array = array();
    	public $imoveis_tipo;
    	public $cidade;
    	public $bairro;
    	public $bairro_id2;
    	public $idcidade;	
    	public $negocios;
    	public $qtd;
    	public $bairro_id;
    	public $id_cidade;
    	public $id_tipo;
    	public $id_bairro;
    	public $nome_empresa_2;
    	public $nome_empresa_3;
    	public $nome_empresa_4;
    	public $nome_empresa_5;
    	public $titulo_cadastro;
    	public $creci;
    	public $facebook;
    	public $twitter;
    	public $linha_b;
    	public $sloga;
    	public $site;
    	public $sqlT_1;
    	public $sqlT_2;
    	public $sqlT_3;
    	public $sqlT_4;
    	public $row;
    	public $id='1';
    	function BuscarCidades(){
    	$result=$this->conecta_banco->banco; 
    
    	$pega_cidade=new ComboCidades();=> instancio os ids ou arrays quando são requisitados tipo assim : finalidade ID:1 Tipo ID:3,9 (array)  
    	$pega_cidade->PegarCidadeId();
    	
    
    	$ativo='1';
    
    
    ARRAYS ABAIXO:
    
    	$this->id_negocio=$pega_cidade->id_negocio;
    	$this->id_tipo=$this->id_cidade=$pega_cidade->id_tipo;
    	$this->id_cidade=$pega_cidade->id_cidade;
    
    Acima eu pego os dados do array vindo da pagina combo_cidades.php
    	
    	if($pega_cidade->id_negocio):
    	$negocio_array = explode(",",$pega_cidade->id_negocio);
    	if($pega_cidade->id_tipo):
    	$tipos_array = explode(",", $pega_cidade->id_tipo);
    	if($pega_cidade->id_cidade):
    	$cidades_array = explode(",", $pega_cidade->id_cidade);
    	
    	foreach($negocio_array as $negocio):
    	foreach($tipos_array as $tipos):
    	foreach($cidades_array as $cidades):
    
    	$sqlT_1 = $result->prepare("SELECT i.id,t.tipo_nome,c.cidade,b.bairro,i.ativo FROM imoveis i LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) LEFT JOIN 		
    	cidades c ON (c.id = i.id_cidade)LEFT JOIN bairros b ON (b.id = i.bairro) WHERE i.id_tipo_imovel IN ('".$tipos."') AND i.id_cidade IN ('".$cidades."') AND 	
    	i.ativo=?  ORDER BY i.bairro DESC");
    	$sqlT_1->bind_param('s',$ativo);
    	$sqlT_1->execute();
    	$this->sqlT_1=$sqlT_1->get_result();
    	
    Acima com get_result eu gero os dados que preciso do array  
    	
    	
    abaixo são outras chamadas do sql que vou implementar na solução acima
    
    	$sqlT_2=$result->prepare("SELECT id, bairro,ativo FROM bairros WHERE id AND ativo=? ORDER BY bairro");
    	$sqlT_2->bind_param('s',$ativo);
    	$sqlT_2->execute();
    	$this->sqlT_2=$sqlT_2->get_result();
    	
    	"'%".$negocio."%'";
    	$where = " i.ativo =? ";
    	
    	if( $negocio)  {
    	$where .="AND i.id_negocio_tipo LIKE ?";
    	}if( $tipos )  {
    	$where .=" AND i.id_tipo_imovel IN ('".$tipos."')";
    	}
    	if( $cidades ) {
    	$where .=" AND i.id_cidade IN ('".$cidades."')";
    	}
    	if($this->bairro_id2) {
    	$where .=" AND i.bairro IN ('".$this->bairro_id2."')";
    	}
    	
    	$sqlT_3 = $result->prepare("SELECT i.id,i.ativo,n.tipo,b.bairro,t.tipo_nome,c.cidade,i.id_negocio_tipo, COUNT(b.bairro) AS Qtd FROM  imoveis i 
    	LEFT JOIN negocio_tipo n ON (n.id= i.id_negocio_tipo) 
    	LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) 
    	LEFT JOIN cidades c ON (c.id = i.id_cidade)
    	LEFT JOIN bairros b ON (b.id = i.bairro) 
    	WHERE ".$where." GROUP BY b.bairro HAVING COUNT( b.bairro)  > 0 ORDER BY b.bairro ");
    	//EXECUTA A QUERY  
    	$conta=$sqlT_3->num_rows();
    	$sqlT_3->bind_param('ss',$ativo,$negocio);
    	$sqlT_3->execute();
    	$this->sqlT_3=$sqlT_3->get_result();
    	
    	endforeach;
    	endforeach;
    	endforeach;
    	
    	endif;
    	endif;
    	endif;	
    	
    	}
    	}

     

     

    Abaixo a classe combocidades.php

     

     require_once("tags2.php"); 
        //RECEBE PARÃMETRO 
        class ComboCidades{
        private $conecta_banco;
        
        public function __construct(){
        $this->conecta_banco= new Conexao();
        $this->conecta_banco->Conectar();
        }
        
        public $id_negocio;
        public $id_tipo;
        public $busca_cidade;
        public $id_cidade;
        public function PegarCidadeId(){
        function filter( $str ){
        return addslashes( $str );
        }
        function getPost( $key ){
        return isset( $_GET[ $key ] ) ? filter( $_GET[ $key ] ) : null;
        }
        
        
        $this->id_negocio = getPost('id_negocio');
        $this->id_tipo = getPost('id_tipo');
        $this->id_cidade=getPost('id_cidade');
        
        }
        }
    	 class ExibirBairros extends DadosComboCidades{
        
        public function Mostrar(){
        extract( $_GET, EXTR_OVERWRITE);
        $busca_bairro=new DadosComboCidades();
        $busca_bairro->BuscarCidades(); 
        $busca_bairro->id_cidade;
        if($busca_bairro->id_cidade==0):
        echo "<div class='atencao'></div><div class='atencao_text'>Selecione uma Cidade para pesquisar por Bairros !</div> "."<br />";
        endif;
        
        echo "<div class='sel'></div>"."<br />";
        /* MONTA CRITERIOS DE BUSCA */             
        //QUERY  
        
       
    
        echo '<br /><div class="botao-modal"><button type="button"  class="botao_marcar" title="Todos" id="todos" onclick="marcardesmarcar();">Selecionar Todos</button>	
    	</div>';
    
    
    
        Aqui onde chamo os array já convertidos pelo foreach na classe DadosComboCidades.php
    
        echo'<br /><br /><div style=" font-weight:bold; margin-left:30px;">'.$busca_bairro->imoveis_tipo.' (s) </div>';
        echo'<br /><br /><div style=" font-weight:bold; margin-left:30px;">'.$busca_bairro->cidade.'</div>';
        echo'<div class="form_modal"><form name="form1">'.'<br /><br />';
        
        
          
          
        echo '<input type="checkbox" id="c'.$bairro.'" class="marcar" value="'.$bairro_id.'" name="bairro[]"/><label 
        for="c'.$bairro_id.'"><span></span></label>  '.$bairro.' - '.$cidade.' ('.$qtd.') <br />';
        
        //FECHA IF (row)                                               
        //PRINTA O RESULTADO  
        
    
        
        if($bairro_id):
        echo FALSE;
        else:
        echo "<div class='atencao'></div><div class='atencao_text'>Não existem imóveis para essa Busca !</div> "."<br />";
        
        
        echo'</form></div></b><br />';
        endif;
        }
        }
    Abaixo onde istancio e chamo a classe DadosComboCidades
        $f=new ExibirBairros();
        $f->Mostrar();

    RESUMINDO:

     

    O que acontece é que eu não consigo pegar o array no seu índice, ou seja , por exemplo se o id tipo for ID: 1 rola beleza a busca  e a impressão dos dados mas se eu for buscar 2 informações no mesmo id tipo , assim => ID: array(5,9) , na outra página só consigo pegar o último id em vez de buscar 5,9 só busca o 9, por eu estar acessando o array de outra página , e pelo que entendi , acessando o array de outra página ele só percorre o último em vez do índice.

    Mas se eu jogar todo código dentro da classe ai roda beleza , mas não quero misturar objeto com html (isso é má prática na programação), por isso estou remodelando meu código em POO

    Se alguém tiver uma solução eu agradeço  .  :)


  3. Salve pessoal  tudo bem !

    Depois de muito tempo venho aqui pedir uma ajuda , bem vamos lá...

    Eu tenho uma classe POO e nela pego algumas variáveis que vem como array e uso o implode para enviar através do load do javascript.

    Até aí tranquilo, eu resgato com $_GET  usando o explode, e depois uso implode para separar elas novamente.

    Montei essa rotina toda por se tratar de uma o paginação se reload , bem dinâmica , só que ao passar os parâmetros e as variáveis no bind_param da erro de parâmetros, dizendo que :

     

    Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement

    E entendi que o erro diz que o número de parametros não condiz com o número de variáveis, E AI QUE ENTRA A MINHA DOR DE CABEÇA...

    Mesmo eu usando implode eu consigo separar as variáveis mas dando um var_dump elas  ficam juntas  e a execução do prepare lê como uma única variável.

    Segue o código abaixo:

     

      <?php
    
      class  DadosFiltroBusca  {
        private $conecta_banco;
    
        public function __construct(){
          $this->conecta_banco= new Conexao();
          $this->conecta_banco->Conectar();
        }	
        public $ativo;
        public $negocio ;
        public $tipo;
        public $cidade;
        public $bairro;
        public $id_negocio;
        public $id_tipo;
        public $id_cidade;
        public $id_bairro;
        public $foto;
        public $where;
        public $sqlT_1;
        public $sqlT_2;
        public $total;
        public $current_page;
        public $get_total_rows;
        public $item_per_page;
        public $total_pages;
        public $total_records;
        public $pgst;
        public $page_number;
        public $page_position ;
        public $filtro_dados;
        public $site;
    
        public function BuscarFiltroBusca(){
          $result=$this->conecta_banco->banco; 
    
          $this->item_per_page = 4;
          if(isset($_POST["page"])){
            $this->page_number =(isset($_POST['page'])) ? (int)$_POST['page'] : 1;
            if(!is_numeric($this->page_number)){die('Página inválida!');} //incase of invalid page number
          }else{
            $this->page_number = 1;
            //if there's no page number, set it to 1
          }  
    
          $negocio   = $_GET['negocio'];
    
          $this->id_tipo= explode(",",$_GET['tipo']);		
          $this->id_cidade=explode(",",$_GET['cidade']);
          $this->id_bairro=explode(",",$_GET['bairro']);
    
    
    
    
    
          
    
    
    
    
          $idi=implode('', $this->id_tipo);
    
    
    
    
    
          echo "<br /><br />";
    
          $in=(is_array($this->id_tipo) ? count($this->id_tipo):0);
    
          $id_tipo = implode(',', array_fill(0, $in, '?'));
          
          echo " :: " . $id_tipo_2 =join('', array_fill(0, 1, $idi));
          
          echo " :: ".$types =str_repeat('s',$in);
    
          echo "<br /> VAR:: ".$tipo =str_repeat(''.$id_tipo_2.'',1);  
          
          var_dump ($tipo );
    
          $idi1='5';
          $idi2='11';
    
          foreach ($this->id_cidade as $key=> $id_cidade):
          foreach ($this->id_bairro as $key=> $id_bairro):
    
    
          $ativo='1';
          "%".$negocio."%";
          $id_tipo;  
          $id_cidade;
          $id_bairro;
    
          echo "<br /><br />RESULTADO :: ". $t='ss'.$types.'ss',$ativo,$negocio,$tipo ,$id_cidade,$id_bairro."<br /><br />";
    
          $where = " i.ativo =? ";
          if( $negocio)  {
            $where .="AND i.id_negocio_tipo LIKE ?";
          }if( $id_tipo )  {
            $where .=" AND i.id_tipo_imovel IN ($id_tipo)";
          }
          if( $id_cidade ) {
            $where .=" AND i.id_cidade=?";
          }
          if($id_bairro) {
            $where .=" AND i.bairro=?";
          }
    
          $sqlT_1 =$result->prepare("SELECT i.*, t.tipo_nome, b.bairro, n.tipo, c.cidade FROM imoveis
          i LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo)
          LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel)
          LEFT JOIN cidades c ON (c.id = i.id_cidade)
          LEFT JOIN bairros b ON (b.id = i.bairro)
          WHERE ".$where."");
    
          $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo ,$id_cidade,$id_bairro);
          $sqlT_1->execute();
          $this->sqlT_1 = $sqlT_1->get_result();
    
          $this->get_total_rows+=$this->sqlT_1->num_rows;
          if($this->get_total_rows >0 ){
            $this->total_pages = ceil($this->get_total_rows / $this->item_per_page);
          }
          $this->sqlT_1->num_rows;
          //break records into pages
    
          //get starting position to fetch the records
          if($this->get_total_rows > 0 ){
            $this->page_position = (($this->page_number * $this->item_per_page) -$this->item_per_page);
            $this->pgst = ceil($this->get_total_rows  / $this->item_per_page);
          }
          $sqlT_1->close();
    
          endforeach;
          endforeach;
    
    
    
    
          $sqlT_2 =$result->prepare("SELECT i.id, i.valor,i.locacao, i.foto_exibicao,i.latitude,i.longitude, i.quartos, i.garagem,i.mapa, i.codigo, t.tipo_nome, n.tipo AS    negocio, c.cidade, c.uf, b.bairro FROM imoveis i
          LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo)
          LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel)
          LEFT JOIN cidades c ON (c.id = i.id_cidade)
          LEFT JOIN bairros b ON (b.id = i.bairro)
          WHERE ".$where." ORDER BY i.id DESC LIMIT ?,?");
          $sqlT_2->bind_param('sssssss',$ativo,$negocio,$idi,$id_cidade,$id_bairro,$this->page_position,$this->item_per_page);
          $sqlT_2->execute();
          $this->sqlT_2=$sqlT_2->get_result();
    
    
    
    
        }
      }
    
      ?>

    Vejam no código que existem 2 consultas, um select é para montar a páginação sem reflesh e a outra é para buscar os dados do filtro de busca , e para deixar mais claro, se eu colocar no lugar cláusula IN em vez de IN (?) colocar IN ($variavel ) que já foi separada com o implode ela busca perfeitamente as informações , exemplo abaixo:

     

    $where = " i.ativo =? ";
        if( $negocio)  {
        $where .="AND i.id_negocio_tipo LIKE ?";
        }if( $id_tipo )  {
        $where .=" AND i.id_tipo_imovel IN (?)"; AQUI É AONDE TEM O ARRAY, E AS OUTRAS ESTÃO SEM ARRAYS PARA TESTAR APENAS ESSA VARIÁVEL
        }
        if( $id_cidade ) {
        $where .=" AND i.id_cidade=?";
        }
        if($id_bairro) {
        $where .=" AND i.bairro=?";
        }
    

    Acima da aquele erro de; Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement

    Mas agora logo abaixo vai de boa e forma a paginação e trás os valores:

     

    $where = " i.ativo =? ";
        if( $negocio)  {
        $where .="AND i.id_negocio_tipo LIKE ?";
        }if( $id_tipo )  {
        $where .=" AND i.id_tipo_imovel IN ($id_tipo)";
        }
        if( $id_cidade ) {
        $where .=" AND i.id_cidade=$id_cidade";
        }
        if($id_bairro) {
        $where .=" AND i.bairro=$id_bairro";
        }

     

    E vi que o problema esta aqui abaixo:

    $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,AQUI É A VARIÁVEL COM ARRAY -> $tipo ,$id_cidade,$id_bairro);

    Notem que esta variável dentro dos parâmetros ($types) ela trás o número de parâmetros conforme o critério de busca do filtro de busca, E este parametro como variável eu pego com o str_repeat

    E  se eu montar as variáveis manualmente tipo > $tipo1=15'; e $tipo2='11'; e jogar lá no bind param ela chama de boa tipo assim :

     

    $tipo1='15'; 
    $tipo2='11'
    
     $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo1,$tipo2 ,$id_cidade,$id_bairro);

    se eu fizer desta forma chama perfeitamente, e vi que o problema é na hora de separar as variáveis do array.

    Já usei serialize, join, json_decode e nada .

    Se alguém souber de como contornar agradeço. E desculpe pela imensa explicação , mas é para entederem melhor :)

    Obrigado !

     


  4. Lucas eu só postei para que outros com o mesmo problema possa pegar o código e ver aonde esta o erro e aprender sob o porque do erro, algumas coisas eu ainda não tenho completo entendimento, por isso sempre pergunto, sou um cara insistente e gosto de fazer na raça , não gosto de pegar código pronto, e Gabriel Herming, eu já tinha experimentado este código só que deu um erro de SMTP na linha 1196, dizia que smtp não foi encontrado, e coloquei à ele a classe do smtp atualizada do mesmo link que vc passou , vou dar uma testada nesse código atualizado.


  5. Cara consegui achar o erro, e fiz uns testes aqui e o email chegou sem erros, percebi que tinha que substituindo este trecho do código * "'='.sprintf('%02X', ord('\\1'))" * por isto * function($found){ return strtolower($found[1]);} * você tinha postado aqui, e comecei a entender um pouco sobre a função anônima, que ao criar ela dentro da função preg_replace_callback, e não desse continuidade no restante do código e não gerando erro Warning, acho que entendi errado, não deve ser isso, mas eu consegui resolver mas não entendi direito o porque deste erro, então Lucas você ou outra pessoa poderia me explicar melhr esta função..

     

    Irei deixar aqui a classe phpmailer *class.phpmailer.php* aqui porque tenho certeza que muitos desenvolvedores quando começar a atualizar sua plataformas a partir do php 5.5 irá surgir estes erros segue abaixo o phpmailer corrigido, minha hospedagem é a chata da uol-host e funcionou sem erros até agora:

    <?php
    /*~ class.phpmailer.php
    .---------------------------------------------------------------------------.
    |  Classe alterada por mim Jeovane Carvalho
       Email: street-games@hotmail.com
       Rodando no a partir do PHP 5.5 
       
    
       Software: PHPMailer - PHP email class                                    |
    |   Version: 5.1                                                            |
    |   Contact: via sourceforge.net support pages (also www.worxware.com)      |
    |      Info: http://phpmailer.sourceforge.net                               |
    |   Support: http://sourceforge.net/projects/phpmailer/                     |
    | ------------------------------------------------------------------------- |
    |     Admin: Andy Prevost (project admininistrator)                         |
    |   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
    |          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
    |   Founder: Brent R. Matzelle (original founder)                           |
    | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved.               |
    | Copyright (c) 2001-2003, Brent R. Matzelle                                |
    | ------------------------------------------------------------------------- |
    |   License: Distributed under the Lesser General Public License (LGPL)     |
    |            http://www.gnu.org/copyleft/lesser.html                        |
    | This program is distributed in the hope that it will be useful - WITHOUT  |
    | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
    | FITNESS FOR A PARTICULAR PURPOSE.                                         |
    | ------------------------------------------------------------------------- |
    | We offer a number of paid services (www.worxware.com):                    |
    | - Web Hosting on highly optimized fast and secure servers                 |
    | - Technology Consulting                                                   |
    | - Oursourcing (highly qualified programmers and graphic designers)        |
    '---------------------------------------------------------------------------'
    */
    
    /**
     * PHPMailer - PHP email transport class
     * NOTE: Requires PHP version 5 or later
     * @package PHPMailer
     * @author Andy Prevost
     * @author Marcus Bointon
     * @copyright 2004 - 2009 Andy Prevost
     * @version $Id: class.phpmailer.php 447 2009-05-25 01:36:38Z codeworxtech $
     * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
     */
    
    if (version_compare(PHP_VERSION, '5.0.0', '<') ) exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\n");
    
    class PHPMailer {
    
      /////////////////////////////////////////////////
      // PROPERTIES, PUBLIC
      /////////////////////////////////////////////////
    
      /**
       * Email priority (1 = High, 3 = Normal, 5 = low).
       * @var int
       */
      public $Priority          = 3;
    
      /**
       * Sets the CharSet of the message.
       * @var string
       */
      public $CharSet           = 'utf-8';
    
      /**
       * Sets the Content-type of the message.
       * @var string
       */
      public $ContentType       = 'text/plain';
    
      /**
       * Sets the Encoding of the message. Options for this are
       *  "8bit", "7bit", "binary", "base64", and "quoted-printable".
       * @var string
       */
      public $Encoding          = '8bit';
    
      /**
       * Holds the most recent mailer error message.
       * @var string
       */
      public $ErrorInfo         = '';
    
      /**
       * Sets the From email address for the message.
       * @var string
       */
      public $From              = 'root@localhost';
    
      /**
       * Sets the From name of the message.
       * @var string
       */
      public $FromName          = 'Root User';
    
      /**
       * Sets the Sender email (Return-Path) of the message.  If not empty,
       * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
       * @var string
       */
      public $Sender            = '';
    
      /**
       * Sets the Subject of the message.
       * @var string
       */
      public $Subject           = '';
    
      /**
       * Sets the Body of the message.  This can be either an HTML or text body.
       * If HTML then run IsHTML(true).
       * @var string
       */
      public $Body              = '';
    
      /**
       * Sets the text-only body of the message.  This automatically sets the
       * email to multipart/alternative.  This body can be read by mail
       * clients that do not have HTML email capability such as mutt. Clients
       * that can read HTML will view the normal Body.
       * @var string
       */
      public $AltBody           = '';
    
      /**
       * Sets word wrapping on the body of the message to a given number of
       * characters.
       * @var int
       */
      public $WordWrap          = 0;
    
      /**
       * Method to send mail: ("mail", "sendmail", or "smtp").
       * @var string
       */
      public $Mailer            = 'mail';
    
      /**
       * Sets the path of the sendmail program.
       * @var string
       */
      public $Sendmail          = '/usr/sbin/sendmail';
    
      /**
       * Path to PHPMailer plugins.  Useful if the SMTP class
       * is in a different directory than the PHP include path.
       * @var string
       */
      public $PluginDir         = '';
    
      /**
       * Sets the email address that a reading confirmation will be sent.
       * @var string
       */
      public $ConfirmReadingTo  = '';
    
      /**
       * Sets the hostname to use in Message-Id and Received headers
       * and as default HELO string. If empty, the value returned
       * by SERVER_NAME is used or 'localhost.localdomain'.
       * @var string
       */
      public $Hostname          = '';
    
      /**
       * Sets the message ID to be used in the Message-Id header.
       * If empty, a unique id will be generated.
       * @var string
       */
      public $MessageID         = '';
    
      /////////////////////////////////////////////////
      // PROPERTIES FOR SMTP
      /////////////////////////////////////////////////
    
      /**
       * Sets the SMTP hosts.  All hosts must be separated by a
       * semicolon.  You can also specify a different port
       * for each host by using this format: [hostname:port]
       * (e.g. "smtp1.example.com:25;smtp2.example.com").
       * Hosts will be tried in order.
       * @var string
       */
      public $Host          = 'localhost';
    
      /**
       * Sets the default SMTP server port.
       * @var int
       */
      public $Port          = 25;
    
      /**
       * Sets the SMTP HELO of the message (Default is $Hostname).
       * @var string
       */
      public $Helo          = '';
    
      /**
       * Sets connection prefix.
       * Options are "", "ssl" or "tls"
       * @var string
       */
      public $SMTPSecure    = '';
    
      /**
       * Sets SMTP authentication. Utilizes the Username and Password variables.
       * @var bool
       */
      public $SMTPAuth      = false;
    
      /**
       * Sets SMTP username.
       * @var string
       */
      public $Username      = '';
    
      /**
       * Sets SMTP password.
       * @var string
       */
      public $Password      = '';
    
      /**
       * Sets the SMTP server timeout in seconds.
       * This function will not work with the win32 version.
       * @var int
       */
      public $Timeout       = 10;
    
      /**
       * Sets SMTP class debugging on or off.
       * @var bool
       */
      public $SMTPDebug     = false;
    
      /**
       * Prevents the SMTP connection from being closed after each mail
       * sending.  If this is set to true then to close the connection
       * requires an explicit call to SmtpClose().
       * @var bool
       */
      public $SMTPKeepAlive = false;
    
      /**
       * Provides the ability to have the TO field process individual
       * emails, instead of sending to entire TO addresses
       * @var bool
       */
      public $SingleTo      = false;
    
       /**
       * If SingleTo is true, this provides the array to hold the email addresses
       * @var bool
       */
      public $SingleToArray = array();
    
     /**
       * Provides the ability to change the line ending
       * @var string
       */
      public $LE              = "\n";
    
      /**
       * Used with DKIM DNS Resource Record
       * @var string
       */
      public $DKIM_selector   = 'phpmailer';
    
      /**
       * Used with DKIM DNS Resource Record
       * optional, in format of email address 'you@yourdomain.com'
       * @var string
       */
      public $DKIM_identity   = '';
    
      /**
       * Used with DKIM DNS Resource Record
       * optional, in format of email address 'you@yourdomain.com'
       * @var string
       */
      public $DKIM_domain     = '';
    
      /**
       * Used with DKIM DNS Resource Record
       * optional, in format of email address 'you@yourdomain.com'
       * @var string
       */
      public $DKIM_private    = '';
    
      /**
       * Callback Action function name
       * the function that handles the result of the send email action. Parameters:
       *   bool    $result        result of the send action
       *   string  $to            email address of the recipient
       *   string  $cc            cc email addresses
       *   string  $bcc           bcc email addresses
       *   string  $subject       the subject
       *   string  $body          the email body
       * @var string
       */
      public $action_function = ''; //'callbackAction';
    
      /**
       * Sets the PHPMailer Version number
       * @var string
       */
      public $Version         = '5.1';
    
      /////////////////////////////////////////////////
      // PROPERTIES, PRIVATE AND PROTECTED
      /////////////////////////////////////////////////
    
      private   $smtp           = NULL;
      private   $to             = array();
      private   $cc             = array();
      private   $bcc            = array();
      private   $ReplyTo        = array();
      private   $all_recipients = array();
      private   $attachment     = array();
      private   $CustomHeader   = array();
      private   $message_type   = '';
      private   $boundary       = array();
      protected $language       = array();
      private   $error_count    = 0;
      private   $sign_cert_file = "";
      private   $sign_key_file  = "";
      private   $sign_key_pass  = "";
      private   $exceptions     = false;
    
      /////////////////////////////////////////////////
      // CONSTANTS
      /////////////////////////////////////////////////
    
      const STOP_MESSAGE  = 0; // message only, continue processing
      const STOP_CONTINUE = 1; // message?, likely ok to continue processing
      const STOP_CRITICAL = 2; // message, plus full stop, critical error reached
    
      /////////////////////////////////////////////////
      // METHODS, VARIABLES
      /////////////////////////////////////////////////
    
      /**
       * Constructor
       * @param boolean $exceptions Should we throw external exceptions?
       */
      public function __construct($exceptions = false) {
        $this->exceptions = ($exceptions == true);
      }
    
      /**
       * Sets message type to HTML.
       * @param bool $ishtml
       * @return void
       */
      public function IsHTML($ishtml = true) {
        if ($ishtml) {
          $this->ContentType = 'text/html';
        } else {
          $this->ContentType = 'text/plain';
        }
      }
    
      /**
       * Sets Mailer to send message using SMTP.
       * @return void
       */
      public function IsSMTP() {
        $this->Mailer = 'smtp';
      }
    
      /**
       * Sets Mailer to send message using PHP mail() function.
       * @return void
       */
      public function IsMail() {
        $this->Mailer = 'mail';
      }
    
      /**
       * Sets Mailer to send message using the $Sendmail program.
       * @return void
       */
      public function IsSendmail() {
        if (!stristr(ini_get('sendmail_path'), 'sendmail')) {
          $this->Sendmail = '/var/qmail/bin/sendmail';
        }
        $this->Mailer = 'sendmail';
      }
    
      /**
       * Sets Mailer to send message using the qmail MTA.
       * @return void
       */
      public function IsQmail() {
        if (stristr(ini_get('sendmail_path'), 'qmail')) {
          $this->Sendmail = '/var/qmail/bin/sendmail';
        }
        $this->Mailer = 'sendmail';
      }
    
      /////////////////////////////////////////////////
      // METHODS, RECIPIENTS
      /////////////////////////////////////////////////
    
      /**
       * Adds a "To" address.
       * @param string $address
       * @param string $name
       * @return boolean true on success, false if address already used
       */
      public function AddAddress($address, $name = '') {
        return $this->AddAnAddress('to', $address, $name);
      }
    
      /**
       * Adds a "Cc" address.
       * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
       * @param string $address
       * @param string $name
       * @return boolean true on success, false if address already used
       */
      public function AddCC($address, $name = '') {
        return $this->AddAnAddress('cc', $address, $name);
      }
    
      /**
       * Adds a "Bcc" address.
       * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
       * @param string $address
       * @param string $name
       * @return boolean true on success, false if address already used
       */
      public function AddBCC($address, $name = '') {
        return $this->AddAnAddress('bcc', $address, $name);
      }
    
      /**
       * Adds a "Reply-to" address.
       * @param string $address
       * @param string $name
       * @return boolean
       */
      public function AddReplyTo($address, $name = '') {
        return $this->AddAnAddress('ReplyTo', $address, $name);
      }
    
      /**
       * Adds an address to one of the recipient arrays
       * Addresses that have been added already return false, but do not throw exceptions
       * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
       * @param string $address The email address to send to
       * @param string $name
       * @return boolean true on success, false if address already used or invalid in some way
       * @access private
       */
      private function AddAnAddress($kind, $address, $name = '') {
        if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) {
          echo 'Invalid recipient array: ' . kind;
          return false;
        }
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (!self::ValidateAddress($address)) {
          $this->SetError($this->Lang('invalid_address').': '. $address);
          if ($this->exceptions) {
            throw new phpmailerException($this->Lang('invalid_address').': '.$address);
          }
          echo $this->Lang('invalid_address').': '.$address;
          return false;
        }
        if ($kind != 'ReplyTo') {
          if (!isset($this->all_recipients[strtolower($address)])) {
            array_push($this->$kind, array($address, $name));
            $this->all_recipients[strtolower($address)] = true;
            return true;
          }
        } else {
          if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
            $this->ReplyTo[strtolower($address)] = array($address, $name);
          return true;
        }
      }
      return false;
    }
    
    /**
     * Set the From and FromName properties
     * @param string $address
     * @param string $name
     * @return boolean
     */
      public function SetFrom($address, $name = '',$auto=1) {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (!self::ValidateAddress($address)) {
          $this->SetError($this->Lang('invalid_address').': '. $address);
          if ($this->exceptions) {
            throw new phpmailerException($this->Lang('invalid_address').': '.$address);
          }
          echo $this->Lang('invalid_address').': '.$address;
          return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
          if (empty($this->ReplyTo)) {
            $this->AddAnAddress('ReplyTo', $address, $name);
          }
          if (empty($this->Sender)) {
            $this->Sender = $address;
          }
        }
        return true;
      }
    
      /**
       * Check that a string looks roughly like an email address should
       * Static so it can be used without instantiation
       * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator
       * Conforms approximately to RFC2822
       * @link http://www.hexillion.com/samples/#Regex Original pattern found here
       * @param string $address The email address to check
       * @return boolean
       * @static
       * @access public
       */
      public static function ValidateAddress($address) {
        if (function_exists('filter_var')) { //Introduced in PHP 5.2
          if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
            return false;
          } else {
            return true;
          }
        } else {
          return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
        }
      }
    
      /////////////////////////////////////////////////
      // METHODS, MAIL SENDING
      /////////////////////////////////////////////////
    
      /**
       * Creates message and assigns Mailer. If the message is
       * not sent successfully then it returns false.  Use the ErrorInfo
       * variable to view description of the error.
       * @return bool
       */
      public function Send() {
        try {
          if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
            throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL);
          }
    
          // Set whether the message is multipart/alternative
          if(!empty($this->AltBody)) {
            $this->ContentType = 'multipart/alternative';
          }
    
          $this->error_count = 0; // reset errors
          $this->SetMessageType();
          $header = $this->CreateHeader();
          $body = $this->CreateBody();
    
          if (empty($this->Body)) {
            throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL);
          }
    
          // digitally sign with DKIM if enabled
          if ($this->DKIM_domain && $this->DKIM_private) {
            $header_dkim = $this->DKIM_Add($header,$this->Subject,$body);
            $header = str_replace("\r\n","\n",$header_dkim) . $header;
          }
    
          // Choose the mailer and send through it
          switch($this->Mailer) {
            case 'sendmail':
              return $this->SendmailSend($header, $body);
            case 'smtp':
              return $this->SmtpSend($header, $body);
            default:
              return $this->MailSend($header, $body);
          }
    
        } catch (phpmailerException $e) {
          $this->SetError($e->getMessage());
          if ($this->exceptions) {
            throw $e;
          }
          echo $e->getMessage()."\n";
          return false;
        }
      }
    
      /**
       * Sends mail using the $Sendmail program.
       * @param string $header The message headers
       * @param string $body The message body
       * @access protected
       * @return bool
       */
      protected function SendmailSend($header, $body) {
        if ($this->Sender != '') {
          $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
        } else {
          $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
        }
        if ($this->SingleTo === true) {
          foreach ($this->SingleToArray as $key => $val) {
            if(!@$mail = popen($sendmail, 'w')) {
              throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, "To: " . $val . "\n");
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            // implement call back function if it exists
            $isSent = ($result == 0) ? 1 : 0;
            $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
            if($result != 0) {
              throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
          }
        } else {
          if(!@$mail = popen($sendmail, 'w')) {
            throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
          }
          fputs($mail, $header);
          fputs($mail, $body);
          $result = pclose($mail);
          // implement call back function if it exists
          $isSent = ($result == 0) ? 1 : 0;
          $this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body);
          if($result != 0) {
            throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
          }
        }
        return true;
      }
    
      /**
       * Sends mail using the PHP mail() function.
       * @param string $header The message headers
       * @param string $body The message body
       * @access protected
       * @return bool
       */
      protected function MailSend($header, $body) {
        $toArr = array();
        foreach($this->to as $t) {
          $toArr[] = $this->AddrFormat($t);
        }
        $to = implode(', ', $toArr);
    
        $params = sprintf("-oi -f %s", $this->Sender);
        if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) {
          $old_from = ini_get('sendmail_from');
          ini_set('sendmail_from', $this->Sender);
          if ($this->SingleTo === true && count($toArr) > 1) {
            foreach ($toArr as $key => $val) {
              $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
              // implement call back function if it exists
              $isSent = ($rt == 1) ? 1 : 0;
              $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
            }
          } else {
            $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
            // implement call back function if it exists
            $isSent = ($rt == 1) ? 1 : 0;
            $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);
          }
        } else {
          if ($this->SingleTo === true && count($toArr) > 1) {
            foreach ($toArr as $key => $val) {
              $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
              // implement call back function if it exists
              $isSent = ($rt == 1) ? 1 : 0;
              $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
            }
          } else {
            $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
            // implement call back function if it exists
            $isSent = ($rt == 1) ? 1 : 0;
            $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);
          }
        }
        if (isset($old_from)) {
          ini_set('sendmail_from', $old_from);
        }
        if(!$rt) {
          throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
      }
    
      /**
       * Sends mail via SMTP using PhpSMTP
       * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
       * @param string $header The message headers
       * @param string $body The message body
       * @uses SMTP
       * @access protected
       * @return bool
       */
      protected function SmtpSend($header, $body) {
        require_once $this->PluginDir . 'class.smtp.php';
        $bad_rcpt = array();
    
        if(!$this->SmtpConnect()) {
          throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
        if(!$this->smtp->Mail($smtp_from)) {
          throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL);
        }
    
        // Attempt to send attach all recipients
        foreach($this->to as $to) {
          if (!$this->smtp->Recipient($to[0])) {
            $bad_rcpt[] = $to[0];
            // implement call back function if it exists
            $isSent = 0;
            $this->doCallback($isSent,$to[0],'','',$this->Subject,$body);
          } else {
            // implement call back function if it exists
            $isSent = 1;
            $this->doCallback($isSent,$to[0],'','',$this->Subject,$body);
          }
        }
        foreach($this->cc as $cc) {
          if (!$this->smtp->Recipient($cc[0])) {
            $bad_rcpt[] = $cc[0];
            // implement call back function if it exists
            $isSent = 0;
            $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body);
          } else {
            // implement call back function if it exists
            $isSent = 1;
            $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body);
          }
        }
        foreach($this->bcc as $bcc) {
          if (!$this->smtp->Recipient($bcc[0])) {
            $bad_rcpt[] = $bcc[0];
            // implement call back function if it exists
            $isSent = 0;
            $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);
          } else {
            // implement call back function if it exists
            $isSent = 1;
            $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);
          }
        }
    
    
        if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses
          $badaddresses = implode(', ', $bad_rcpt);
          throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses);
        }
        if(!$this->smtp->Data($header . $body)) {
          throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if($this->SMTPKeepAlive == true) {
          $this->smtp->Reset();
        }
        return true;
      }
    
      /**
       * Initiates a connection to an SMTP server.
       * Returns false if the operation failed.
       * @uses SMTP
       * @access public
       * @return bool
       */
      public function SmtpConnect() {
        if(is_null($this->smtp)) {
          $this->smtp = new SMTP();
        }
    
        $this->smtp->do_debug = $this->SMTPDebug;
        $hosts = explode(';', $this->Host);
        $index = 0;
        $connection = $this->smtp->Connected();
    
        // Retry while there is no connection
        try {
          while($index < count($hosts) && !$connection) {
            $hostinfo = array();
            if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) {
              $host = $hostinfo[1];
              $port = $hostinfo[2];
            } else {
              $host = $hosts[$index];
              $port = $this->Port;
            }
    
            $tls = ($this->SMTPSecure == 'tls');
            $ssl = ($this->SMTPSecure == 'ssl');
    
            if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) {
    
              $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname());
              $this->smtp->Hello($hello);
    
              if ($tls) {
                if (!$this->smtp->StartTLS()) {
                  throw new phpmailerException($this->Lang('tls'));
                }
    
                //We must resend HELO after tls negotiation
                $this->smtp->Hello($hello);
              }
    
              $connection = true;
              if ($this->SMTPAuth) {
                if (!$this->smtp->Authenticate($this->Username, $this->Password)) {
                  throw new phpmailerException($this->Lang('authenticate'));
                }
              }
            }
            $index++;
            if (!$connection) {
              throw new phpmailerException($this->Lang('connect_host'));
            }
          }
        } catch (phpmailerException $e) {
          $this->smtp->Reset();
          throw $e;
        }
        return true;
      }
    
      /**
       * Closes the active SMTP session if one exists.
       * @return void
       */
      public function SmtpClose() {
        if(!is_null($this->smtp)) {
          if($this->smtp->Connected()) {
            $this->smtp->Quit();
            $this->smtp->Close();
          }
        }
      }
    
      /**
      * Sets the language for all class error messages.
      * Returns false if it cannot load the language file.  The default language is English.
      * @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br")
      * @param string $lang_path Path to the language file directory
      * @access public
      */
      function SetLanguage($langcode = 'en', $lang_path = 'language/') {
        //Define full set of translatable strings
        $PHPMAILER_LANG = array(
          'provide_address' => 'You must provide at least one recipient email address.',
          'mailer_not_supported' => ' mailer is not supported.',
          'execute' => 'Could not execute: ',
          'instantiate' => 'Could not instantiate mail function.',
          'authenticate' => 'SMTP Error: Could not authenticate.',
          'from_failed' => 'The following From address failed: ',
          'recipients_failed' => 'SMTP Error: The following recipients failed: ',
          'data_not_accepted' => 'SMTP Error: Data not accepted.',
          'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
          'file_access' => 'Could not access file: ',
          'file_open' => 'File Error: Could not open file: ',
          'encoding' => 'Unknown encoding: ',
          'signing' => 'Signing Error: ',
          'smtp_error' => 'SMTP server error: ',
          'empty_message' => 'Message body empty',
          'invalid_address' => 'Invalid address',
          'variable_set' => 'Cannot set or reset variable: '
        );
        //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"!
        $l = true;
        if ($langcode != 'en') { //There is no English translation file
          $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php';
        }
        $this->language = $PHPMAILER_LANG;
        return ($l == true); //Returns false if language not found
      }
    
      /**
      * Return the current array of language strings
      * @return array
      */
      public function GetTranslations() {
        return $this->language;
      }
    
      /////////////////////////////////////////////////
      // METHODS, MESSAGE CREATION
      /////////////////////////////////////////////////
    
      /**
       * Creates recipient headers.
       * @access public
       * @return string
       */
      public function AddrAppend($type, $addr) {
        $addr_str = $type . ': ';
        $addresses = array();
        foreach ($addr as $a) {
          $addresses[] = $this->AddrFormat($a);
        }
        $addr_str .= implode(', ', $addresses);
        $addr_str .= $this->LE;
    
        return $addr_str;
      }
    
      /**
       * Formats an address correctly.
       * @access public
       * @return string
       */
      public function AddrFormat($addr) {
        if (empty($addr[1])) {
          return $this->SecureHeader($addr[0]);
        } else {
          return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
        }
      }
    
      /**
       * Wraps message for use with mailers that do not
       * automatically perform wrapping and for quoted-printable.
       * Original written by philippe.
       * @param string $message The message to wrap
       * @param integer $length The line length to wrap to
       * @param boolean $qp_mode Whether to run in Quoted-Printable mode
       * @access public
       * @return string
       */
      public function WrapText($message, $length, $qp_mode = false) {
        $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == "utf-8");
    
        $message = $this->FixEOL($message);
        if (substr($message, -1) == $this->LE) {
          $message = substr($message, 0, -1);
        }
    
        $line = explode($this->LE, $message);
        $message = '';
        for ($i=0 ;$i < count($line); $i++) {
          $line_part = explode(' ', $line[$i]);
          $buf = '';
          for ($e = 0; $e<count($line_part); $e++) {
            $word = $line_part[$e];
            if ($qp_mode and (strlen($word) > $length)) {
              $space_left = $length - strlen($buf) - 1;
              if ($e != 0) {
                if ($space_left > 20) {
                  $len = $space_left;
                  if ($is_utf8) {
                    $len = $this->UTF8CharBoundary($word, $len);
                  } elseif (substr($word, $len - 1, 1) == "=") {
                    $len--;
                  } elseif (substr($word, $len - 2, 1) == "=") {
                    $len -= 2;
                  }
                  $part = substr($word, 0, $len);
                  $word = substr($word, $len);
                  $buf .= ' ' . $part;
                  $message .= $buf . sprintf("=%s", $this->LE);
                } else {
                  $message .= $buf . $soft_break;
                }
                $buf = '';
              }
              while (strlen($word) > 0) {
                $len = $length;
                if ($is_utf8) {
                  $len = $this->UTF8CharBoundary($word, $len);
                } elseif (substr($word, $len - 1, 1) == "=") {
                  $len--;
                } elseif (substr($word, $len - 2, 1) == "=") {
                  $len -= 2;
                }
                $part = substr($word, 0, $len);
                $word = substr($word, $len);
    
                if (strlen($word) > 0) {
                  $message .= $part . sprintf("=%s", $this->LE);
                } else {
                  $buf = $part;
                }
              }
            } else {
              $buf_o = $buf;
              $buf .= ($e == 0) ? $word : (' ' . $word);
    
              if (strlen($buf) > $length and $buf_o != '') {
                $message .= $buf_o . $soft_break;
                $buf = $word;
              }
            }
          }
          $message .= $buf . $this->LE;
        }
    
        return $message;
      }
    
      /**
       * Finds last character boundary prior to maxLength in a utf-8
       * quoted (printable) encoded string.
       * Original written by Colin Brown.
       * @access public
       * @param string $encodedText utf-8 QP text
       * @param int    $maxLength   find last character boundary prior to this length
       * @return int
       */
      public function UTF8CharBoundary($encodedText, $maxLength) {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
          $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
          $encodedCharPos = strpos($lastChunk, "=");
          if ($encodedCharPos !== false) {
            // Found start of encoded character byte within $lookBack block.
            // Check the encoded byte value (the 2 chars after the '=')
            $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
            $dec = hexdec($hex);
            if ($dec < 128) { // Single byte character.
              // If the encoded char was found at pos 0, it will fit
              // otherwise reduce maxLength to start of the encoded char
              $maxLength = ($encodedCharPos == 0) ? $maxLength :
              $maxLength - ($lookBack - $encodedCharPos);
              $foundSplitPos = true;
            } elseif ($dec >= 192) { // First byte of a multi byte character
              // Reduce maxLength to split at start of character
              $maxLength = $maxLength - ($lookBack - $encodedCharPos);
              $foundSplitPos = true;
            } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
              $lookBack += 3;
            }
          } else {
            // No encoded character found
            $foundSplitPos = true;
          }
        }
        return $maxLength;
      }
    
    
      /**
       * Set the body wrapping.
       * @access public
       * @return void
       */
      public function SetWordWrap() {
        if($this->WordWrap < 1) {
          return;
        }
    
        switch($this->message_type) {
          case 'alt':
          case 'alt_attachments':
            $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
            break;
          default:
            $this->Body = $this->WrapText($this->Body, $this->WordWrap);
            break;
        }
      }
    
      /**
       * Assembles message header.
       * @access public
       * @return string The assembled header
       */
      public function CreateHeader() {
        $result = '';
    
        // Set the boundaries
        $uniq_id = md5(uniqid(time()));
        $this->boundary[1] = 'b1_' . $uniq_id;
        $this->boundary[2] = 'b2_' . $uniq_id;
    
        $result .= $this->HeaderLine('Date', self::RFCDate());
        if($this->Sender == '') {
          $result .= $this->HeaderLine('Return-Path', trim($this->From));
        } else {
          $result .= $this->HeaderLine('Return-Path', trim($this->Sender));
        }
    
        // To be created automatically by mail()
        if($this->Mailer != 'mail') {
          if ($this->SingleTo === true) {
            foreach($this->to as $t) {
              $this->SingleToArray[] = $this->AddrFormat($t);
            }
          } else {
            if(count($this->to) > 0) {
              $result .= $this->AddrAppend('To', $this->to);
            } elseif (count($this->cc) == 0) {
              $result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
            }
          }
        }
    
        $from = array();
        $from[0][0] = trim($this->From);
        $from[0][1] = $this->FromName;
        $result .= $this->AddrAppend('From', $from);
    
        // sendmail and mail() extract Cc from the header before sending
        if(count($this->cc) > 0) {
          $result .= $this->AddrAppend('Cc', $this->cc);
        }
    
        // sendmail and mail() extract Bcc from the header before sending
        if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
          $result .= $this->AddrAppend('Bcc', $this->bcc);
        }
    
        if(count($this->ReplyTo) > 0) {
          $result .= $this->AddrAppend('Reply-to', $this->ReplyTo);
        }
    
        // mail() sets the subject itself
        if($this->Mailer != 'mail') {
          $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
        }
    
        if($this->MessageID != '') {
          $result .= $this->HeaderLine('Message-ID',$this->MessageID);
        } else {
          $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
        }
        $result .= $this->HeaderLine('X-Priority', $this->Priority);
        $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)');
    
        if($this->ConfirmReadingTo != '') {
          $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
        }
    
        // Add custom headers
        for($index = 0; $index < count($this->CustomHeader); $index++) {
          $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
        }
        if (!$this->sign_key_file) {
          $result .= $this->HeaderLine('MIME-Version', '1.0');
          $result .= $this->GetMailMIME();
        }
    
        return $result;
      }
    
      /**
       * Returns the message MIME.
       * @access public
       * @return string
       */
      public function GetMailMIME() {
        $result = '';
        switch($this->message_type) {
          case 'plain':
            $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
            $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
            break;
          case 'attachments':
          case 'alt_attachments':
            if($this->InlineImageExists()){
              $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);
            } else {
              $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
              $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
            }
            break;
          case 'alt':
            $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
            $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
            break;
        }
    
        if($this->Mailer != 'mail') {
          $result .= $this->LE.$this->LE;
        }
    
        return $result;
      }
    
      /**
       * Assembles the message body.  Returns an empty string on failure.
       * @access public
       * @return string The assembled message body
       */
      public function CreateBody() {
        $body = '';
    
        if ($this->sign_key_file) {
          $body .= $this->GetMailMIME();
        }
    
        $this->SetWordWrap();
    
        switch($this->message_type) {
          case 'alt':
            $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
            $body .= $this->EncodeString($this->AltBody, $this->Encoding);
            $body .= $this->LE.$this->LE;
            $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
            $body .= $this->EncodeString($this->Body, $this->Encoding);
            $body .= $this->LE.$this->LE;
            $body .= $this->EndBoundary($this->boundary[1]);
            break;
          case 'plain':
            $body .= $this->EncodeString($this->Body, $this->Encoding);
            break;
          case 'attachments':
            $body .= $this->GetBoundary($this->boundary[1], '', '', '');
            $body .= $this->EncodeString($this->Body, $this->Encoding);
            $body .= $this->LE;
            $body .= $this->AttachAll();
            break;
          case 'alt_attachments':
            $body .= sprintf("--%s%s", $this->boundary[1], $this->LE);
            $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE);
            $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body
            $body .= $this->EncodeString($this->AltBody, $this->Encoding);
            $body .= $this->LE.$this->LE;
            $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
            $body .= $this->EncodeString($this->Body, $this->Encoding);
            $body .= $this->LE.$this->LE;
            $body .= $this->EndBoundary($this->boundary[2]);
            $body .= $this->AttachAll();
            break;
        }
    
        if ($this->IsError()) {
          $body = '';
        } elseif ($this->sign_key_file) {
          try {
            $file = tempnam('', 'mail');
            file_put_contents($file, $body); //TODO check this worked
            $signed = tempnam("", "signed");
            if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) {
              @unlink($file);
              @unlink($signed);
              $body = file_get_contents($signed);
            } else {
              @unlink($file);
              @unlink($signed);
              throw new phpmailerException($this->Lang("signing").openssl_error_string());
            }
          } catch (phpmailerException $e) {
            $body = '';
            if ($this->exceptions) {
              throw $e;
            }
          }
        }
    
        return $body;
      }
    
      /**
       * Returns the start of a message boundary.
       * @access private
       */
      private function GetBoundary($boundary, $charSet, $contentType, $encoding) {
        $result = '';
        if($charSet == '') {
          $charSet = $this->CharSet;
        }
        if($contentType == '') {
          $contentType = $this->ContentType;
        }
        if($encoding == '') {
          $encoding = $this->Encoding;
        }
        $result .= $this->TextLine('--' . $boundary);
        $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
        $result .= $this->LE;
        $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
        $result .= $this->LE;
    
        return $result;
      }
    
      /**
       * Returns the end of a message boundary.
       * @access private
       */
      private function EndBoundary($boundary) {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
      }
    
      /**
       * Sets the message type.
       * @access private
       * @return void
       */
      private function SetMessageType() {
        if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
          $this->message_type = 'plain';
        } else {
          if(count($this->attachment) > 0) {
            $this->message_type = 'attachments';
          }
          if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
            $this->message_type = 'alt';
          }
          if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
            $this->message_type = 'alt_attachments';
          }
        }
      }
    
      /**
       *  Returns a formatted header line.
       * @access public
       * @return string
       */
      public function HeaderLine($name, $value) {
        return $name . ': ' . $value . $this->LE;
      }
    
      /**
       * Returns a formatted mail line.
       * @access public
       * @return string
       */
      public function TextLine($value) {
        return $value . $this->LE;
      }
    
      /////////////////////////////////////////////////
      // CLASS METHODS, ATTACHMENTS
      /////////////////////////////////////////////////
    
      /**
       * Adds an attachment from a path on the filesystem.
       * Returns false if the file could not be found
       * or accessed.
       * @param string $path Path to the attachment.
       * @param string $name Overrides the attachment name.
       * @param string $encoding File encoding (see $Encoding).
       * @param string $type File extension (MIME) type.
       * @return bool
       */
      public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
        try {
          if ( !@is_file($path) ) {
            throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE);
          }
          $filename = basename($path);
          if ( $name == '' ) {
            $name = $filename;
          }
    
          $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false,  // isStringAttachment
            6 => 'attachment',
            7 => 0
          );
    
        } catch (phpmailerException $e) {
          $this->SetError($e->getMessage());
          if ($this->exceptions) {
            throw $e;
          }
          echo $e->getMessage()."\n";
          if ( $e->getCode() == self::STOP_CRITICAL ) {
            return false;
          }
        }
        return true;
      }
    
      /**
      * Return the current array of attachments
      * @return array
      */
      public function GetAttachments() {
        return $this->attachment;
      }
    
      /**
       * Attaches all fs, string, and binary attachments to the message.
       * Returns an empty string on failure.
       * @access private
       * @return string
       */
      private function AttachAll() {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();
    
        // Add all attachments
        foreach ($this->attachment as $attachment) {
          // Check for string attachment
          $bString = $attachment[5];
          if ($bString) {
            $string = $attachment[0];
          } else {
            $path = $attachment[0];
          }
    
          if (in_array($attachment[0], $incl)) { continue; }
          $filename    = $attachment[1];
          $name        = $attachment[2];
          $encoding    = $attachment[3];
          $type        = $attachment[4];
          $disposition = $attachment[6];
          $cid         = $attachment[7];
          $incl[]      = $attachment[0];
          if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; }
          $cidUniq[$cid] = true;
    
          $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
          $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);
          $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
    
          if($disposition == 'inline') {
            $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
          }
    
          $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE);
    
          // Encode as string attachment
          if($bString) {
            $mime[] = $this->EncodeString($string, $encoding);
            if($this->IsError()) {
              return '';
            }
            $mime[] = $this->LE.$this->LE;
          } else {
            $mime[] = $this->EncodeFile($path, $encoding);
            if($this->IsError()) {
              return '';
            }
            $mime[] = $this->LE.$this->LE;
          }
        }
    
        $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
    
        return join('', $mime);
      }
    
      /**
       * Encodes attachment in requested format.
       * Returns an empty string on failure.
       * @param string $path The full path to the file
       * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
       * @see EncodeFile()
       * @access private
       * @return string
       */
      private function EncodeFile($path, $encoding = 'base64') {
        try {
          if (!is_readable($path)) {
            throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE);
          }
          if (function_exists('get_magic_quotes')) {
            function get_magic_quotes() {
              return false;
            }
          }
          if (PHP_VERSION < 6) {
            $magic_quotes = get_magic_quotes_runtime();
            set_magic_quotes_runtime(0);
          }
          $file_buffer  = file_get_contents($path);
          $file_buffer  = $this->EncodeString($file_buffer, $encoding);
          if (PHP_VERSION < 6) { set_magic_quotes_runtime($magic_quotes); }
          return $file_buffer;
        } catch (Exception $e) {
          $this->SetError($e->getMessage());
          return '';
        }
      }
    
      /**
       * Encodes string to requested format.
       * Returns an empty string on failure.
       * @param string $str The text to encode
       * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
       * @access public
       * @return string
       */
      public function EncodeString ($str, $encoding = 'base64') {
        $encoded = '';
        switch(strtolower($encoding)) {
          case 'base64':
            $encoded = chunk_split(base64_encode($str), 76, $this->LE);
            break;
          case '7bit':
          case '8bit':
            $encoded = $this->FixEOL($str);
            //Make sure it ends with a line break
            if (substr($encoded, -(strlen($this->LE))) != $this->LE)
              $encoded .= $this->LE;
            break;
          case 'binary':
            $encoded = $str;
            break;
          case 'quoted-printable':
            $encoded = $this->EncodeQP($str);
            break;
          default:
            $this->SetError($this->Lang('encoding') . $encoding);
            break;
        }
        return $encoded;
      }
    
      /**
       * Encode a header string to best (shortest) of Q, B, quoted or none.
       * @access public
       * @return string
       */
      public function EncodeHeader($str, $position = 'text') {
        $x = 0;
    
        switch (strtolower($position)) {
          case 'phrase':
            if (!preg_match('/[\200-\377]/', $str)) {
              // Can't use addslashes as we don't know what value has magic_quotes_sybase
              $encoded = addcslashes($str, "\0..\37\177\\\"");
              if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                return ($encoded);
              } else {
                return ("\"$encoded\"");
              }
            }
            $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
            break;
          case 'comment':
            $x = preg_match_all('/[()"]/', $str, $matches);
            // Fall-through
          case 'text':
          default:
            $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
            break;
        }
    
        if ($x == 0) {
          return ($str);
        }
    
        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if (strlen($str)/3 < $x) {
          $encoding = 'B';
          if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) {
            // Use a custom function which correctly encodes and wraps long
            // multibyte strings without breaking lines within a character
            $encoded = $this->Base64EncodeWrapMB($str);
          } else {
            $encoded = base64_encode($str);
            $maxlen -= $maxlen % 4;
            $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
          }
        } else {
          $encoding = 'Q';
          $encoded = $this->EncodeQ($str, $position);
          $encoded = $this->WrapText($encoded, $maxlen, true);
          $encoded = str_replace('='.$this->LE, "\n", trim($encoded));
        }
    
        $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));
    
        return $encoded;
      }
    
      /**
       * Checks if a string contains multibyte characters.
       * @access public
       * @param string $str multi-byte text to wrap encode
       * @return bool
       */
      public function HasMultiBytes($str) {
        if (function_exists('mb_strlen')) {
          return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
          return false;
        }
      }
    
      /**
       * Correctly encodes and wraps long multibyte strings for mail headers
       * without breaking lines within a character.
       * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
       * @access public
       * @param string $str multi-byte text to wrap encode
       * @return string
       */
      public function Base64EncodeWrapMB($str) {
        $start = "=?".$this->CharSet."?B?";
        $end = "?=";
        $encoded = "";
    
        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $offset = $avgLength = floor($length * $ratio * .75);
    
        for ($i = 0; $i < $mb_length; $i += $offset) {
          $lookBack = 0;
    
          do {
            $offset = $avgLength - $lookBack;
            $chunk = mb_substr($str, $i, $offset, $this->CharSet);
            $chunk = base64_encode($chunk);
            $lookBack++;
          }
          while (strlen($chunk) > $length);
    
          $encoded .= $chunk . $this->LE;
        }
    
        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($this->LE));
        return $encoded;
      }
    
      /**
      * Encode string to quoted-printable.
      * Only uses standard PHP, slow, but will always work
      * @access public
      * @param string $string the text to encode
      * @param integer $line_max Number of chars allowed on a line before wrapping
      * @return string
      */
      public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) {
        $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
        $lines = preg_split('/(?:\r\n|\r|\n)/', $input);
        $eol = "\r\n";
        $escape = '=';
        $output = '';
        while( list(, $line) = each($lines) ) {
          $linlen = strlen($line);
          $newline = '';
          for($i = 0; $i < $linlen; $i++) {
            $c = substr( $line, $i, 1 );
            $dec = ord( $c );
            if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
              $c = '=2E';
            }
            if ( $dec == 32 ) {
              if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
                $c = '=20';
              } else if ( $space_conv ) {
                $c = '=20';
              }
            } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
              $h2 = floor($dec/16);
              $h1 = floor($dec%16);
              $c = $escape.$hex[$h2].$hex[$h1];
            }
            if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
              $output .= $newline.$escape.$eol; //  soft line break; " =\r\n" is okay
              $newline = '';
              // check if newline first character will be point or not
              if ( $dec == 46 ) {
                $c = '=2E';
              }
            }
            $newline .= $c;
          } // end of for
          $output .= $newline.$eol;
        } // end of while
        return $output;
      }
    
      /**
      * Encode string to RFC2045 (6.7) quoted-printable format
      * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version
      * Also results in same content as you started with after decoding
      * @see EncodeQPphp()
      * @access public
      * @param string $string the text to encode
      * @param integer $line_max Number of chars allowed on a line before wrapping
      * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function
      * @return string
      * @author Marcus Bointon
      */
      public function EncodeQP($string, $line_max = 76, $space_conv = false) {
        if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3)
          return quoted_printable_encode($string);
        }
        $filters = stream_get_filters();
        if (!in_array('convert.*', $filters)) { //Got convert stream filter?
          return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation
        }
        $fp = fopen('php://temp/', 'r+');
        $string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks
        $params = array('line-length' => $line_max, 'line-break-chars' => $this->LE);
        $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params);
        fputs($fp, $string);
        rewind($fp);
        $out = stream_get_contents($fp);
        stream_filter_remove($s);
        $out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange
        fclose($fp);
        return $out;
      }
    
      /**
       * Encode string to q encoding.
       * @link http://tools.ietf.org/html/rfc2047
       * @param string $str the text to encode
       * @param string $position Where the text is going to be used, see the RFC for what that means
       * @access public
       * @return string
       */
    public function EncodeQ ($str, $position = 'text') {
    // There should not be any EOL in the string
    $encoded = preg_replace('/[\r\n]*/', '', $str);
    switch (strtolower($position)) {
    case 'phrase':
    $encoded = preg_replace_callback("|([^A-Za-z0-9!*+\/ -])|", function($found){ return strtolower($found[1]);}, $encoded);
    break;
    case 'comment':
    $encoded = preg_replace_callback("/([\(\)\"])/", function($found){ return strtolower($found[1]);}, $encoded);
    case 'text':
    default:
    // Replace every high ascii, control =, ? and _ characters
    //TODO using /e (equivalent to eval()) is probably not a good idea
    $encoded = preg_replace_callback('|([\000-\011\013\014\016-\037\075\077\137\177-\377])|', function($found){ return strtolower($found[1]);}, $encoded);
    break;
    }
    // Replace every spaces to _ (more readable than =20)
    $encoded = str_replace(' ', '_', $encoded);
    return $encoded;
     }
    
      /**
       * Adds a string or binary attachment (non-filesystem) to the list.
       * This method can be used to attach ascii or binary data,
       * such as a BLOB record from a database.
       * @param string $string String attachment data.
       * @param string $filename Name of the attachment.
       * @param string $encoding File encoding (see $Encoding).
       * @param string $type File extension (MIME) type.
       * @return void
       */
      public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
        // Append to $attachment array
        $this->attachment[] = array(
          0 => $string,
          1 => $filename,
          2 => basename($filename),
          3 => $encoding,
          4 => $type,
          5 => true,  // isStringAttachment
          6 => 'attachment',
          7 => 0
        );
      }
    
      /**
       * Adds an embedded attachment.  This can include images, sounds, and
       * just about any other document.  Make sure to set the $type to an
       * image type.  For JPEG images use "image/jpeg" and for GIF images
       * use "image/gif".
       * @param string $path Path to the attachment.
       * @param string $cid Content ID of the attachment.  Use this to identify
       *        the Id for accessing the image in an HTML form.
       * @param string $name Overrides the attachment name.
       * @param string $encoding File encoding (see $Encoding).
       * @param string $type File extension (MIME) type.
       * @return bool
       */
      public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
    
        if ( !@is_file($path) ) {
          $this->SetError($this->Lang('file_access') . $path);
          return false;
        }
    
        $filename = basename($path);
        if ( $name == '' ) {
          $name = $filename;
        }
    
        // Append to $attachment array
        $this->attachment[] = array(
          0 => $path,
          1 => $filename,
          2 => $name,
          3 => $encoding,
          4 => $type,
          5 => false,  // isStringAttachment
          6 => 'inline',
          7 => $cid
        );
    
        return true;
      }
    
      /**
       * Returns true if an inline attachment is present.
       * @access public
       * @return bool
       */
      public function InlineImageExists() {
        foreach($this->attachment as $attachment) {
          if ($attachment[6] == 'inline') {
            return true;
          }
        }
        return false;
      }
    
      /////////////////////////////////////////////////
      // CLASS METHODS, MESSAGE RESET
      /////////////////////////////////////////////////
    
      /**
       * Clears all recipients assigned in the TO array.  Returns void.
       * @return void
       */
      public function ClearAddresses() {
        foreach($this->to as $to) {
          unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
      }
    
      /**
       * Clears all recipients assigned in the CC array.  Returns void.
       * @return void
       */
      public function ClearCCs() {
        foreach($this->cc as $cc) {
          unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
      }
    
      /**
       * Clears all recipients assigned in the BCC array.  Returns void.
       * @return void
       */
      public function ClearBCCs() {
        foreach($this->bcc as $bcc) {
          unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
      }
    
      /**
       * Clears all recipients assigned in the ReplyTo array.  Returns void.
       * @return void
       */
      public function ClearReplyTos() {
        $this->ReplyTo = array();
      }
    
      /**
       * Clears all recipients assigned in the TO, CC and BCC
       * array.  Returns void.
       * @return void
       */
      public function ClearAllRecipients() {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
      }
    
      /**
       * Clears all previously set filesystem, string, and binary
       * attachments.  Returns void.
       * @return void
       */
      public function ClearAttachments() {
        $this->attachment = array();
      }
    
      /**
       * Clears all custom headers.  Returns void.
       * @return void
       */
      public function ClearCustomHeaders() {
        $this->CustomHeader = array();
      }
    
      /////////////////////////////////////////////////
      // CLASS METHODS, MISCELLANEOUS
      /////////////////////////////////////////////////
    
      /**
       * Adds the error message to the error container.
       * @access protected
       * @return void
       */
      protected function SetError($msg) {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
          $lasterror = $this->smtp->getError();
          if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
            $msg .= '<p>' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
          }
        }
        $this->ErrorInfo = $msg;
      }
    
      /**
       * Returns the proper RFC 822 formatted date.
       * @access public
       * @return string
       * @static
       */
      public static function RFCDate() {
        $tz = date('Z');
        $tzs = ($tz < 0) ? '-' : '+';
        $tz = abs($tz);
        $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
        $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
    
        return $result;
      }
    
      /**
       * Returns the server hostname or 'localhost.localdomain' if unknown.
       * @access private
       * @return string
       */
      private function ServerHostname() {
        if (!empty($this->Hostname)) {
          $result = $this->Hostname;
        } elseif (isset($_SERVER['SERVER_NAME'])) {
          $result = $_SERVER['SERVER_NAME'];
        } else {
          $result = 'localhost.localdomain';
        }
    
        return $result;
      }
    
      /**
       * Returns a message in the appropriate language.
       * @access private
       * @return string
       */
      private function Lang($key) {
        if(count($this->language) < 1) {
          $this->SetLanguage('en'); // set the default language
        }
    
        if(isset($this->language[$key])) {
          return $this->language[$key];
        } else {
          return 'Language string failed to load: ' . $key;
        }
      }
    
      /**
       * Returns true if an error occurred.
       * @access public
       * @return bool
       */
      public function IsError() {
        return ($this->error_count > 0);
      }
    
      /**
       * Changes every end of line from CR or LF to CRLF.
       * @access private
       * @return string
       */
      private function FixEOL($str) {
        $str = str_replace("\r\n", "\n", $str);
        $str = str_replace("\r", "\n", $str);
        $str = str_replace("\n", $this->LE, $str);
        return $str;
      }
    
      /**
       * Adds a custom header.
       * @access public
       * @return void
       */
      public function AddCustomHeader($custom_header) {
        $this->CustomHeader[] = explode(':', $custom_header, 2);
      }
    
      /**
       * Evaluates the message and returns modifications for inline images and backgrounds
       * @access public
       * @return $message
       */
      public function MsgHTML($message, $basedir = '') {
        preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);
        if(isset($images[2])) {
          foreach($images[2] as $i => $url) {
            // do not change urls for absolute images (thanks to corvuscorax)
            if (!preg_match('#^[A-z]+://#',$url)) {
              $filename = basename($url);
              $directory = dirname($url);
              ($directory == '.')?$directory='':'';
              $cid = 'cid:' . md5($filename);
              $ext = pathinfo($filename, PATHINFO_EXTENSION);
              $mimeType  = self::_mime_types($ext);
              if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; }
              if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; }
              if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) {
                $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);
              }
            }
          }
        }
        $this->IsHTML(true);
        $this->Body = $message;
        $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
        if (!empty($textMsg) && empty($this->AltBody)) {
          $this->AltBody = html_entity_decode($textMsg);
        }
        if (empty($this->AltBody)) {
          $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n";
        }
      }
    
      /**
       * Gets the MIME type of the embedded or inline image
       * @param string File extension
       * @access public
       * @return string MIME type of ext
       * @static
       */
      public static function _mime_types($ext = '') {
        $mimes = array(
          'hqx'   =>  'application/mac-binhex40',
          'cpt'   =>  'application/mac-compactpro',
          'doc'   =>  'application/msword',
          'bin'   =>  'application/macbinary',
          'dms'   =>  'application/octet-stream',
          'lha'   =>  'application/octet-stream',
          'lzh'   =>  'application/octet-stream',
          'exe'   =>  'application/octet-stream',
          'class' =>  'application/octet-stream',
          'psd'   =>  'application/octet-stream',
          'so'    =>  'application/octet-stream',
          'sea'   =>  'application/octet-stream',
          'dll'   =>  'application/octet-stream',
          'oda'   =>  'application/oda',
          'pdf'   =>  'application/pdf',
          'ai'    =>  'application/postscript',
          'eps'   =>  'application/postscript',
          'ps'    =>  'application/postscript',
          'smi'   =>  'application/smil',
          'smil'  =>  'application/smil',
          'mif'   =>  'application/vnd.mif',
          'xls'   =>  'application/vnd.ms-excel',
          'ppt'   =>  'application/vnd.ms-powerpoint',
          'wbxml' =>  'application/vnd.wap.wbxml',
          'wmlc'  =>  'application/vnd.wap.wmlc',
          'dcr'   =>  'application/x-director',
          'dir'   =>  'application/x-director',
          'dxr'   =>  'application/x-director',
          'dvi'   =>  'application/x-dvi',
          'gtar'  =>  'application/x-gtar',
          'php'   =>  'application/x-httpd-php',
          'php4'  =>  'application/x-httpd-php',
          'php3'  =>  'application/x-httpd-php',
          'phtml' =>  'application/x-httpd-php',
          'phps'  =>  'application/x-httpd-php-source',
          'js'    =>  'application/x-javascript',
          'swf'   =>  'application/x-shockwave-flash',
          'sit'   =>  'application/x-stuffit',
          'tar'   =>  'application/x-tar',
          'tgz'   =>  'application/x-tar',
          'xhtml' =>  'application/xhtml+xml',
          'xht'   =>  'application/xhtml+xml',
          'zip'   =>  'application/zip',
          'mid'   =>  'audio/midi',
          'midi'  =>  'audio/midi',
          'mpga'  =>  'audio/mpeg',
          'mp2'   =>  'audio/mpeg',
          'mp3'   =>  'audio/mpeg',
          'aif'   =>  'audio/x-aiff',
          'aiff'  =>  'audio/x-aiff',
          'aifc'  =>  'audio/x-aiff',
          'ram'   =>  'audio/x-pn-realaudio',
          'rm'    =>  'audio/x-pn-realaudio',
          'rpm'   =>  'audio/x-pn-realaudio-plugin',
          'ra'    =>  'audio/x-realaudio',
          'rv'    =>  'video/vnd.rn-realvideo',
          'wav'   =>  'audio/x-wav',
          'bmp'   =>  'image/bmp',
          'gif'   =>  'image/gif',
          'jpeg'  =>  'image/jpeg',
          'jpg'   =>  'image/jpeg',
          'jpe'   =>  'image/jpeg',
          'png'   =>  'image/png',
          'tiff'  =>  'image/tiff',
          'tif'   =>  'image/tiff',
          'css'   =>  'text/css',
          'html'  =>  'text/html',
          'htm'   =>  'text/html',
          'shtml' =>  'text/html',
          'txt'   =>  'text/plain',
          'text'  =>  'text/plain',
          'log'   =>  'text/plain',
          'rtx'   =>  'text/richtext',
          'rtf'   =>  'text/rtf',
          'xml'   =>  'text/xml',
          'xsl'   =>  'text/xml',
          'mpeg'  =>  'video/mpeg',
          'mpg'   =>  'video/mpeg',
          'mpe'   =>  'video/mpeg',
          'qt'    =>  'video/quicktime',
          'mov'   =>  'video/quicktime',
          'avi'   =>  'video/x-msvideo',
          'movie' =>  'video/x-sgi-movie',
          'doc'   =>  'application/msword',
          'word'  =>  'application/msword',
          'xl'    =>  'application/excel',
          'eml'   =>  'message/rfc822'
        );
        return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];
      }
    
      /**
      * Set (or reset) Class Objects (variables)
      *
      * Usage Example:
      * $page->set('X-Priority', '3');
      *
      * @access public
      * @param string $name Parameter Name
      * @param mixed $value Parameter Value
      * NOTE: will not work with arrays, there are no arrays to set/reset
      * @todo Should this not be using __set() magic function?
      */
      public function set($name, $value = '') {
        try {
          if (isset($this->$name) ) {
            $this->$name = $value;
          } else {
            throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL);
          }
        } catch (Exception $e) {
          $this->SetError($e->getMessage());
          if ($e->getCode() == self::STOP_CRITICAL) {
            return false;
          }
        }
        return true;
      }
    
      /**
       * Strips newlines to prevent header injection.
       * @access public
       * @param string $str String
       * @return string
       */
      public function SecureHeader($str) {
        $str = str_replace("\r", '', $str);
        $str = str_replace("\n", '', $str);
        return trim($str);
      }
    
      /**
       * Set the private key file and password to sign the message.
       *
       * @access public
       * @param string $key_filename Parameter File Name
       * @param string $key_pass Password for private key
       */
      public function Sign($cert_filename, $key_filename, $key_pass) {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
      }
    
      /**
       * Set the private key file and password to sign the message.
       *
       * @access public
       * @param string $key_filename Parameter File Name
       * @param string $key_pass Password for private key
       */
      public function DKIM_QP($txt) {
        $tmp="";
        $line="";
        for ($i=0;$i<strlen($txt);$i++) {
          $ord=ord($txt[$i]);
          if ( ((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E)) ) {
            $line.=$txt[$i];
          } else {
            $line.="=".sprintf("%02X",$ord);
          }
        }
        return $line;
      }
    
      /**
       * Generate DKIM signature
       *
       * @access public
       * @param string $s Header
       */
      public function DKIM_Sign($s) {
        $privKeyStr = file_get_contents($this->DKIM_private);
        if ($this->DKIM_passphrase!='') {
          $privKey = openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase);
        } else {
          $privKey = $privKeyStr;
        }
        if (openssl_sign($s, $signature, $privKey)) {
          return base64_encode($signature);
        }
      }
    
      /**
       * Generate DKIM Canonicalization Header
       *
       * @access public
       * @param string $s Header
       */
      public function DKIM_HeaderC($s) {
        $s=preg_replace("/\r\n\s+/"," ",$s);
        $lines=explode("\r\n",$s);
        foreach ($lines as $key=>$line) {
          list($heading,$value)=explode(":",$line,2);
          $heading=strtolower($heading);
          $value=preg_replace("/\s+/"," ",$value) ; // Compress useless spaces
          $lines[$key]=$heading.":".trim($value) ; // Don't forget to remove WSP around the value
        }
        $s=implode("\r\n",$lines);
        return $s;
      }
    
      /**
       * Generate DKIM Canonicalization Body
       *
       * @access public
       * @param string $body Message Body
       */
      public function DKIM_BodyC($body) {
        if ($body == '') return "\r\n";
        // stabilize line endings
        $body=str_replace("\r\n","\n",$body);
        $body=str_replace("\n","\r\n",$body);
        // END stabilize line endings
        while (substr($body,strlen($body)-4,4) == "\r\n\r\n") {
          $body=substr($body,0,strlen($body)-2);
        }
        return $body;
      }
    
      /**
       * Create the DKIM header, body, as new header
       *
       * @access public
       * @param string $headers_line Header lines
       * @param string $subject Subject
       * @param string $body Body
       */
      public function DKIM_Add($headers_line,$subject,$body) {
        $DKIMsignatureType    = 'rsa-sha1'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery            = 'dns/txt'; // Query method
        $DKIMtime             = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header       = "Subject: $subject";
        $headers              = explode("\r\n",$headers_line);
        foreach($headers as $header) {
          if (strpos($header,'From:') === 0) {
            $from_header=$header;
          } elseif (strpos($header,'To:') === 0) {
            $to_header=$header;
          }
        }
        $from     = str_replace('|','=7C',$this->DKIM_QP($from_header));
        $to       = str_replace('|','=7C',$this->DKIM_QP($to_header));
        $subject  = str_replace('|','=7C',$this->DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable
        $body     = $this->DKIM_BodyC($body);
        $DKIMlen  = strlen($body) ; // Length of body
        $DKIMb64  = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body
        $ident    = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";";
        $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n".
                    "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n".
                    "\th=From:To:Subject;\r\n".
                    "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n".
                    "\tz=$from\r\n".
                    "\t|$to\r\n".
                    "\t|$subject;\r\n".
                    "\tbh=" . $DKIMb64 . ";\r\n".
                    "\tb=";
        $toSign   = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs);
        $signed   = $this->DKIM_Sign($toSign);
        return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n";
      }
    
      protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body) {
        if (!empty($this->action_function) && function_exists($this->action_function)) {
          $params = array($isSent,$to,$cc,$bcc,$subject,$body);
          call_user_func_array($this->action_function,$params);
        }
      }
    }
    
    class phpmailerException extends Exception {
      public function errorMessage() {
        $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
        return $errorMsg;
      }
    }
    ?>
    

  6. Fiz desta maneira e retirei um parâmetro e ficando assim:

    public function EncodeQ ($str, $position = 'text') {
    // There should not be any EOL in the string
    $encoded = preg_replace('/[\r\n]*/', '', $str);
    switch (strtolower($position)) {
    case 'phrase':
    $encoded = preg_replace_callback("|([^A-Za-z0-9!*+\/ -])|",  $encoded);
    break;
    case 'comment':
    $encoded = preg_replace_callback("/([\(\)\"])/", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    case 'text':
    default:
    // Replace every high ascii, control =, ? and _ characters
    //TODO using /e (equivalent to eval()) is probably not a good idea
    $encoded = preg_replace_callback('|([\000-\011\013\014\016-\037\075\077\137\177-\377])|',
    "'='.sprintf('%02X', ord('\\1'))", $encoded);
    break;
    }
    // Replace every spaces to _ (more readable than =20)
    $encoded = str_replace(' ', '_', $encoded);
    return $encoded;
     }
    

    E agora gerou este erro:

     

    Warning: preg_replace_callback() expects at least 3 parameters, 2 given in /var/www/html/jcimoveisbrasil.com/web/phpmailer/class.phpmailer.php on line 1726


  7. Olá pessoal, eu trabalho com a classe php mailer há muito e após atualizar o php de minha plataforma Uol-Host, para php 5.5, apareceu uma mensagem chata de Warning, dizendo que o preg_replace esta depreciado, andei lendo sobre o assunto e li que o que realmente esta obsoleto é o /e que ele usa mas como esta obsoleto esse uso do " e " vi na documentação que deve ser substituído por preg_replace_callback, e assim que fiz as alterações as mensagens começou a chegar em meu email normalmente mas com uma mensagem de erro Warning, segue o erro abaixo:

     

    Warning: preg_replace_callback(): Requires argument 2,

     

    Entendi que o servidor que quer eu escreva 2 argumentos , tipo especificando o uso do comando preg_replace_callback, mais ou menos assim que entendi, e não estou sabendo como escrever para satisfazer o servidor e deixar de disparar os erros:

     

    Lembrando que não sou fã de ocultar erros " Error_reporting() " e sim tratá-los, e segue o trecho que código da classe phpmailer

    public function EncodeQ ($str, $position = 'text') {
    // There should not be any EOL in the string
    $encoded = preg_replace('/[\r\n]*/', '', $str);
    switch (strtolower($position)) {
    case 'phrase':
    $encoded = preg_replace_callback("/([^A-Za-z0-9!*+\/ -])/", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    break;
    case 'comment':
    $encoded = preg_replace_callback("/([\(\)\"])/", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    case 'text':
    default:
    // Replace every high ascii, control =, ? and _ characters
    //TODO using /e (equivalent to eval()) is probably not a good idea
    $encoded = preg_replace_callback('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/',
    "'='.sprintf('%02X', ord('\\1'))", $encoded);
    break;
    }
    // Replace every spaces to _ (more readable than =20)
    $encoded = str_replace(' ', '_', $encoded);
    return $encoded;
     }
    
    

    O único erro que dá é que pede 2 argumentos: se puderem dar um help , desde já fico grato.

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.