【问题标题】:PHP: Want to keep a persistent variable when submitting form and reloading self-processing formPHP:希望在提交表单和重新加载自处理表单时保留一个持久变量
【发布时间】:2017-09-25 22:47:39
【问题描述】:

我正在使用 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()

【问题讨论】:

  • 测试isset($_SESSION['nameCount']),如果为真,则递增,如果为假,则初始化。
  • 警告:如果您只是学习 PHP,请不要使用mysql_query 接口。它是如此可怕和危险,以至于在 PHP 7 中被删除。像 PDO is not hard to learn 这样的替代品和像 PHP The Right Way 这样的指南解释了最佳实践。您的用户数据不是properly escaped,有SQL injection bugs,可以被利用。
  • 好的,增加了它,但是插入后,它显示一个空白页。我将如何返回表单页面、meta="refresh" 或 header() 而无需编辑我的包含文件?
  • 谢谢你。这是一个老式 apache 服务器上的学校项目,我不打算上线(至少这个版本)。防止注入目前不是问题,但我确实计划在服务器升级后使用 MySQLi 或 PDO。

标签: php mysql forms


【解决方案1】:

确保设置变量是一件简单的事情,如果它像任何其他变量一样增加它。

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

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

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

两者的结果相同。

【讨论】:

  • 好的,一个小的跟进。插入完成后,它会显示一个空白页面,因为插入后没有设置任何内容。是在插入末尾使用 meta="refresh" 或 header() 重新加载脚本的唯一方法吗?如果是这样,那意味着我将不得不移动已经包含标题的包含文件。
  • 如果您需要使用新数据重新加载页面,我会使用 header();我真的不明白你的包含文件有什么问题。
  • Mick Watkins - 如果用户登录并且有模板,我目前在生成 html 头的地方拥有它。所以当程序进入insert查询的时候,已经有一个header发送过来了。
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多