Почему я получаю ошибку неопределенного индекса, когда var_dump($_POST) показывает массив?

У меня есть форма, которая отправляет данные на страницу PHP на том же локальном сайте. Я знаю, что данные публикуются правильно, потому что var_dump($_POST) выводит массив с ожидаемой информацией, как показано ниже.

Однако, когда я пытаюсь установить переменную в одно из значений в массиве, я получаю уведомление об ошибке в журналах, в котором говорится, что у меня есть неопределенный индекс (для поля ответа электронной почты и g-captcha), а код PHP не работать, как ожидалось.

Я довольно долго ломал голову, пытаясь понять, почему это происходит, и другие подобные вопросы не дали ответа. Любая помощь будет оценена по достоинству. Спасибо!

Код формы:

<form action="recaptcha.php" method="post" class="pardot-email-form-handler" id="carter" novalidate>
    <input class="one-field-pardot-form-handler" maxlength="80" name="email" id="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
    <div style="position:absolute; left:-9999px; top: -9999px;">
        <label for="pardot_extra_field">
            Comments
        </label>
        <input type="text" id="pardot_extra_field" name="pardot_extra_field">
    </div>
    <button class="g-recaptcha" data-sitekey="6LeErDUUAAAAAEOYqDrylFnEwQkYp7qmPjs2_Z0o" data-callback="captchaSubmit" data-badge="inline">
        Submit
    </button>
</form>

Код PHP:

var_dump($_POST);
// reCaptcha info
$secret = "anonymous";
$remoteip = $_SERVER["REMOTE_ADDR"];
$url = "https://www.google.com/recaptcha/api/siteverify";

// Form info
$email = $_POST["email"];
$response = $_POST["g-recaptcha-response"];

// Curl Request
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
    'secret' => $secret,
    'response' => $response,
    'remoteip' => $remoteip
    ));
$curlData = curl_exec($curl);
curl_close($curl);

// Parse data
$recaptcha = json_decode($curlData, true);
if ($recaptcha["success"])
    echo "Success!";
else
    echo "Failure!";

Результаты Var_Dump:

  array (size=3)
  'email' => string 'an email address' (length=21)
  'pardot_extra_field' => string 'a comment' (length=12)
  'g-recaptcha-response' => string 'a long response' (length=441)

Сообщение об ошибке PHP:

[01 января 2018 15:42:02 UTC] Уведомление PHP: неопределенный индекс: первый в C:\wamp\www\local\public\recaptcha.php в строке 17

[01 января 2018 15:42:02 UTC] Трассировка стека PHP:

[01 января 2018 15:42:02 UTC] PHP 1. {main}() C:\wamp\www\local\public\recaptcha.php:0

[01 января 2018 15:42:02 UTC] Уведомление PHP: неопределенный индекс: последний в C:\wamp\www\local\public\recaptcha.php в строке 18

[01 января 2018 15:42:02 UTC] Трассировка стека PHP:

[01 января 2018 15:42:02 UTC] PHP 1. {main}() C:\wamp\www\local\public\recaptcha.php:0


person dpayne    schedule 01.01.2018    source источник
comment
Скорее всего, вы видите два разных вызова этого скрипта. Один использует http post и доставляет ожидаемый дамп, а другой - неожиданный вызов http get, который приводит к предупреждающим записям в вашем файле журнала.   -  person arkascha    schedule 01.01.2018
comment
включите ваше сообщение об ошибке в вопрос   -  person RamC    schedule 01.01.2018
comment
@RamC Спасибо за напоминание! Добавлено сообщение об ошибке.   -  person dpayne    schedule 01.01.2018
comment
в вашем массиве нет элемента first. Отсюда и ошибка   -  person RamC    schedule 01.01.2018
comment
@arkascha Хм ... может быть, я неправильно понимаю, но как это может быть? Сообщение об ошибке связано с попыткой установить эти переменные, которые используют _POST: $email = $_POST[email]; $response = $_POST[g-recaptcha-response];   -  person dpayne    schedule 01.01.2018
comment
Кстати, вы уверены, что вы поделились файлом recaptcha.php?   -  person RamC    schedule 01.01.2018
comment
@RamC Да. Кроме того, если не было ясно, что этот вопрос был вопросом нуба, я добавлю еще один - как мне сначала добавить элемент в массив?   -  person dpayne    schedule 01.01.2018
comment
Если да, то где вы сначала ссылаетесь на элемент в коде, который вы предоставили?   -  person RamC    schedule 01.01.2018
comment
@RamC Извините, но не уверен, что понимаю, о чем вы спрашиваете ... вы спрашиваете, откуда размещена форма?   -  person dpayne    schedule 01.01.2018
comment
В вашем сообщении об ошибке указано Undefined index first, что означает, что вы ищете элемент first внутри массива, в котором его нет. Теперь мой вопрос: в какой строке вашего кода вы ищете элемент first?   -  person RamC    schedule 01.01.2018
comment
@RamC А, понятно. Благодарю за разъяснение! Это здесь: // Информация о форме $email = $_POST[email]; $response = $_POST[g-recaptcha-response];   -  person dpayne    schedule 01.01.2018
comment
Давайте продолжим обсуждение в чате.   -  person RamC    schedule 01.01.2018


Ответы (2)


Из сообщения об ошибке, которое вы добавили, код ищет индекс first/last в массиве и не может его найти.

Но, похоже, в вашем коде нет такой ссылки на эти ключевые имена.

Кажется, в вашем коде нет массива с индексами первыми или последними.

А также нет тегов ввода формы, названных первым или последним.

Проверьте, ссылаетесь ли вы на правильный файл.

person RamC    schedule 01.01.2018
comment
Итак, проблема заключалась в том, что когда я впервые настраивал это, я изначально добавил фиктивную форму с полями имени и фамилии и установил переменные в поле php, чтобы они указывали на них. Впоследствии я обновил их, но, должно быть, не сохранил php-файл или что-то в этом роде, потому что он все еще использовал эти переменные. Я был сбит с толку, потому что думал, что они относятся к первому и последнему элементам в массиве, а не к частям строки, но @RamC помог мне показать, что происходит. - person dpayne; 01.01.2018

здесь (windows 10, xampp, версия PHP 7.1.8) с «маленькими» изменениями, я понял, что ваш секретный код неверен (invalid-input-secret см. Google recaptcha возвращает false из-за недопустимого-input-secret), но как вы видите результат после проверки captcha https://developers.google.com/recaptcha/docs/display

Результат: array(3) { ["email"]=> string(16) "[email protected]" ["pardot_extra_field"]=> string(0) "" ["g-recaptcha -response"]=> string(334) "03AMPJSYXAiSFTZyU0mzcYHYpzpKF8EODvfGkWJHQjc8fgNVNFgv3lm7ZSZVwSpwXtvHRS3JnNwAtsnfsdwpQMXz10zw7xSmhx8Jd7IkZ6J86Boh70WXXBjrczIGMcndbHZSW3boZucbO8sneKrcuZDsIqrGsmi00ECwDZ3ntvpq5qATQeDN5nhuSOesdgdG7V_XMjKINHPUZPh0ZA6fPsMXvD4GNeGqOvaB1OJidQvaxcdK7vIr-aOqr5tOJNbwxSRR941caXJT5ggkWnA4O2bzQrphcIdQ3USyO0OcKPNBqN1IWGE18XGE0ioesL3YScvoMKFzWkeF-F" } 03AMPJSYXAiSFTZyU0mzcYHYpzpKF8EODvfGkWJHQjc8fgNVNFgv3lm7ZSZVwSpwXtvHRS3JnNwAtsnfsdwpQMXz10zw7xSmhx8Jd7IkZ6J86Boh70WXXBjrczIGMcndbHZSW3boZucbO8sneKrcuZDsIqrGsmi00ECwDZ3ntvpq5qATQeDN5nhuSOesdgdG7V_XMjKINHPUZPh0ZA6fPsMXvD4GNeGqOvaB1OJidQvaxcdK7vIr-aOqr5tOJNbwxSRR941caXJT5ggkWnA4O2bzQrphcIdQ3USyO0OcKPNBqN1IWGE18XGE0ioesL3YScvoMKFzWkeF-F{ "success": false, "error-codes": [ "invalid-input-secret" ] }Failure!

<?php
var_dump($_POST);
    // reCaptcha info
    $secret = "anonymous";
    $remoteip = $_SERVER["REMOTE_ADDR"];
    $url = "https://www.google.com/recaptcha/api/siteverify";


if(isset($_POST["email"])){

    // Form info
    $email = $_POST["email"];
    $response = $_POST["g-recaptcha-response"];

    // Curl Request
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, array(
        'secret' => '6LeErDUUAAAAAEOYqDrylFnEwQkYp7qmPjs2_Z0o',//$secret,
        'response' => $response,
        'remoteip' => $remoteip
        ));
    $curlData = curl_exec($curl);
    curl_close($curl);
print_r($response);
print_r($curlData);
    // Parse data
    $recaptcha = json_decode($curlData, true);
    if ($recaptcha["success"])
        echo "Success!";
    else
        echo "Failure!";
}
?>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<!-- recaptcha.php --><form action="" method="post" class="pardot-email-form-handler" id="carter" novalidate>
    <input class="one-field-pardot-form-handler" maxlength="80" name="email" id="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
    <div style="position:absolute; left:-9999px; top: -9999px;">
        <label for="pardot_extra_field">
            Comments
        </label>
        <input type="text" id="pardot_extra_field" name="pardot_extra_field">
    </div>
    <!-- <button class="g-recaptcha" data-sitekey="6LeErDUUAAAAAEOYqDrylFnEwQkYp7qmPjs2_Z0o" data-callback="captchaSubmit" data-badge="inline">
        Submit
    </button> -->
    <input type="submit" value="Submit">

     <div class="g-recaptcha" data-sitekey="6LeErDUUAAAAAEOYqDrylFnEwQkYp7qmPjs2_Z0o"></div>

</form><hr><?php phpinfo(); ?>
person Constantin    schedule 01.01.2018
comment
Я добавил анонимный секретный код, чтобы люди не могли увидеть его публично. Секретный код, который не был специально применен к моим доменам, не будет работать, и похоже, что вместо этого вы использовали мой открытый ключ, который также не будет работать. - person dpayne; 01.01.2018
comment
я согласен .. новый скрипт с вашим секретным ключом работает на этом конкретном домене? потому что отправлять запросы с 127.0.0.1 не лучшая идея - person Constantin; 01.01.2018