重复自我处理表格

时间:2017-04-22 17:02:13

标签: javascript php mysql html5

我的问题是创建一个自我处理表单,该表单插入数据库然后刷新,递增数组以更改表单中的相关信息。 (虽然如果有更容易或更好的方法来做到这一点,我会全力以赴)。

因此,网站基本上是数字等同于运动日记。用户从选择菜单中选择模板名称,然后在数据库中查询该模板,然后将结果返回给变量。每个练习的练习名称和组数(将用于计算表单刷新的最大数量)将传递到它们各自的数组中:$ exerciseName [];和$ setNum [];

This is a screenshot of the form. 我的问题是如何设置逻辑,以便我可以继续提交,直到最后一次练习的最后一组,在最终提交时,将进入另一页。

我正在使用mysql_函数,我知道这是不受欢迎的,但它适用于使用PHP 5.2.12的学校,这是我的队友所知道的,所以我没有其他选择。我还没有尝试阻止mysql注入,因为我不打算在线使用这个版本。

以下是选择锻炼类型和锻炼模板的代码:

    session_start();
$user   = $_SESSION['email'];
//This script
$thisScript = htmlentities($_SERVER['PHP_SELF']);

if ($user) {
    require("include/connect2db.inc.php");
    require("include/htmlHead.inc");
    //Default page buttons
    $cardioBtn  = $_POST['cardioBtn'];
    $resistanceBtn  = $_POST['resistBtn'];

    //Cardio submit
    $cardioSubmit   = $_POST['cardioSubmit'];

if ((empty($cardioBtn)) 
    && (empty($resistanceBtn)) 
    && (empty($selectSubmit))
    && (empty($cardioSubmit))) {
echo <<<BODYDOC
<article id="newDayArticle">
    <header>
        <h2>Category</h2>
    </header>
    <fieldset id="ndFieldset">
    <form action="$thisScript" method="POST" >
        <button id="cardioButton" name="cardioBtn" value="cardioBtn" >Cardio</button>
        <button id="resistanceButton" name="resistBtn" value="resistBtn" >Resistance</button>
    </form>
    </fieldset>
<!--    <div id="selection"></div>
    <div id="template"></div>       -->
</article>
BODYDOC;
} else if (isset($cardioBtn)) {
    //Build cardio form
    echo "<h2>Cardio</h2>";
    echo <<<BODYDOC
    <fieldset>
    <legend>Cardio Log</legend>
    <form action="$thisScript" method="POST">
        <input type="number" name="distance" placeholder="Distance of Run" required />
        <input type="number" name="duration" placeholder="Run Duration" required /> 
    <button id="cardioSubmit" name="cardioSubmit">Submit</button>
    <button id="back" type="button" onclick="document.location.href='newday.php';" value="Back">Back</button>
    </form>
    </fieldset>
BODYDOC;
} else if (isset($cardioSubmit)) {
        $thisScript = htmlentities($_SERVER['PHP_SELF']);
        //Cardio page
        $distance   = $_POST['distance'];
        $duration   = $_POST['duration'];
        $date       = date("Y-m-d");    
        //Submit cardio data to DB
        updateCardio($distance, $duration, $user, $date);
        //Show user stats in table
        cardioStats($distance, $duration);
//End cardio form
} else if (isset($resistanceBtn)) {
    //Workout template select
    $selectSubmit   = $_POST['selectSubmit'];
    //page to select workout template
    buildSelect();
    //End resistance select
}//End else if

//Require footer
require("include/htmlFoot.inc");
mysql_close();
} else {
//Redirect users not logged in
    require("include/redirect.php");
} //End redirect else

这是用于构建表单并将其插入数据库的select函数和函数。

    function buildSelect() {
        //Check if resistance button submitted
        //Query for template names
        $query  = "SELECT templateName, templatePosition
               FROM templates
               WHERE userID = 0
               ORDER BY templatePosition";
        $result = mysql_query($query)
        or
        die("<b>Query Failed</b><br /> $query<br />" . mysql_error());
        //Find number of rows
        $numRows = mysql_num_rows($result);

        //Array with spaces/capitals
        $templateArray = array();

        //Array with no spaces/no capitals
        $noSpacesArray = array();

        //Get template names and build arrays
        for ($i=0; $i < $numRows; $i++) {
            while($row = mysql_fetch_row($result)) {
                $templateName   = $row[0];
                $position   = $row[1];

                //Build array in order by pushing to $templateArray
                array_push($templateArray, $templateName);

                //Build array without spaces or capitals in $noSpacesArray()
                $templateName = str_replace(' ', '', $templateName);    
                $templateName = strtolower($templateName);
                array_push($noSpacesArray, $templateName);
            } //End while
        }//End for
        //Check array values
        //print_r($templateArray);
        //print_r($noSpacesArray);
        //Build page
echo <<<BODYDOC
<br />
<h2>Resistance</h2>
<form action="log.php" method="POST" >
<fieldset>
<legend>Resistance Templates</legend>\n
BODYDOC;

    echo "<select name='mySelect' id='mySelect'>\n";
    echo "\t<option value=''>Choose One</option>\n";

    //Build Template
    //Build Template
    for ($i=0; $i < count($templateArray); $i++) {
        //value='$noSpacesArray[$i] is for no spaces, all lower case
        //value='$templateArray[$i] is for First letter capital, with spaces
        echo "\t<option value='$templateArray[$i]'>$templateArray[$i]</option>\n";
    } //End list generation
    echo "</select>\n"; 

echo <<<BODYDOC
<input type="submit" name="selectSubmit" value="Submit" />
<br />
</fieldset>
</form>
BODYDOC;
} //End function buildSelect

//Function uses template name as argument in an SQL query to find exercise template
//Returns exercise IDs, exercise names, and # of sets per exercise in that template 
function getResult($template) {
    //Query template name and get templateID
    $query  = "SELECT templateID
           FROM templates
           WHERE templateName = '$template'"; 

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

    //This part made me smash my head into a wall 
    $templateID = mysql_fetch_object($result);
    $templateID = $templateID->templateID;

    //Get exercise template, exercise names, and number of sets with query
    $query  = "SELECT exerciseID, exerciseName, numSets
           FROM exercises
           WHERE templateID = $templateID";

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

    return $result;
} //End getExercises
//Get number of exercises
function getExerciseNum($result) {
    //Get number 
    $numRows = mysql_num_rows($result);
    return $numRows;
}//End getExerciseNum
//Get exercise names as array
function exerciseList($result, $numRows) {
    //Initialize exercise name array 
    $exerciseArray  = array();
    //Exercise array increment  
    //
    for ($i=0; $i < $numRows; $i++) {
        while($row = mysql_fetch_row($result)) {
            $exerciseName   = $row[1];
        //Push names to array
        array_push($exerciseArray, $exerciseName);
        } //End while
    } //End for
    //Return name array
    return $exerciseArray;
}//End exerciseList()

//Get number of sets per exercise
function getSets($result, $numRows) {
    //
    $setsArray  = array();
    //
    for ($i=0; $i < $numRows; $i++) {
        while($row = mysql_fetch_row($result)) {
            $numSets    = $row[2];
            //Push to array
            array_push($setsArray, $numSets);
        } //End while
    } //End for
    //Return array
    return $setsArray;
} //End setsPerExercise()

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

$logSubmit  = $_POST['logSubmit'];
//echo "numRows = " . $numRows;
static $x   = 0;
echo "<br />X = $x";
if (empty($logSubmit)) {
    echo "<form action='$thisScript' method='POST' name='log' id='log'>\n";
    echo "<fieldset>\n";
    echo "<legend>$template</legend>\n";

    echo "<h2>$exerciseArray[0]</h2>\n";
    echo "<input type='hidden' name='exerciseArray[]' value='$exerciseArray[$x]'/>\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'];

    //Update Log
    updateLog($user, $template, $exerciseArray, $set, $weight, $reps, $rest, $notes, $date);
} //End else if
} //End buildLog($template, $x) function

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

    //Insert data with query
    $numRows = count($exerciseArray);
    echo "count exerciseArray = " . $numRows;
    for ($i=0; $i < $numRows; $i++) {   
        $insert[$i] = "INSERT INTO stats_resistance
                   (userID, template, exerciseName, set, weight, reps, rest, notes, date)
                   VALUES
                   ('$user','$template', $exerciseArray[$i]','$set[$i]','$weight[$i]','$reps[$i]','$rest[$i]', '$notes[$i]', '$date')" 
                   or
                   die(mysql_error());

        $result[$i] = mysql_query($insert[$i])
        or
        die(mysql_error());
    } //End for
    //Increment $x and pass it back to buildLog
    //$x++;
    //return $x;
} //End updateLog()

这是log.php表单文件: 编辑:为PHP_SELF添加了htmlentities并改变了一些逻辑。

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

//
$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");
    //Get this script
    $thisScript     = htmlentities($_SERVER['PHP_SELF']);

    //Return query
    $result     = getResult($template); //Returns result of template
    //numRows
    $numRows    = getExerciseNum($result);
    //Return exercise array
    $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
    $numRows    = getExerciseNum($result);
    //Return sets per exercise as array
    $setsArray  = getSets($result, $numRows); 

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

    //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 (($user) && (isset($logSubmit))) {
//If user is signed in and log has been submitted
//Get form values and insert into database
    require("include/connect2db.inc.php");
    require_once("include/htmlHead.inc");
    //Get this script
    $thisScript     = htmlentities($_SERVER['PHP_SELF']);

    echo "<pre>\n";
    echo "print_r of POST<br />";
    print_r($_POST);
    echo "</pre>\n";
    //Get Workout and POST info
    $template   = $_POST['mySelect'];
    $set        = $_POST['set'];
    $weight     = $_POST['weight'];
    $reps       = $_POST['reps'];
    $rest       = $_POST['rest'];
    $notes      = $_POST['notes'];
    //Check if form is submitted, if so, insert into db
    updateLog($user, $template, $exerciseArray, $set, $weight, $reps, $rest, $notes, $date);

    echo "<p>Entered update log else/if block</p>\n";

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

1 个答案:

答案 0 :(得分:1)

您可以在表单的操作中使用PHP_SELF(例如<?php echo htmlentities ($ _ SERVER ['PHP_SELF']); ?>)。 See this article解释了我们需要htmlentities的原因。此PHP_SELF变量包含当前脚本的路径。

您可以在模板之前放置的所有逻辑,您应该检查以下内容:

  • 是否发生过提交的页面?
    • 如果是,请检查提交数据的错误。
      • 如果没有错误,则处理并保存信息。如果发送包含模板错误的数组。
  • 如果没有,无所事事。

因此,当提交表格时,一切都将在同一页面上提交。