Home > Enterprise >  How to fix Trying to access array offset on value of type bool?
How to fix Trying to access array offset on value of type bool?

Time:11-01

Im currently working on a project with features like send certificate to email by using ajax, phpmailer and fpdf library. But when i click the send button its not sending and this error pop up inside the button "

Trying to access array offset on value of type bool

".

I tried this block of code to generate and send certificate to email "

<?php 
   
    use PHPMailer\PHPMailer\PHPMailer;
  
   
 if(isset($_POST['email_data'])){
  require 'phpmailer/src/Exception.php';
   require 'phpmailer/src/PHPMailer.php';
   require 'phpmailer/src/SMTP.php';
   require 'fpdf/fpdf.php';
   require 'connection.php'; 
  
  $output='';
  foreach($_POST['email_data']as $row)
  {
    $image= imagecreatefrompng('D:/App Projects/Source/idonate/Admin/include/Certificate Template/certificate2.png');
    $white = imagecolorallocate($image, 255, 255, 255);
    $black = imagecolorallocate($image, 0, 0, 0);
    $font="D:/App Projects/Source/idonate/Admin/fonts/Roboto-Black.ttf";
    $size =110;
    $box = imagettfbbox($size, 0, $font, $row['donor_name']);
    $text_width = abs($box[2]) - abs($box[0]);
    $text_height = abs($box[5]) - abs($box[3]);
    $image_width = imagesx($image);
    $image_height = imagesy($image);
    $x = ($image_width - $text_width) / 2;
    $y = ($image_height   $text_height) / 2;

// add text
    imagettftext($image, $size, 0, $x, $y, $black,$font, $row['donor_name']);
  
   
    
    $file=time();
    $file_path="download-certificate/".$file.".png";
    $file_path_pdf= "download-certificate/".$file.".pdf";
    
    imagepng($image,$file_path);
    imagedestroy($image);

    $pdf= new FPDF();   
    $pdf->AddPage('L','A5');
    $pdf->Image($file_path,0,0,210,150);
    $mail=new PHPMailer;
    $mail->isSMTP();
     $mail->Host= 'smtp.gmail.com';
     $mail->SMTPAuth= true;
     $mail->Username='[email protected]' ;
     $mail->Password= 'mlytxekfgplnhsap';
     $mail->SMTPSecure='ssl';
     $mail->Port=465;
   
     $mail->setFrom('[email protected]');
     $mail->addAddress($row['donor_email']);
     $mail->isHTML(true);
     $mail->Subject= "Certificate";
     $mail->Body= "This is certificate";
     $mail->addStringAttachment($pdf->Output("S",'AcknowledgementReciept.pdf'), 'AcknowledgementReciept.pdf', $encoding = 'base64', $type = 'application/pdf');
     $mail->AltBody='';
     $sendEmail= $mail->send();

"

But when I add this code for connection and validation to ajax"

 if($sendEmail["code"]==('400')){
      $output .= html_entity_decode($sendEmail['full_error']);
     }
    }
    if($output==''){
      echo 'ok';
    }else{
      echo $output;
    }
 
    
  }

"Its not working but when a remove it its sending the email but the button is not disabled after success.

This is for the ajax"

$.ajax({
            url:"http://localhost:3000/Admin/include/sendcerti.php" ,
            method: "POST",
            data: {email_data:email_data},
            beforeSend:function(){
                $('#' donor_id).html('Sending...');
                $('#'   donor_id).addClass('btn-danger');
            },
            success: function(data){
                if (data == 'ok')
                {
                    $('#'  donor_id).text("Success");
                    $('#'   donor_id).removeClass('btn-danger');
                    $('#'   donor_id).removeClass('btn-info');
                    $('#'   donor_id).addClass('btn-success');
                }
                else{
                    $('#'  donor_id).text(data);
                }
                
                $('#'  donor_id).attr('disabled', false);
            }

        })

" I want to disable the button after success to prevent duplication of certificate

CodePudding user response:

This isn't a complicated problem! First you're doing this:

$sendEmail= $mail->send();

The send method returns a boolean value. So not surprisingly, when you try to access it as an array in code like $sendEmail["code"], it will fail in exactly the way you are seeing.

You are assuming (incorrectly) that PHPMailer returns things in a way that it does not, so update your code to do it correctly, looking at properties such as ErrorInfo.

CodePudding user response:

So I figured out how can I pass error and disable button to ajax first I modify this code and change it to true

 $(this).attr('disabled',true);

Then I created if else to the PHP file to pass the validation to ajax

if ($mail->send()){$res =['status' => 200,'message' => 'Email sent']}

Then for the success function I parse the data from $res variable.

success: function(response){
            var res= jQuery.parseJSON(response);
            if(res.status == 200)
            {
                $('#'  donor_id).text("Success");
                $('#'   donor_id).removeClass('btn-danger');
                $('#'   donor_id).removeClass('btn-info');
                $('#'   donor_id).addClass('btn-success');
                $('#email_button'  donor_id).attr('disabled', false);
                console.log(res.message);
            }
            else if (res.status== 422){
                $('#'  donor_id).text(data);
                console.log(res.message);
            }" 
  • Related