doujie1908 2017-04-22 17:02
浏览 42
已采纳

重复自我处理表格

My question is over creating a self-processing form that inserts to a database and then refreshes, incrementing arrays to change relevant info in the form. (though if there is an easier or better way to do this, I'm all ears).

So site is essentially a digital equivalent to an exercise journal. The user selects a template name from a select menu, then it queries the database for that template, then returns the result to a variable. The exercise names and number of sets per exercise (which will be used to calculate maximum number of form refreshes) are passed into their own respective arrays: $exerciseName[]; and $setNum[];

This is a screenshot of the form. My question is how to go about setting up the logic so that I can keep submitting until the last set of the last exercise, where upon the final submission, would take to a different page.

I am using mysql_ functions, which I know is frowned upon, but it is for school which uses PHP 5.2.12 and that is what my teammates know so I have no other options. I haven't tried to prevent mysql injections because I don't intend to take this version online.

Here is the code for selecting type of workout and workout template:

    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

Here is the select function and functions for building the form and inserting it into the database.

    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>

BODYDOC;

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

    //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>
";
    } //End list generation
    echo "</select>
"; 

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'>
";
    echo "<fieldset>
";
    echo "<legend>$template</legend>
";

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

        echo "<fieldset>";
        echo "<legend>Set $j</legend>
";
//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 /> 


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


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


    <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>
";
echo "</fieldset>
";
echo "</form>
";
echo "<p><a href='newday.php'>Back</a></p>
";

//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()

Here is the log.php form file: Edit: Added htmlentities to PHP_SELF and changed some logic.

    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>
";
    echo "<p>Template = $template</p>
";

    //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>
";
    echo "print_r of POST<br />";
    print_r($_POST);
    echo "</pre>
";
    //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>
";

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

1条回答 默认 最新

  • duan1396 2017-04-22 18:03
    关注

    You can use PHP_SELF (eg <?php echo htmlentities ($ _ SERVER ['PHP_SELF']); ?>) In the action of the form. See this article which explains why we need htmlentities. This PHP_SELF variable contains the path to the current script.

    All the logic you can place where you have, before the template, where you should check the following:

    • Did happen a page submit?
      • If yes, check for errors with submitted data.
        • If there are no errors treats and saves the information. If there are send an array with errors for the template.
    • If not, nothing to do.

    Thus, when there is submission of the form everything will always be submitted on the same page.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档