PHP:想要在提交表单和重新加载自处理表单时保留持久变量

标签 php mysql forms

我正在使用 PHP 和 MySQL 创建一个锻炼记录器。我当前设置的方式是,用户使用选择来选择锻炼模板 - 并将该值发布到表单页面。模板名称用于在数据库中查询该模板中所有练习的名称以及每个练习的组数。名称和集合放入并行数组中。

调用生成表单的函数。模板名称的元素(例如全身锻炼),运动名称的元素(例如杠铃硬拉),以及组数的元素,带有标签/输入对:重量、次数、休息和注释。

Screenshot

练习名称变量的增量是 $_SESSION 中的计数器,每次成功插入数据库后该计数器都会递增。

我的问题是关于逻辑方面的。如何增加 $_SESSION 变量而不将其重置为零?

 session_start();
//User
$user   = $_SESSION['email'];
$date   = date("Y-m-d");

//Get this script
$thisScript     = htmlentities($_SERVER['PHP_SELF']);

//This is the value I want to keep persistent
$_SESSION['nameCount'] = (int)0;
$nameCount = $_SESSION['nameCount'];

//Value from select
$template  = $_POST['mySelect'];
//Set log submit button
$logSubmit  = $_POST['logSubmit'];

//Check if user is signed in    
if ($user) {
   if ($template)  {
    require_once("include/connect2db.inc.php");
    require_once("include/htmlHead.inc");

    //Return query
    $result     = getResult($template); //Returns result of template
    $numRows    = getExerciseNum($result);
    $exerciseArray  = exerciseList($result, $numRows); //Returns set of exercises in template

    //For some reason, $result and $numRows is empty after being passed into $exerciseArray
    //Reinitialize  
    $result     = getResult($template);     //Returns result of template
    $numRows    = getExerciseNum($result);  //numRows
    $setsArray  = getSets($result, $numRows);   //Gets number of sets as array 

    //Reinitialize  
    $result     = getResult($template); //Returns result of template
    $numRows    = getExerciseNum($result);
    $exerciseIDArray = exerciseIDList($result, $numRows);

    //Build form
    buildLog($thisScript, $template, $exerciseArray, $setsArray, $numRows, $date, $nameCount, $exerciseIDArray);

    //Require Footer
    require_once("include/htmlFoot.inc");
    mysql_close();
   } else if (empty($template)){
    //Do something if template is empty    
    require_once("include/connect2db.inc.php");
    require_once("include/htmlHead.inc");

    echo "<p>Seems the template is empty</p>\n";
    echo "<p>Template = $template</p>\n";

    //Require Footer
    require_once("include/htmlFoot.inc");
    mysql_close();
   } //End if ($template)
} else if (!isset($user)) {
    //If user not logged in
    require("include/redirect.php");
}

相关功能如下:构建日志构建表单,插入随之而来

//Build log form using query result and exercise name increment ($x)
function buildLog($thisScript, $template, $exerciseArray, $setsArray, $numRows, $date, $nameCount, $exerciseIDArray) {

$logSubmit  = $_POST['logSubmit'];

if (!isset($logSubmit)) {
    echo "<form action='$thisScript' method='POST' name='log' id='log'>\n";
    echo "<fieldset>\n";
    echo "<legend>$template</legend>\n";

    echo "<h2>$exerciseArray[$nameCount]</h2>\n";
    echo "<input type='hidden' name='exerciseArray[]' value='$exerciseArray[$nameCount]'/>\n";
    $j = 1;
    //Generate exercise form with loop
    for ($i=0; $i < $setsArray[$i]; $i++) {

        echo "<fieldset>";
        echo "<legend>Set $j</legend>\n";
//Use $template in a hidden value to work around issue of value being lost after submitting form
echo <<<BODYDOC
    <label>Weight</label>
    <input type="text" name="weight[]" required /> \n

    <label>Reps</label>
    <input type="number" name="reps[]" required /> \n

    <label>Rest Time</label>
    <input type="number" name="rest[]" required /> \n

    <label>Notes</label>
    <textarea name="notes[]"></textarea>
    <input type="hidden" name="set[]" value='$j' /> 
    <input type="hidden" name='mySelect' value='$template' />

</fieldset>
BODYDOC;
    $j++;
    } //End form for loop
echo "<br /><button type='submit' name='logSubmit'>Submit</button>\n";
echo "</fieldset>\n";
echo "</form>\n";
echo "<p><a href='newday.php'>Back</a></p>\n";

//Increment exerciseNameArray counter so next form dispays next exercise name
} //End if empty submit
if (isset($logSubmit)) {
    //POSTed
    $template   = $_POST['mySelect'];
    $set        = $_POST['set'];
    $weight     = $_POST['weight'];
    $reps       = $_POST['reps'];
    $rest       = $_POST['rest'];
    $notes      = $_POST['notes'];
    $user       = $_SESSION['email'];
    //Increment exercise name counter
    $nameCount++;
    //Update Log
    updateLog($user, $template, $exerciseArray, $set, $weight, $reps, $rest, $notes, $date, $nameCount, $exerciseIDArray);

} //End else if
} //End buildLog($template, $x) function

function updateLog($user, $template, $exerciseArray, $set, $weight, $reps, $rest, $notes, $date, $nameCount, $exerciseIDArray) {

    //Insert data with query
    $numRows = count($exerciseArray);

    //Insert user,exercise name, and date 
        $insert = "INSERT INTO stats_resistance
                   (user, exerciseName, date)
                   VALUES
                   ('$user','$exerciseArray[$nameCount]', '$date')" 
                   or
                   die(mysql_error());

        $result = mysql_query($insert)
        or
        die("<b>Query Failed</b><br>$insert<br>" . mysql_error());

    //Query for stat_ID
        $query = "SELECT statsID
              FROM stats_resistance
              WHERE user = '$user'
              AND exerciseName = '$exerciseArray[$nameCount]'
              AND date = '$date'";

        //Get result
        $result = mysql_query($query)
        or
        die("<b>Query Failed</b><br>$query<br>" . mysql_error());

        $statsID = mysql_fetch_object($result);
        $statsID = $statsID->statsID;
        //echo "statsID = " . $statsID;

    //Insert into resistanceSets with statsID as foreignKey
    //Can insert multiple value sets by including comma after set parentheses
            $insert =   "INSERT INTO resistanceSets
                     (statsID, exerciseID, setID, exerciseName, weight, numReps, rest, notes)
                     VALUES
                     ('$statsID', '$exerciseIDArray[$nameCount]', '$set[0]', '$exerciseArray[$nameCount]', '$weight[0]', '$reps[0]', '$rest[0]', '$notes[0]'),
                     ('$statsID', '$exerciseIDArray[$nameCount]', '$set[1]', '$exerciseArray[$nameCount]', '$weight[1]', '$reps[1]', '$rest[1]', '$notes[1]'),
                     ('$statsID', '$exerciseIDArray[$nameCount]', '$set[2]', '$exerciseArray[$nameCount]', '$weight[2]', '$reps[2]', '$rest[2]', '$notes[2]')";

            $result = mysql_query($insert)
            or
            die("<b>Query Failed</b><br>$insert<br>" . mysql_error());

//buildLog($thisScript, $template, $exerciseArray, $setsArray, $numRows, $date, $nameCount, $exerciseIDArray); 
} //End updateLog()

最佳答案

确保变量已设置是一个简单的问题,如果设置了变量,则像任何其他变量一样递增它。

if(isset($_SESSION['nameCount'])) {
    $_SESSION['nameCount']++;
}

或者,如果您已将 session 变量的值设置为局部变量,您可以增加此局部变量并将该值重新分配给 session 变量。即

$nameCount++;
$_SESSION['nameCount'] = $nameCount;

两者都会得到相同的结果。

关于PHP:想要在提交表单和重新加载自处理表单时保留持久变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43669657/

相关文章:

mysql - 业力追踪报告 : Should use redis-only or redis-mysql hybrid?

php - 使用 silex 发布值(表单提交)

php - 如何验证表单是否为空? PHP 或 JS

php - 没有带有表单类的实体的验证表单

php - 检查所有数组值是否存在于另一个数组值中

mysql - 如何计算 mysql 工作台中一天执行的事务数?

python - 表单无效后django上下文表单未呈现

php - 在标题后立即将按钮/链接添加到自定义帖子类型编辑屏幕

php - 修改 PHP 对象属性名称

php - 警告:mysqli::bind_param():变量数与动态分配变量时准备语句中的参数数不匹配