PHP `use` import namespace вызывает сбой страницы - PullRequest
0 голосов
/ 06 марта 2019

PHPMailer отлично работает в тестовом скрипте на своих собственных голых костях. Тем не менее, это сбой и не сообщает о каких-либо ошибок на другой странице. Я выделил проблему следующим строкам кода:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

Когда я пропускаю эти строки, я получаю ошибку PHP:

Неустранимая ошибка: необнаруженная ошибка: класс 'PHPMailer' не найден в /path/to/file.php:166 Трассировка стека: # 0 {main}, брошенный в /path/to/file.php в строке 166

Когда я включаю эти строки (которые, как мне кажется, мне нужны, чтобы использовать пространство имен импортируемых классов), я просто получаю пустой белый экран. Сообщения об ошибках включаются в верхней части страницы следующим образом:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Однако на странице нет сообщений об ошибках.

Остальные файлы классов импортируются, как показано ниже, и путь правильный, поскольку они не сообщают об ошибках, если я не изменю путь.

require '../../../wp-content/plugins/PHPMailer/Exception.php';
require '../../../wp-content/plugins/PHPMailer/PHPMailer.php';
require '../../../wp-content/plugins/PHPMailer/SMTP.php';

Я искал информацию о use на веб-сайте PHP, однако при поиске ничего не было указано (http://ca3.php.net/manual-lookup.php?pattern=use&scope=quickref).

Вот полный код в файле .php. Я знаю, что есть и другие проблемы, такие как очистка ввода данных и т. Д., Но я занимаюсь рефакторингом чужого кода:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);
var_dump($_POST);

// PayPal Config Constants
require "../../../mail-config.php";
require "../../../keys-config.php";

/** Send HTTP POST Request for PayPal Payment */
function PPHttpPost($methodName_, $nvpStr_) {

    // Get the environment set in the keys-config.php file
    $environment = PAYPAL_ENVIRONMENT;
    // Use the keys and endpoint for the environment
    if("sandbox" === $environment || "beta-sandbox" === $environment) {
        // Set the API URL
        $API_Endpoint = PAYPAL_API_ENDPOINT_SANDBOX;
        // Set up your API credentials, PayPal end point, and API version.
        $API_UserName = urlencode(PAYPAL_API_USERNAME_SANDBOX);
        $API_Password = urlencode(PAYPAL_API_PASSWORD_SANDBOX);
        $API_Signature = urlencode(PAYPAL_API_SIGNATURE_SANDBOX);
    } else {
        // Set the API URL
        $API_Endpoint = PAYPAL_API_ENDPOINT;
        // Set up your API credentials, PayPal end point, and API version.
        $API_UserName = urlencode(PAYPAL_API_USERNAME);
        $API_Password = urlencode(PAYPAL_API_PASSWORD);
        $API_Signature = urlencode(PAYPAL_API_SIGNATURE);
    }

    // Set the version
    $version = urlencode('51.0');
    // Set the curl parameters.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    // Turn off the server and peer verification (TrustManager Concept).
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    // Set the API operation, version, and API signature in the request.
    $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";
    // Set the request as a POST FIELD for curl.
    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
    // Get response from the server.
    $httpResponse = curl_exec($ch);

    // If the method failed
    if(!$httpResponse) {
        exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
    }

    // Extract the response details.
    $httpResponseAr = explode("&", $httpResponse);
    $httpParsedResponseAr = array();
    foreach ($httpResponseAr as $i => $value) {
        $tmpAr = explode("=", $value);
        if(sizeof($tmpAr) > 1) {
            $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
        }
    }

    // If data in response is invalid
    if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
        exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
    }

    // Return the http response
    return $httpParsedResponseAr;
}

// Prepare PayPal Payment Request
// Set request-specific fields.
// 'Authorization' or 'Sale'
$paymentType = urlencode('Sale');
// Name Details
$firstName = urlencode($_POST['firstname']);
$lastName = urlencode($_POST['lastname']);
// Credit Card details
$creditCardType = urlencode($_POST['customer_credit_card_type']);
$creditCardNumber = urlencode($_POST['cardnum']);
$expDateMonth = $_POST['cc_expiration_month'];
// Month must be padded with leading zero
$padDateMonth = urlencode(str_pad($expDateMonth, 2, '0', STR_PAD_LEFT));
$expDateYear = urlencode($_POST['cc_expiration_year']);
$cv = urlencode($_POST['cv']);
// Address Details
$address1 = urlencode($_POST['streetaddy']);
$city = urlencode($_POST['city']);
$state = urlencode($_POST['province']);
$postal_code = urlencode($_POST['postalcode']);
// US or other valid country code
$country = urlencode($_POST['country']);
$price = urlencode($_POST['price']);
// or other currency ('GBP', 'EUR', 'JPY', 'CAD', 'AUD')
$currencyID = urlencode('CAD');

// Add request-specific fields to the request string.
$nvpStr =   "&PAYMENTACTION=$paymentType&AMT=$price&CREDITCARDTYPE=$creditCardType&ACCT=$creditCardNumber".
            "&EXPDATE=$padDateMonth$expDateYear&CVV2=$cv&FIRSTNAME=$firstName&LASTNAME=$lastName".
            "&STREET=$address1&CITY=$city&STATE=$state&ZIP=$postal_code&COUNTRYCODE=$country&CURRENCYCODE=$currencyID";

// Execute the API operation; see the PPHttpPost function above.
$httpParsedResponseAr = PPHttpPost('DoDirectPayment', $nvpStr);

if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) {

    //Below line is response code from original
    //exit('Direct Payment Completed Successfully: '.print_r($httpParsedResponseAr, true));

    // Require the PHPMailer classes
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '../../../wp-content/plugins/PHPMailer/Exception.php';
    require '../../../wp-content/plugins/PHPMailer/PHPMailer.php';
    require '../../../wp-content/plugins/PHPMailer/SMTP.php';

  //FIELDS
  $first_name = $_POST['firstname'];
  $last_name = $_POST['lastname'];
  $email_from = $_POST['email'];
  $phone = $_POST['phone'];
  $ad = $_POST['ad'];
  $price = $_POST['price'];
  $edition = $_POST['edition'];
  $issues = $_POST['issues'];
  $category = $_POST['category'];
  $order_id = $_POST['order_id'];
  $email_message = "A Classified Ad has been purchased from the Speaker website. Details of the ad are below.\n\n";

  // Filter the string
  function clean_string($string) {
    $bad = array("content-type","bcc:","to:","cc:","href");
    return str_replace($bad,"",$string);
    $string = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
  }

  // Build the Email message body contents
  $email_message .= "<b>Order ID:</b> ".clean_string($order_id)."<br>";
  $email_message .= "<b>First Name:</b> ".clean_string($first_name)."<br>";
  $email_message .= "<b>Last Name:</b> ".clean_string($last_name)."<br>";
  $email_message .= "<b>Email:</b> ".clean_string($email_from)."<br>";
  $email_message .= "<b>Telephone:</b> ".clean_string($phone)."<br>";
  $email_message .= "<b>Category:</b> ".clean_string($category)."<br>";
  $email_message .= "<b>Ad Text:</b> ".clean_string($ad)."<br>";
  $email_message .= "<b>Edition:</b> ".clean_string($edition)."<br>";
  $email_message .= "<b>Number of Issues:</b> ".clean_string($issues)."<br>";
  $email_message .= "<b>Price:</b> ".clean_string($price)."<br>";

  // Set up the email to be sent
  $mail = new PHPMailer(); // create a new object
  $mail->IsSMTP(); // enable SMTP
  $mail->SMTPDebug = 0;
  $mail->SMTPAuth = true; // authentication enabled
  $mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail
  $mail->Host = "smtp.gmail.com";
  $mail->Port = 465; // or 587
  $mail->IsHTML(true);
  $mail->Username = SITE_EMAIL_SMTP_USERNAME;
  $mail->Password = SITE_EMAIL_SMTP_PASSWORD;
  $mail->SetFrom(SITE_EMAIL_FROM_ADRESS_LIST);
  $mail->Subject = "Classified Ad Submission From The ".NEWSPAPER_NAME." Website";
  $mail->Body = $email_message;
  // Add all the company email addresses to the send list
  foreach(PAYWALL_NOTIFICATION_EMAIL_ADDRESSES_ARRAY as $email_address){
    $mail->AddAddress($email_address);
  }
    // Add the purchaser's email address to the send list
    $mail->AddAddress($email_from);

  // If mail fails to send
  if(!$mail->Send()) {
    //REDIRECT TO FAILED PAGE
     header( 'Location: /order-not-completed' );
  } else {
   //REDIRECT TO SUCCESS PAGE
   header( 'Location: /success' );
  }

} else  {
    //Below line is response code for testing
    exit('DoDirectPayment failed: ' . print_r($httpParsedResponseAr, true));

    //REDIRECT TO FAILED PAGE
  header( 'Location: /order-not-completed' );
}

?>

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Вот страница, описывающая использование функции PHP use для импорта пространств имен: http://php.net/manual/en/language.namespaces.importing.php

Области действия для импорта

Ключевое слово use должно быть объявлено ввнешняя область файла (глобальная область) или внутри объявлений пространства имен.Это связано с тем, что импорт выполняется во время компиляции, а не во время выполнения, поэтому его нельзя ограничить областью действия.В следующем примере будет показано недопустимое использование ключевого слова use: namespace Languages;

function toGreenlandic () {

use Languages\Danish;

// ... }

Хотя приведенный выше код не использует useоператор в стороне функции, он не находится вверху файла, а другие функции были объявлены до операторов use.Я протестировал приведенный выше код после перемещения операторов use в верхнюю часть файла непосредственно под

Вкратце: всегда ставьте свои операторы use в верхней части вашего PHP-файла и вне функций или классов.

0 голосов
/ 06 марта 2019

Это будет означать, что ваша версия PHP слишком старая. Пространства имен и синтаксис use были введены в PHP 5.3, и это уже много лет назад.

PHPMailer 6.0.x требует как минимум PHP 5.5, поэтому обновите ваш PHP, в идеале до последней версии (в настоящее время 7.3).

...