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

Дискусията в 'Web Development' стартирана от bgrgroup, Ноем 15, 2018.

  1. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    Здравейте,
    Генерирам си случайно число с PHP като това:

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

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

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

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

    ReminD Well-Known Member

    Рег.:
    Ян 22, 2008
    Съобщения:
    6,236
    Харесвания:
    1,156
    Точки:
    113
    Код:
    session_start(); // start a session
    $randomNumber = null;
    if(!is_null($randomNumber)) {
    (int)$randomNumber= $_SESSION["random"] = mt_rand(1,10);
    } else {
    (int)$randomNumber = $_SESSION["random"];
    }
    
    ми действай така. Иначе каква е идеята на тоя див? цветова гама или?
     
  3. Илиян

    Илиян Active Member

    Рег.:
    Март 8, 2017
    Съобщения:
    164
    Харесвания:
    74
    Точки:
    28
    Пол:
    Мъж
    Код:
    if ($_SESSION['random'] < 1) {
        $_SESSION['random'] = rand(1,10);
    }
    Нещо такова би трябвало да свърши работа. Не виждам смисъл от повече проверки. Ако няма число или е под 1, ще се генерира ново, в противен случай не се прави нищо и си остава старото.
     
  4. ReminD

    ReminD Well-Known Member

    Рег.:
    Ян 22, 2008
    Съобщения:
    6,236
    Харесвания:
    1,156
    Точки:
    113
    Е да, ама при първото влизане ще писка нотис за undefined index
     
  5. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    ReminD - кода дава NaN вместо число

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

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

    AMitrev Well-Known Member

    Рег.:
    Авг 6, 2012
    Съобщения:
    1,610
    Харесвания:
    274
    Точки:
    83
    Пол:
    Мъж
    Място:
    София
    @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-а в число, за да може после да смяташ.
     
  7. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    Ето целия код с последните добавки от вашите съвети:

    Код:
    <?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

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

    Илиян Active Member

    Рег.:
    Март 8, 2017
    Съобщения:
    164
    Харесвания:
    74
    Точки:
    28
    Пол:
    Мъж
    Аз сложих проверка колкото да провери дали вече има генерирано число, иначе може по много начини. Странно ми е, че му генерира пак ново след презареждане, според мен нещо не му работят сесиите както трябва.
     
  9. AMitrev

    AMitrev Well-Known Member

    Рег.:
    Авг 6, 2012
    Съобщения:
    1,610
    Харесвания:
    274
    Точки:
    83
    Пол:
    Мъж
    Място:
    София
    Кои две числа? нали говорим за едно и също. Сигурен ли си че имаш само този код?
     
  10. tripledeuce

    tripledeuce Active Member

    Рег.:
    Март 31, 2015
    Съобщения:
    181
    Харесвания:
    105
    Точки:
    43
    добави си зеления ред или следвай инструкциите

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

    AseasRoa Well-Known Member

    Рег.:
    Юни 22, 2014
    Съобщения:
    942
    Харесвания:
    307
    Точки:
    63
    При мен си стоят същите числа. Виж дали ти работят бисквитките както трябва, и от тях зависи това.
     
  12. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    Това е кода, който тествам в момента:

    Код:
        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'] е записано някъде!?

    РЕДАКЦИЯ:

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


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

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

    AseasRoa Well-Known Member

    Рег.:
    Юни 22, 2014
    Съобщения:
    942
    Харесвания:
    307
    Точки:
    63
    Виж сега как работят сесиите в 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 харесва това.
  14. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    Еха. Супер бързо, кратко, ясно и полезно ръководство за Сесии и бисквитки.
    Ако имаше сайт с такива ЯСНИ и нагледни обяснения за 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;

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

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

    AseasRoa Well-Known Member

    Рег.:
    Юни 22, 2014
    Съобщения:
    942
    Харесвания:
    307
    Точки:
    63
    Какво се случва с PHPSESSID бисквитката в браузъра когато презареждаш, държи ли си стойността или се променя?
     
  16. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    Сложих кода на serel.bg за да може всеки който иска да помогне да види как работи реално.

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

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

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

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

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

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

    rombeca Active Member

    Рег.:
    Ноем 9, 2010
    Съобщения:
    954
    Харесвания:
    213
    Точки:
    43
    Ако ползваш база данни ( а като гледам няма как да не ползваш), може да си пишеш числото в таблицата по продукт.
     
  18. bgrgroup

    bgrgroup New Member

    Рег.:
    Окт 22, 2018
    Съобщения:
    22
    Харесвания:
    0
    Точки:
    1
    да може ама това са още поне 2 заявки към базата и код който увеличава шанса да направя мазало в базата. :)

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

    AseasRoa Well-Known Member

    Рег.:
    Юни 22, 2014
    Съобщения:
    942
    Харесвания:
    307
    Точки:
    63
    Идеята е браузъра да помни данни за потребителя, които са уникални само за него. Класическия начин са бисквитките в браузъра - те се помнят локално в браузъра, обаче при тях проблема е че се изпращат на сървъра при всяка заявка отново и отново, така че не можеш да си позволиш да помниш много данни с тях. При сесиите в PHP виж какво имаш - само една бисквитка. Бисквитката ти е ключодържателя, а сесията закачена на нея ти е ключа към данните, които се пазят на сървъра в това файлче в Temp папката. Значи имаш 1 файлче за потребителска сесия, пък ти го пълни с каквото искаш. Това файлче обаче е общо за всички продукти, за целия сайт, докато не се смени сесията.

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

    rombeca Active Member

    Рег.:
    Ноем 9, 2010
    Съобщения:
    954
    Харесвания:
    213
    Точки:
    43
    Ти заявка към таблицата с продукти така и така правиш. Т.е. няма да са повече.
    А ако ти трябва да заредиш друго число ако потребителя се върне в продукта, ще трябва да прихванеш излизането от страницата.
     

Сподели страницата

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies.
    Dismiss Notice