Почему false срабатывает как true?

$.ajax({
            url: '/action_ajax_form.php',
            type: "POST",
            data:  $("#feedback-form_03").serialize(),
            success: function(response) {
				if (response) {console.log(response);
				console.log('<div id="message_03">Ваше сообщение успешно отправлено. Спасибо!<br />Мы свяжемся с вами ближайшее время!</div>');
				}
            }
}
        })

5f8bebc153bfd639913620.png
Как это возможно false приходит, но
if (response) {console.log(response);
console.log('<div id="message_03">Ваше сообщение успешно отправлено. Спасибо!<br />Мы свяжемся с вами ближайшее время!</div>');

в консоль сообщение отправляется

в php файле такой код
$url = 'https://www.google.com/recaptcha/api/siteverify';
$params = [
    'secret' => 'sdfgsdfgsdfgsdfg-VV',
    'response' => $captcha_token,
    'remoteip' => $_SERVER['REMOTE_ADDR']
];
 
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
$response = curl_exec($ch);
if(!empty($response)) $decoded_response = json_decode($response);
 
$success = false;
 
if ($decoded_response && $decoded_response->success && $decoded_response->action == $captcha_action && $decoded_response->score > 0) {
    $success = $decoded_response->success;
    // обрабатываем данные формы, которая защищена капчей
} else {
    // прописываем действие, если пользователь оказался ботом
}
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Строка false, разумеется приводится к true.
В РНР будет ровно то же самое, условие if('false') выполнится.

А чтобы false воспринималось как булево значение, а не как строка, надо либо сказать твоему яваскрипту, что он ждёт специальным образом кодированные данные, либо РНР - что он отправляет не HTML, а некий другой формат.

В общем, обилие комментаторов с советами вида "пальцем в небо" наглядно показывает уровень понимания средним пользователем похапе своих действий.

В целом направление мысли верное - система воспринимает переданное значение как строку, а не как булево значение. Но на этом мысль и останавливается.
Хотя при некотором усилии можно было бы продолжить и рассудить - что поскольку протокол НТТР чисто текстовый, то никакие булевы значения через него по умолчанию передать нельзя. А так же объекты, массивы, и прочие типы данных.
И для того чтобы сделать это возможным, был придуман специальный формат кодирования. Который позволяет передавать данные различнызх типовв, и который автор, несомненно, уже применяет (вследствие чего, собственно, из булева значения и получается строка false).

То есть единственным недостающим звеном в этой головоломке является контекст, в зависимости от которого яваскрипт будет воспринимать строку false либо как строку, либо как булево значение. То есть нужен способ РНР и яваскрипту договориться, в каком формате они обмениваются данными. Стандартным способом является НТТР заголовок Content-type. Который скажет браузеру, что данные не в дефолтом формате HTML, а в другом.

Либо как вариант, можно прямо при вызове функции ajax явно задать, в каком формате придут данные. Если озаботиться изучением документации по этой функции.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
no_one_safe
@no_one_safe
У вас false как строка приходит, а не как булево значение. В php сделайте
echo json_encode($success);
Ответ написан
Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)
Скорее всего из за того что false приходит в виде строки, и условие соответственно выполняется, потому что люба строка это уже true, пробуйте что-то типа такого:
$.ajax({
	url: '/action_ajax_form.php',
	type: "POST",
	data:  $("#feedback-form_03").serialize(),
	success: function(response) {
		if (response !== "false") {
			console.log(response);
			console.log('<div id="message_03">Ваше сообщение успешно отправлено. Спасибо!<br />Мы свяжемся с вами ближайшее время!</div>');
		}
	}
}
})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы