Я устанавливаю 2 набора переменных из 3. первый набор, который я получаю от почты. второй набор я получаю из базы данных.
код
1-й сет
$code = $_POST['code']; //A0001
$det1 = $_POST['det1']; //it something v1
$det2 = $_POST['det2']; //numero uno
$alid = $_POST['al_id'];
2-й сет
$sql = $conn->prepare('SELECT al_code, al_det_in, al_det_en FROM al where al_id=?');
$sql->execute([$alid]);
$stmt = $sql->fetch();
$alcode = $stmt['al_code']; //A0001
$aldet1 = $stmt['al_det_in']; //it something
$aldet2 = $stmt['al_det_en']; //numero uno
осуждение
$$valA = $code . $det1 . $det2;
$$valB = $alcode . $aldet1 . $aldet2;
затем я хочу сравнить $$valA и $$valB в этом коде
if ( $$valA === $$valB ){
//do A
}else{
//do B
}
но он всегда дает неправильный ответ, поэтому я попытался повторить
echo $code ." $$ ". $det1 ." $$ ". $det2 ."$$". $$valA ." $$<br>";
echo $alcode ." ## ". $aldet1 ." ## ". $aldet2 ." ## ". $$valB ." ##<br>";
результат
A0001 $$ it something v1 $$ numero uno $$ A0001it somethingnumero uno $$
A0001 ## it something ## numero uno ## A0001it somethingnumero uno ##
Я уже пытался найти какой-то ответ в Google, но ни один из них не был похож на мой случай. если это уже был ответ на этот случай. надеюсь, кто-то может связать поток.
Редактировать По предложению ника пробовал на https://3v4l.org/
$code = "A0001";
$det1 = "it something v1";
$det2 = "numero uno";
$alid = "01";
$alcode = "A0001";
$aldet1 = "it something";
$aldet2 = "numero uno";
$alid2 = "01";
$valA = "";
$valB = "";
$$valA = $code. $det1. $det2;
$$valB = $alcode. $aldet1. $aldet2;
echo $code ." $$ ". $det1. " $$ " .$det2. " $$ " .$$valA. " $$\n";
echo $alcode ." $$ ". $aldet1. " $$ " .$aldet2. " $$ " .$$valB. " $$\n";
выход
Output for 7.2.11 | took 27 ms, 15.1 MiB
A0001 $$ it something v1 $$ numero uno $$ A0001it somethingnumero uno $$
A0001 ## it something ## numero uno ## A0001it somethingnumero uno ##
так это тиражируется. я попытался поменять порядок $$valA и $$valB, в результате проблема была в этом. так кто-нибудь знает, как правильно настроить $$valA и $$valB?
я использую apache 2.4 и php 7.2 тс. Я хочу знать, что ваш результат правильный. не пропустил v1 на $$valA?
3v4l.org не использует PHP в Apache (см. о), но в этой демонстрации код запускался на PHP 7.2, и проблема не возникает.
Подозреваю $det1 = "it something v1";
V1. Из-за того, что эта строка не находит совпадений.
на основе 3v4l.org/EVl35. виноваты были $$valA и $$valB. я пробовал ${$valA} / ${$valB} проблема все еще существует
В вашем случае переменные переменные $$valA
и $$valB
на самом деле являются переменными такой же, потому что вы инициализировали $valA
и $valB
(с одним долларом) одной и той же строкой - обе они являются пустой строкой.
Итак, когда вы пишете:
$$valA = $code. $det1. $det2;
Вы говорите: «Назначьте переменной, имя которой является пустой строкой, значение $code. $det1. $det2;
.
Затем вы делаете:
$$valB = $alcode. $aldet1. $aldet2;
Что означает: «присвоить переменной, имя которой является пустой строкой, значение $alcode. $aldet1. $aldet2;
Таким образом, в обоих случаях вы присваиваете значение переменной такой же (той, имя которой является пустой строкой). Таким образом, второе присваивание перезаписывает результат первого присваивания.
Хотя у вас есть две переменные-переменные, это просто разные обозначения для доступа к одной и той же переменной. Так что всегда $$valA == $$valB
, что бы ни назначать (одному из) им.
Из кода неясно, почему вы хотите использовать переменные переменные. Просто назначьте $valA
и $valB
вместо этого, и if
будет работать как положено. Если вы действительно хотите работать с переменными переменными, убедитесь, что $valA
и $valB
разные.
спасибо, просто вставьте $valA и $valB, все работает. я просто хочу попробовать переменные переменные. но когда я пытался инициализировать $$valA и $$valB, он возвращал ошибку, как в 3v4l.org/j4pF9. таким образом я инициализирую $valA и $valB.
В этой ссылке вы никогда не инициализируете $valA
, что является обязательным условием, прежде чем вы сможете начать использовать $$valA
. Основной вопрос на самом деле таков: почему вы хотите использовать переменные переменные? Имейте в виду, что $$valA
— это не обычная переменная, это «переменная переменная» из-за двойного доллара. На самом деле вы никогда не должны его использовать, в любом случае это плохая практика.
результат такой же, как и мой код выше, вы можете увидеть в этой ссылке 3v4l.org/BaTSl
Что вас удивляет в этом коде? Это работает, как я объяснил в своем ответе.
я согласен, что ответом является использование простого соперничества. я имею в виду, что при использовании 2 переменных переменных он перезаписывал бы переменные переменные раньше. даже если вы уже инициализировали его $valA и $valB, например, как 3v4l.org/BaTSl
Я не понимаю, что вы имеете в виду, но я полагаю, вы согласны с этим?
Эта ошибка возникает из-за того, что вы неправильно используете функцию переменных переменных.
Эта функция означает, что переменная variable будет считывать переменную и искать в ее содержимом имя, совпадающее с любой другой переменной.
Например
$theoriginal = "I am the original variable";
$thenew = "theoriginal";
echo $thenew; // output: theoriginal
echo $$thenew; // output: I am the original variable
Вы присваиваете пустые значения своим переменным, а затем явно объявляете переменную переменную и пытаетесь принудительно добавить к ней переменные. Вы просто неправильно используете функцию.
Обновлено: поскольку в вашем коде не используются динамически изменяемые имена переменных (по крайней мере, насколько я вижу в коде, которым вы поделились), вы можете просто объединить переменные в обычную строковую переменную и избежать дополнительных шагов, которые не требуются. (Еще раз, это мое мнение, основанное на коде, который я вижу здесь, я не знаю остальной код или нужна ли ему эта дополнительная функция)
так что как настроить. в руководстве по php $a = 'привет'; тогда $$a = 'мир'; вывод - привет, мир. так что я скучаю по интерпретации этого. Итак, если мы настроим $$valA = 'Hello A'; затем $$valB = 'Привет Б'; Предположим, одна и та же переменная. затем $$valB перезапишет $$valA
$a = 'hello'
и $$a = 'world'
означают, что сначала создается переменная a
, а затем создается новая переменная с использованием содержимого a
, поэтому $a $$a
равно $a $hello
, когда вы объявляли $$a
, вы просто создавали переменную $hello
, что-то, что также будет равно ${$a}
, что на самом деле означает $hello
.
Я не могу воспроизвести вашу проблему. 3v4l.org/WkPtK