Как рандомизировать многостраничную форму, используя переменные SESSION? - PullRequest
0 голосов
/ 08 мая 2018

Итак, по сути, у меня есть система входа / регистрации сеанса в php, и я перенаправляю пользователя в файл start.php, который покажет навигацию, которая читается из массива.

Это мой сценарий:

После успешного входа пользователя с помощью login.html и login.php перенаправьте пользователя на start.php или разрешите пользователю перейти на start.php. В start.php случайным образом выберите один php из sql1.php - sql10.php (со случайными функциями) и добавьте его как ссылку в start.php (показан пример, чтобы пользователь мог перейти на выбранную страницу).

Например, если выбрано sql3.php, пользователь сможет щелкнуть и посетить sql3.php из start.php после входа в систему.

Когда пользователь нажимает на следующую страницу, новая страница будет случайным образом выбираться из sql1.php - sql10.php, исключая те, которые уже были выбраны. Например, если пользователь нажимает sql3.php, на странице sql3.php появится новая информация, например, (sql7.php и иметь новую следующую страницу) с новой выбранной страницей (предположим, что на этот раз sql7.php и sql3.php не следует выбирать).

Разрешить пользователю нажимать на предыдущую страницу, чтобы вернуться на предыдущую или следующую страницу каждый раз, когда пользователь попадает на новую страницу. Если все файлы sql1.php - sql10.php выбраны случайным образом в вышеуказанном процессе, то в последнем выбранная страница, не отображать ссылку на следующую страницу.

код следующим образом

session_start();

if( !isset($_SESSION['username']) ) {
    header("Location: login.html");
}
$stack = array(); 
array_push($stack, 'sql1.php');
array_push($stack, 'sql2.php');
array_push($stack, 'sql3.php');
array_push($stack, 'sql4.php');
array_push($stack, 'sql5.php');
array_push($stack, 'sql6.php');
array_push($stack, 'sql7.php');
array_push($stack, 'sql8.php');
array_push($stack, 'sql9.php');
array_push($stack, 'sql10.php');

$orderedstack = array();
$unorderedstack = array();

if(isset($_SESSION['stack'], $_SESSION['orderedstack'], $_SESSION['unorderedstack'])){
    $stack = $_SESSION['stack'];
    $orderedstack = $_SESSION['orderedstack'];
    $unorderedstack = $_SESSION['unorderedstack'];
}

$count = count($unorderedstack);

if(!empty($stack)){
    $i = 0;
    while($i < 10){
        $i ++;
        $mixing = $stack[array_rand($stack)];
        /* array_rand randomly returns the the key of $stack. In this scenario it's mixing the keys of the array */
        array_push($unorderedstack, $mixing);
        $coreinfo = array_search($mixing,$stack);
        if($coreinfo!==false){
            unset($stack[$coreinfo]);
        }
        /* Using array_search, once the file is located, the keys of the found file is used for the buttons ($currentpage, $lastpage and $thenextpage)*/
    }
}

if(isset($_GET['next'])){
    if(count($orderedstack) < 10){
        $thenextpage = array_pop($unorderedstack);
        array_push($orderedstack, $thenextpage);
        $coreinfo = array_search($thenextpage,$orderedstack);
        if($coreinfo!==false && count($orderedstack) > 1){
            $currentfile = $orderedstack[$coreinfo-1];
        }
        if($coreinfo!==false && count($orderedstack) > 2){
            $lastpage = $orderedstack[$coreinfo-2];
        }
    }
}    

if(isset($_GET['back'])){
    $prevfile = array_pop($orderedstack);
    array_push($orderedstack, $prevfile);    
    $coreinfo = array_search($prevfile,$orderedstack);
    if($coreinfo!==false  && count($orderedstack) > 2){
        $currentfile = $orderedstack[$coreinfo-2];
    }
    if($coreinfo!==false && count($orderedstack) > 3){
        $lastpage = $orderedstack[$coreinfo-3];
    }
    if($coreinfo!==false && count($orderedstack) > 2){
        $thenextpage = $orderedstack[$coreinfo-1];
    }
    $switch = array_pop($orderedstack);
    array_push($unorderedstack, $prevfile);
}

/*Using echo we created HTML tags and elements to create a form. We added buttons to navigate between the files. The form's method is get, since it's insensitive info, and the button's names is back and next. Using if statements and binary search, we were able to make sure no files were being repeated.*/

?>    
<html>
<head>
<title>Start.php  - Reece, Courtney and Ros</title>    
<style>
.box{
    text-align: center;     
}    
p{
    color: red;
}
h1{
    text-align: center;
}
</style>    
</head>    
<body>    

<?php
if (count($orderedstack) <=1) {
    echo '<h1>start.php</h1>';
    echo '<div class="box">
    <form method="GET">';
        echo '<button name = "next">This button will select a random sql{i}.php file</button>
    </form>
    </div>';
} elseif (count($orderedstack) <=2) {
    echo '<h1><a href=" '. $currentfile . '">' . $currentfile . ' </a></h1>
    <br>';
    echo '<div class="box">
        <form method="GET">
            <button name="back">Go back to start.php starting page</button>';
            echo '<p>' . $currentfile . ' is being displayed</p>';
            echo '<button name = "next">The next sql{i}.php file will be ' . $thenextpage . '</button>
        </form>
    </div>';
} elseif (count($orderedstack) < 10) {
    echo '<h1><a href=" '. $currentfile . '">' . $currentfile . ' </a></h1>
    <br>';
    echo '<div class="box">
    <form method="GET">
        <button name="back">The previous sql{i}.php file was ' . $lastpage . '</button>';
        echo '<p>' . $currentfile . ' is being displayed</p>';
        echo '<button name = "next">The next sql{i}.php file will be ' . $thenextpage . '</button>
    </form>
    </div>';
} elseif (count($orderedstack) == 10) {
    echo '<h1><a href=" '. $currentfile . '">' . $currentfile . ' </a></h1>
    <br>';
    echo '<div class="box">
    <form method="GET">
        <button name="back">You reached the last file, press here to go back</button>';
        echo '<p>' . $currentfile . ' is being displayed</p>
    </form>
    </div>';
}

$_SESSION['stack'] = $stack;
$_SESSION['unorderedstack'] = $unorderedstack;
$_SESSION['orderedstack'] = $orderedstack;
?>

<button type="button"><a href="logout.php" >Logout</a></button>
</body>
</html>

Хотелось бы узнать об укороченном способе сделать это, но все еще используя стек, или есть ли другие способы, которыми я могу выполнить это без стека?

Я хотел бы оптимизировать его для использования в Интернете, если это возможно для будущих проектов.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Чтобы «оптимизировать», я попытался уменьшить общее количество вызовов функций на протяжении всего приложения, сохраняя жизненно важные компоненты в массиве SESSION.

Вам не нужно хранить строку sql#.php в массиве стека - только целые числа, поскольку это единственная переменная часть строки.

По мере расширения вашего проекта, для массива стека существует единственная точка настройки. Кроме того, вы можете даже извлечь sql имена файлов из каталога, если хотите прервать вызов range().

Используя include для размещения содержимого файла sql на странице, вам никогда не придется перенастраивать назначение формы.

Я проверил это, чтобы работать на моем локальном хосте ...

Код:

<?php
session_start();
/* if(!isset($_SESSION['username']) ) {
    header("Location: login.html");
} */
?>

<html>
<body>
<form method="GET">
<?php
if (!isset($_SESSION['stack'], $_SESSION['id'])) {
    $_SESSION['stack'] = range(1, 10);                     // single point of adjustment as your project evolves/expands
    shuffle($_SESSION['stack']);                           // no subsequent rand() calls; shuffle once and only once
    $_SESSION['id'] = 0;                                   // init the current id
    $_SESSION['last_id'] = sizeof($_SESSION['stack']) - 1; // store the highest index
    echo "Ready to start this thing?";
    echo "<button>Let's Go!</button>";
} else {
    if (isset($_GET['back'])) {
        --$_SESSION['id'];                                 // decrement
    } elseif (isset($_GET['next'])) {
        ++$_SESSION['id'];                                 // increment
    }

    if ($_SESSION['id'] > $_SESSION['last_id']) {
        echo "<h1>Congratulations, you've finished.</h1>";
        session_destroy();                                     // just for my testing
        echo "<button>Play again?</button>";
    } else {
        echo "<div>DISPLAY sql{$_SESSION['stack'][$_SESSION['id']]}.php as page " . ($_SESSION['id'] + 1) . " of " . ($_SESSION['last_id'] + 1) ."</div>";
        //include("sql{$_SESSION['id']}.php");  // I recommend an absolute path to avoid monkeybusiness

        if ($_SESSION['id'] == 0) {
            echo "<button disabled>No Way</button>";
        } else {
            echo "<button name=\"back\">Back</button>";
        }
        if ($_SESSION['id'] == $_SESSION['last_id']) {
            echo "<button name=\"next\">Finish</button>";
        } else {
            echo "<button name=\"next\">Next</button>";
        }
    }
}
?>
</form>
</body>
</html>
0 голосов
/ 08 мая 2018

Вкл. start.php вам нужно:

// build a list of sql.php pages
$_SESSION[ 'sql_pages' ] = explode( ' ', 'sql'.implode( '.php sql', range(1, 10) ).'.php' );

// randomize those pages
shuffle($_SESSION[ 'sql_pages' ]);

$pop = array_pop($_SESSION[ 'sql_pages' ]);
echo '<a href="'.$pop.'">'.$pop.'</a>';

и на sql {x} .php нужных страницах:

if(isset($_SESSION[ 'sql_pages' ]) && count($_SESSION[ 'sql_pages' ]) > 0)
{
    $pop = array_pop($_SESSION[ 'sql_pages' ]);
    echo '<a href="'.$pop.'">'.$pop.'</a>';
}
else
{
    echo 'No more pages!';
}
...