PHP打印机附件有时不包括在内

PHP打印机附件有时不包括在内,php,phpmailer,Php,Phpmailer,我使用PHPmailer发送邮件 $mail = new PHPMailer(); $mail->CharSet = 'UTF-8'; $mail->From = 'some address'; $mail->FromName = 'some name'; $mail->Subject = 'some subject'; $mail->Body = $bodytext; $mail->IsHTML(true); $mail->

我使用PHPmailer发送邮件

$mail = new PHPMailer();
$mail->CharSet = 'UTF-8';
$mail->From      = 'some address';
$mail->FromName  = 'some name';
$mail->Subject   = 'some subject';
$mail->Body      = $bodytext;
$mail->IsHTML(true); 
$mail->AddAddress('some email');

// FILES
for($i = 0; $i < $length; $i++) 
{
    $filedata['name'] = $_FILES['userfile']['name'][$i];

    $path = "somepath";     
    move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $path);
    {    
        $stmt = $pdo->prepare("INSERT...");
        $stmt->execute($filedata);

        $mail->AddAttachment( $path, $filedata['name']);
    }
}

$mail->Send();
$mail=new PHPMailer();
$mail->CharSet='UTF-8';
$mail->From='some address';
$mail->FromName='some name';
$mail->Subject='some Subject';
$mail->Body=$bodytext;
$mail->IsHTML(true);
$mail->AddAddress(“一些电子邮件”);
//档案
对于($i=0;$i<$length;$i++)
{
$filedata['name']=$\u文件['userfile']['name'][$i];
$path=“somepath”;
移动上传的文件($文件['userfile']['tmp\u name'][$i],$path);
{    
$stmt=$pdo->准备(“插入…”);
$stmt->execute($filedata);
$mail->AddAttachment($path,$filedata['name']);
}
}
$mail->Send();
问题是,有时(不总是)电子邮件中不包含附件,但总是上传到服务器并添加到数据库中


有什么问题?可能,在添加附件时,move\u uploaded\u文件尚未完成上载?

您需要检查文件是否正确上载,文件是否为空,以及PHPMailer是否可以加载它

释义:

试试看{
对于($i=0;$i<$length;$i++){
如果((int)$\u文件['userfile']['size'][$i]==0){
抛出新的RuntimeException('零长度文件;可能超过允许的大小');
}
$uploadfile=tempnam(sys_get_temp_dir(),散列('sha256',$_FILES['userfile']['name'][$i]);
$filename=$_文件['userfile']['name'][$i];
如果(!move_upload_file($_FILES['userfile']['tmp_name'][$i],$uploadfile)){
抛出新的RuntimeException(“未能将文件$filename移动到$uploadfile”);
}
如果(!$mail->addAttachment($uploadfile,$filename)){
抛出新的运行时异常(“未能附加文件$filename”);
}
//一切都很好,所以做任何你需要做的事情,比如将记录存储在数据库中
}
}捕获(运行时异常$e){
echo“文件上载失败:”,htmlspecialchars($e->getMessage());
}

什么!!!移动文件并发送邮件???。这是一个错误的方法。首先移动文件并添加,然后将其存储到DB或数组中,并使用适当的循环方法将其附加到服务器和DB中,然后在1个循环中添加附件。为什么错了?那么
移动上传的文件
在这里做什么??Read@AbdullaNilam你能用正常的方式解释吗,这样我就能理解你了?如果这些文件已经上传了,那么只需从DB获取路径并将其添加到foreach循环中的
$mail->AddAttachment
。先上传文件,然后进行附加与我的解决方案相比,它会提供什么?请记住,我的问题是上传文件时没有包含附件。运行代码,它会告诉你?我不能比较,因为你没有解决办法。我怎么能说出来呢?我不是那个运行你代码的人。运行它并亲自查看。您可以看到我的代码并修改它。你真的知道你做了什么吗?是的,我添加了检查,这样你就可以看到当你运行它时发生了什么。当您运行它时,它无法添加附件,它会告诉您失败的原因,这是您的代码没有做的。我不会复制您的整个部署堆栈,只是为了向您展示一点代码可以做到它所说的。
try {
    for ($i = 0; $i < $length; $i++) {
        if ((int)$_FILES['userfile']['size'][$i] === 0) {
            throw new RuntimeException('Zero length file; may exceed allowed size.');
        }
        $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$i]));
        $filename = $_FILES['userfile']['name'][$i];
        if (!move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $uploadfile)) {
            throw new RuntimeException("Failed to move file $filename to $uploadfile");
        }
        if (!$mail->addAttachment($uploadfile, $filename)) {
            throw new RuntimeException("Failed to attach file $filename");
        }
        //Everything is ok, so do whatever else you need to do, like store the record in the DB
    }
} catch (RuntimeException $e) {
    echo 'File upload failed:', htmlspecialchars($e->getMessage());
}