@ligisayan

В php получаю разную область видимости для переменной внутри условия — как исправить?

Всем привет!
В интернет-магазине есть поля в которые приходят значения из формы $_POST, среди которых billing_email1, billing_email2, billing_email3 и т.д. в зависимости от заданного количества. (другие поля тоже есть, но нас здесь не интересуют)

Моя задача состоит в том, чтобы приходящие значения записать в поля:

В billing_email первое значение billing_email1, а в billing_email_dop уже все последующие billing_email2, billing_email3 и т.д. через точку с запятой.

Уже день бьюсь, никак не могу разобраться в чем причина, почему $key вне и внутри условия оказываются различными..

<?php	
    $fields = $checkout->get_checkout_fields( 'billing' );

	foreach ( $fields as $key => $field ) {
		$i = 1;
		$postdata = "";
		$postdop = "";
		$postemail = "";
		var_dump($key); // $key = billing_email_dop есть
		if($_POST["$key"."$i"]) {
			var_dump($key); // $key = billing_email_dop уже нет, вместо него $key = billing_email - почему?
			while($_POST["$key"."$i"]) { 
				
				if($key==="billing_email") {
					if(("$key"."$i")=="billing_email1") {
						$postemail = $_POST['billing_email1'];
					}
					else {
						$postdop .= $_POST["$key"."$i"]."; "; //в $postdop значение записывается корректно
					}
				}
				else {
					$postdata .= $_POST["$key"."$i"]."; ";
				}
				$i++;
			}
		}
			if($key=="billing_email") {
				woocommerce_form_field( $key, $field, $postemail );
			}
			else if($key=="billing_emaildop") {
				woocommerce_form_field( $key, $field, $postdop );
			}
			else {
				woocommerce_form_field( $key, $field, $postdata );
			}
	} 
?>
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
сделайте вардамп $fields после $checkout->get_checkout_fields( 'billing' ); а то не понятно что вы туда получаете, может это вообще ресурс...

PS: добавьте if($_POST["$key"."$i"]) {...} else{var_dump($key);} и все встанет на сво места.

PPS: вообще код конечно кроме того что построен ногами вперед, пестрит как явными ошибками, так и неявными(для новичков) глюками... например billing_email_dop в итоге становится billing_emaildop, про пропуски итераций внутри условных операторов я молчу, и как указал Максим Тимофеев - циклически затираемые данные
Короче классический пример как делать НЕ НАДО.

Как нужно переделать:
1) Нет смысла строить цикл по $fields, вы же четко знаете его структуру, в отличие от данных из $_POST.
2) В цикле по $_POST ищете подходящие по шаблону ключи(например проверка на подстроку billing_email или регулярка billing_email\d{1,2}). Если точно billing_email1 - пишете в $postemail, иначе $postdop[] = $val; По уму на клиенте поля формы должны называться более внятно, например billing_email[], после чего сразу можно получить ВЕСЬ массив емэйлов.
3) в конце если $postdop не пустой - имплодите запятыми значения $postdop, получите вашу строку с емэйлами через запятую.
4) присваиваете все в нужные поля вашего $fields.
5) Profit.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mosesfender
@mosesfender
Меланхолик, параноик, падал с коек
А как выглядит woocommerce_form_field(…)?
Видимо, там первый параметр по ссылке передаётся, и там изменяется. Потому он в цикле разный.
Ответ написан
Ваш ответ на вопрос

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

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