- Въпрос относно PHP код
WT форуми -> PHP MySQL ASP.NET -> Въпрос относно PHP код
Създайте нова тема Напишете отговор 
Автор Съобщение
tyrla4eto
Нов
Нов

Регистриран на: 20/08/2011 8:13 pm

Support: 1
Bonus: 2
Мнения: 152
Мнение 04/04/2018 8:15 pm     Въпрос относно PHP код Отговорете с цитат


Здравейте,
Имам един въпрос и той е как точно работи PHP кода отдолу?

PHP code:
if($userProfile['extras']%2==0)


Малко обяснение за какво става въпрос.
Имам 3 екстри, които потребител може да активира, всяка екстра има номер (2 , 3 , 5). Скрипта, който е в момента (не съм го писал аз) е направен по следния начин.
Полето "extras" в базата по подразбиране е 1, с активиране на екстра това поле се умножава по екстрата със съответния статус.
(т.е ако активирам първо екстра със статус 2 полето от 1 става 2, след което ако активирам екстра със статус 5 полето 2 става 10 и накрая активирам екстра със статус 3 полето от 10 става 30)

Предполагам, че смисъла на този код, който писах по-горе е да проверява реално коя екстра от 3-те е активиране. НО не разбирам каква точно е логиката тук, защото винаги ми връща 1, а не 0, без значение коя или колко от екстрите са активирани.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 156
Bonus: 311
Мнения: 1442
Мнение 04/04/2018 10:15 pm      Отговорете с цитат


Този метод за недвусмислено определяне на активирани екстри използва взаимно прости числа, за да може еднозначно чрез проверка дали стойността в базата се дели точно на 2, 3 или 5 да се определи коя екстра е активирана.

Това означава, че трябва да провериш числото дали се дели точно на всяка от възможните екстри.

Примерно, ако в БД стои 6:
6 % 2 = 0 => двойката e активирана
6 % 3 = 0 => тройката също
6 % 5 = 1 => не

Общо възможните комбинации са 2^3 = 8, т.е. 8 възможни случая (3 екстри, всяка е или активирана, или не: 2 * 2 * 2).

За да провериш дали екстра 2, 3 или 5 е активирана, проверяваш остатъка при деление на съответното число.

Кодът, който си дал, проверява за екстра 2.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 4
Bonus: 8
Мнения: 135
Мнение 05/04/2018 9:38 am      Отговорете с цитат


Не мисля, че този код проверява коя или колко, а дали има. Ако 'extras' е 1, проверката няма да мине, но ако е 2, 10 или 30 - ще мине. Този код ще заработи само ако си активирал първата екстра, понеже ако тя не е активна, числото винаги ще е нечетно.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
tyrla4eto
Нов
Нов

Регистриран на: 20/08/2011 8:13 pm

Support: 1
Bonus: 2
Мнения: 152
Мнение 05/04/2018 1:44 pm      Отговорете с цитат


Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 156
Bonus: 311
Мнения: 1442
Мнение 05/04/2018 3:08 pm      Отговорете с цитат


tyrla4eto написа:
Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.

Явно в базата всички числа са само четни/нечетни (кое е винаги 1? резултата от $value%2==0 или $value%2). Затова и резултатът е един и същ.

Замести горе в променливата с примерно 5 и проверката няма да мине.

Но защо в БД имаш само четни или само нечетни числа - това вече е друга тема и касае стойностите, които си въвел вътре, а не кода, който показваш.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
tyrla4eto
Нов
Нов

Регистриран на: 20/08/2011 8:13 pm

Support: 1
Bonus: 2
Мнения: 152
Мнение 05/04/2018 7:54 pm      Отговорете с цитат


anonimen написа:
tyrla4eto написа:
Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.

Явно в базата всички числа са само четни/нечетни (кое е винаги 1? резултата от $value%2==0 или $value%2). Затова и резултатът е един и същ.

Замести горе в променливата с примерно 5 и проверката няма да мине.

Но защо в БД имаш само четни или само нечетни числа - това вече е друга тема и касае стойностите, които си въвел вътре, а не кода, който показваш.


Когато активираш дадена екстра, статуса й се умножава по сегашното число в базата.

Примерно в базата имаш 1 (което е по-подразбиране, когато нямаш активирани екстри)
активираш екстра 2 в базата се записва 1 * 2, т.е 2
след това активираш екстра 5, в базата се записва 2 * 5, т.е 10

Ако активирам само 5 ще е 5* 1, т.е 10 и т.н.


А резултата го извадих така:
echo $value%2;

Но дали %2 или %3 или %5 винаги ми връща резултат 1, заради това скрипта не работи.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 156
Bonus: 311
Мнения: 1442
Мнение 05/04/2018 10:09 pm      Отговорете с цитат


Цитат:
А резултата го извадих така:
echo $value%2;

Но дали %2 или %3 или %5 винаги ми връща резултат 1, заради това скрипта не работи.


Не е скриптът това, което не работи. Стойностите, които идват от базата са повредени/не каквито очакваш. Когато printваш %2/%3/%5 дай echo на чистата променлива, без %2/%3/%5, и виж нейната стойност. След това наум пресметни очаквания изход, за да се увериш, че скриптът си работи.

По-скоро виж как идват числата от БД и дали там наистина са записани разнообразни числа, както очакваш.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 4
Bonus: 8
Мнения: 135
Мнение 05/04/2018 10:18 pm      Отговорете с цитат


Е, как 5 * 1 ще стане 10?

3 * 1 = 3
5 * 1 = 5

Нито един от двата резултата не е четно число. Както вече ти казах, кодът ще работи единствено ако е активирана първата екстра, защото:

2 * 1 = 2 // Екстра 1

2 * 3 = 6 // Екстри 1 и 2

2 * 5 = 10 // Екстри 1 и 3

6 * 5 = 30 // Екстри 1, 2 и 3
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dakata__92
Активен
Активен

Регистриран на: 02/08/2011 9:24 pm

Support: 119
Bonus: 231
Мнения: 3068
Мнение 08/04/2018 8:36 am      Отговорете с цитат


В случая, кода проверява следното:
Ако(протребителският профил[екстри] е четно число ) {Извърши това}
Най-просто казано в момента проверяваш дали чистлото в базата ти е четно или не. Ако се дели постоянно на 2 и нямаш остатък, тоест е = 0 то тогава е четно, но ако имаш остатък то тогава е нечетно. Естествено при поставеното от теб условие е такова обяснението. Както ти казаха по-нагоре, ако смениш 2 с 3 но запазиш условието ще е друго обяснението и така нататък. Това се води деление с остатък:

http://php.net/manual/bg/language.operators.arithmetic.php

http://sbornik.biz/5class/Urok_22.php
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети