Случайно число с PHP и Javascript - Как?

bgrgroup

Member
Здравейте,
Генерирам си случайно число с PHP като това:

Код:
        session_start(); // start a session
        if(!isset($_SESSION["random"])) {
            $_SESSION["random"] = mt_rand(1,10);
        } else {
        $randomNumber = $_SESSION["random"];
После си го показвам в един div който се дописва след като е заредена страницата.

Проблемът е че това случайно число се сменя всеки път когато натисна F5, а аз искам да не се променя докато страницата е отворена.

Някой може ли да ми помогне?

Благодаря Ви предварително.
 

ReminD

Well-Known Member
Код:
session_start(); // start a session
$randomNumber = null;
if(!is_null($randomNumber)) {
(int)$randomNumber= $_SESSION["random"] = mt_rand(1,10);
} else {
(int)$randomNumber = $_SESSION["random"];
}
ми действай така. Иначе каква е идеята на тоя див? цветова гама или?
 

Илиян

Active Member
Код:
if ($_SESSION['random'] < 1) {
    $_SESSION['random'] = rand(1,10);
}
Нещо такова би трябвало да свърши работа. Не виждам смисъл от повече проверки. Ако няма число или е под 1, ще се генерира ново, в противен случай не се прави нищо и си остава старото.
 

ReminD

Well-Known Member
Код:
if ($_SESSION['random'] < 1) {
    $_SESSION['random'] = rand(1,10);
}
Нещо такова би трябвало да свърши работа. Не виждам смисъл от повече проверки. Ако няма число или е под 1, ще се генерира ново, в противен случай не се прави нищо и си остава старото.
Е да, ама при първото влизане ще писка нотис за undefined index
 

bgrgroup

Member
ReminD - кода дава NaN вместо число

Илиян - това работи но отново се променя при релоуд на страницата

Според мен, без да съм пррограмист - това със сесията нещо не работи. Защото със и без него числото се генерира и се променя при натискане на F5.
 

AMitrev

Well-Known Member
@ReminD сериозно ли? Нека позная ходил си в софтунито...

@Илиян и за какво му е да проверява това след като mt_rand гарантира че минимума ще бъде 1?

@bgrgroup кода който си дал ще ти върши работа, но както вече го спомена сигурен ли си, че имаш сесия... и защо даваш половината код?

Код:
<?php
session_start();
if(!isset($_SESSION['random'])) {
  $_SESSION['random'] = mt_rand(1,10);
}

$randomNumber = $_SESSION["random"]; //защо ти е тази променлива като може да ползваш session['random'] ?
var_dump($randomNumber); //това ще отпечата типа INT който ти е гарантиран от mt_rand и числото което се е паднало
След това защо JS не ти чете правилно числото... защото най-вероятно не ползваш parseInt() - за да превърнеш стринга който предаваш към JS-а в число, за да може после да смяташ.
 

bgrgroup

Member
Ето целия код с последните добавки от вашите съвети:

Код:
<?php
        session_start();      
        if ($_SESSION['random'] < 1) {
            $_SESSION['random'] = rand(1,10);
        }
        var_dump($_SESSION['random']);
       
         ?>
<script>
          let uc = document.createElement('div');
       
          uc.className = "random";
          uc.innerHTML = <?php echo $_SESSION['random']; ?>;

          document.body.appendChild(uc);
</script>
В момента резултата е:

int(4)
4

И след рефреш се сменят и двете числа.
 

Илиян

Active Member
@Илиян и за какво му е да проверява това след като mt_rand гарантира че минимума ще бъде 1?
Аз сложих проверка колкото да провери дали вече има генерирано число, иначе може по много начини. Странно ми е, че му генерира пак ново след презареждане, според мен нещо не му работят сесиите както трябва.
 

AMitrev

Well-Known Member
Кои две числа? нали говорим за едно и също. Сигурен ли си че имаш само този код?
 

tripledeuce

Active Member
добави си зеления ред или следвай инструкциите

session_start(); // start a session
if(!isset($_SESSION["random"])) {
$_SESSION["random"] = mt_rand(1,10);
$randomNumber = $_SESSION["random"];//така ще проработи, другия вариант е разкараш else, ама ме мързи да пиша
} else {
$randomNumber = $_SESSION["random"];
 

bgrgroup

Member
Това е кода, който тествам в момента:

Код:
    session_start();  
    if ( !isset($_SESSION['random']) )  {
        $_SESSION['random'] = mt_rand(1,10);
        $randomN = $_SESSION['random'];
    } else {
        $randomN = $_SESSION['random'];
    }
       ?>
        <script>
          let uc = document.createElement('div');
          uc.className = "showRandom";
          uc.innerHTML = <?php echo $randomN; ?>;
          document.body.appendChild(uc);
        </script>
    <?php
Генерира число но го променя при рефреш на страницата.
В прозореца на WEB Developer -> Session Storage - има само 2 записа и те са
wc_cart_hash_2f9f87c6036bddee5978557f296a88c2
wc_fragments_2f9f87c6036bddee5978557f296a88c2

В таба Cookies има доста записи но нито един с Name -> random

От друга страна числото се показва - значи $_SESSION['random'] е записано някъде!?

РЕДАКЦИЯ:

Току що го тествах на сайт онлайн и работи.
Числото си стои.


Но проблема е че стои еднакво за всяка страница :)

Идеята е на всяка страница да генерира ново число което да стои докато се гледа текущата страница. Ако например гледаме блог - за всяка новина да се генерира случайно число и докато е отворена тази новина - числото да не се променя . След приминаване към друга новина - там да се генерира ново число.
 
Последно редактирано:

AseasRoa

Well-Known Member
Виж сега как работят сесиите в PHP по принцип. Но може да е малко по-различно при теб, зависи по какъв начин подкарваш PHP. Аз го имам инсталиран директно, не през wamp и тем подобни.

Така, ако отвориш php.ini ще намериш една секция [Session], в която аз например имам такива настройки:

session.save_handler = "files"
session.save_path = "C:\Windows\Temp"
session.use_cookies = 1
session.name = PHPSESSID

Има и други, но тези са по-важните сега. Означават, че сесиите се пазят под формата на файлове в Temp папката на Windows. И още, че се използва бисквитка с името PHPSESSID. Сесиите са просто файлчета с данни в тази папка. Ето какво файлче имам аз в Temp:

upload_2018-11-16_11-53-48.png

Ето какво му е съдържанието: random|i:3;

На практика $_SESSION носи съдържанието на това файлче под формата на масив.

Ето какво се случва в браузъра:

upload_2018-11-16_11-56-48.png

Имам бисквитка с името PHPSESSID, на която името й е зададено в php.ini, както видяхме по-горе. Съдържнието й трябва да ти е ясно какво означава - дава връзката с това файлче в Temp. Бисквитката се създава сама от PHP, когато използваш session_start(). Ако я изтрия и заредя страницата пак, мога да видя как точно новата бисквитка попада в браузъра:

upload_2018-11-16_12-2-30.png

И сега познай, вече имам 2 файлчета в Temp:

upload_2018-11-16_12-4-14.png

Каквато информация добавиш или промениш в $_SESSION, тя ще се отрази в това файлче, което практически работи като постоянна памет... в случай че рестартираш PHP, данните да се запазят. Но не търси random някъде из браузъра. В браузъра е само бисквитката, която казва на сървъра коя е сесията на потребителя, така че PHP да знае с кои данни да напълни $_SESSION.
 

bgrgroup

Member
Еха. Супер бързо, кратко, ясно и полезно ръководство за Сесии и бисквитки.
Ако имаше сайт с такива ЯСНИ и нагледни обяснения за PHP на български - може би сега нямаше да задавам такива въпроси.

Благодаря AseasRoa

Както писах по-рано при тест на хостинга кода работи но задържа 1 число за всички страници.


Иначе в моя PHP.INI има същото:
session.save_handler=files
session.save_path="D:\xampp\tmp"
session.use_cookies=1
session.name=PHPSESSID

в темпа има десетки файлчета, но сега като знам какво да търся намерих този от днес и съдържа - random|i:3;

Последното с хедъра не го намерих за да го сравня, но схванах идеята.

Още веднъж благодаря за поясненията.
 

AseasRoa

Well-Known Member
Какво се случва с PHPSESSID бисквитката в браузъра когато презареждаш, държи ли си стойността или се променя?
 

bgrgroup

Member
Сложих кода на serel.bg за да може всеки който иска да помогне да види как работи реално.

В момента кода работи само на продуктите - който и да е продукт.

Долу в ляво на екрана ще видиш зелена цифра.

Стои си една и съща за всеки продукт. Т.е. генерира се един път на първия отворен продукт и после си остава така.

Чисто теоретично за да се сменя по веднъж за всеки продукт си мисля, че трябва да задавам нова сесия за всеки продукт примерно като използвам номер на сесия или име и задавам id-то на продукта.

Но това е теоретично - нямам идея как да стане на практика.

Да приемем така - това число трябва да се генерира само веднъж за всеи продукт. Да не се сменя при рефреш на страницата. А в момента в който се отвори нов продукт да се генерира ново число при същите условия. Ясно е че може да се генерира едно и също псевдослучайно число за 2 продукта, но това не е проблем.
 

rombeca

Active Member
...

Да приемем така - това число трябва да се генерира само веднъж за всеи продукт. Да не се сменя при рефреш на страницата. А в момента в който се отвори нов продукт да се генерира ново число при същите условия. Ясно е че може да се генерира едно и също псевдослучайно число за 2 продукта, но това не е проблем.
Ако ползваш база данни ( а като гледам няма как да не ползваш), може да си пишеш числото в таблицата по продукт.
 

bgrgroup

Member
Ако ползваш база данни ( а като гледам няма как да не ползваш), може да си пишеш числото в таблицата по продукт.
да може ама това са още поне 2 заявки към базата и код който увеличава шанса да направя мазало в базата. :)

Аз си го представях по-простичко, но вече се замислям дали е възможно технически.
 

AseasRoa

Well-Known Member
Идеята е браузъра да помни данни за потребителя, които са уникални само за него. Класическия начин са бисквитките в браузъра - те се помнят локално в браузъра, обаче при тях проблема е че се изпращат на сървъра при всяка заявка отново и отново, така че не можеш да си позволиш да помниш много данни с тях. При сесиите в PHP виж какво имаш - само една бисквитка. Бисквитката ти е ключодържателя, а сесията закачена на нея ти е ключа към данните, които се пазят на сървъра в това файлче в Temp папката. Значи имаш 1 файлче за потребителска сесия, пък ти го пълни с каквото искаш. Това файлче обаче е общо за всички продукти, за целия сайт, докато не се смени сесията.

Ако искаш за всеки продукт различно число, то както каза rombeca на сървъра можеш да записваш числото заедно номера на продукта. Можеш ли в PHP кода да вземеш номера на продукта?
 

rombeca

Active Member
Ти заявка към таблицата с продукти така и така правиш. Т.е. няма да са повече.
А ако ти трябва да заредиш друго число ако потребителя се върне в продукта, ще трябва да прихванеш излизането от страницата.
 

Горе