0

我正在尝试实现一个利用 jquery 的 post 功能动态更新数据库的表单。我意识到的是,在用户单击“更新”按钮后,成功函数会被回调,并显示“更新成功”消息。

我对 stackoverflow 世界的问题是为什么在随后的点击中(不刷新页面)我没有收到同样的成功消息。此外,具有讽刺意味的是,我的数据库正在更新,所以我知道 AJAX 调用正在通过。

我在下面发布了我的代码:

JS

var TEAM = { 
update: function() {

    var form_data = $('form').serialize();
    $.ajax({
        type: "POST",
        url: "../manager/edit_team.php",
        data: form_data,
        error: function() {
            $('#status').text('Update failed. Try again.').slideDown('slow');
        },
        success: function() {
            $('#status').text('Update successful!');
        },
        complete: function() { 
            setTimeout(function() {
                $('#status').slideUp('slow');
                }, 3000);
        },
        cache: false
    });
}
}

// jQuery Code for when page is loaded
$(document).ready(function()
{
 $("#update").on("click", function() {
     TEAM.update();
 });
 });

PHP(我也欢迎任何其他评论)

require '../includes/config.php';
include '../includes/header.html';

// autoloading of classes
function __autoload($class) {
    require_once('../classes/' . $class . '.php');
}

// Site access level -> Manager
$lvl = 'M'; 

// Assign user object from session variable
if (isset($_SESSION['userObj']))
{
    $manager = $_SESSION['userObj'];
}
else 
{
    session_unset();
    session_destroy();
    $url = BASE_URL . 'index.php';
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

// Establish database connection
require_once MYSQL2;

// Assign Database Resource to object
$manager->setDB($db);

// Authorized Login Check
if (!$manager->valid($lvl))
{
    session_unset();
    session_destroy();
    $url = BASE_URL . 'index.php';
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

// Check for a valid game sch ID, through GET or POST:
if ( (isset($_GET['z'])) && (is_numeric($_GET['z'])) )
{
    // Point A in Code Flow
    // Assign variable from myteams-m.php using GET method
    $id = $_GET['z'];
}
elseif ( (isset($_POST['z'])) && (is_numeric($_POST['z'])) )
{
    // Point C in Code Flow
    // Assign variable from edit_team.php FORM submission (hidden id field)
    $id = $_POST['z'];
}
else 
{
    // No valid ID, kill the script.
    echo '<p class="error">This page has been accessed in error.</p>';
    include '../includes/footer.html';
    exit();
}

$team = new ManagerTeam();
$team->setDB($db);
$team->setTeamID($id);
$team->pullTeamData();

$flag = 0;
echo $flag . "<br />";
// Confirmation that form has been submitted:   
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{   // Point D in Code Flow

    // Assume invalid values:
    $tname = FALSE;

    // Validate team name
    if ($_POST['tname'])
    {
        $tname = $_POST['tname'];

    }
    else 
    {
        echo '<p class="error"> Please enter a team name.</p>';
    }       

    // Validate about team information
    if ($_POST['abouttm'])
    {
        $abtm = trim($_POST['abouttm']);

    }
    else 
    {
        $abtm = '';
    }

    // Check if user entered information is valid before continuing to edit game
    if ($tname)
    {
        if($team->editTeam($tname, $abtm) == True)
        {
            echo '<p>Team was successfully updated</p>';
            $flag = 1;
        }
        else 
        {
            echo '<p>No changes were made</p>';
            $flag = 2;
        }
    }
    else
    {   // Errors in the user entered information
        echo '<p class="error">Please try again.</p>';
    }

}   // End of submit conditional.
echo $flag . "<br />";
// Point B in Code Flow
// Always show the form...

// Get team name attribute
$team->pullTeamData();
$teamname = $team->getTeamAttribute('tmname');
$about = $team->getTeamAttribute('about');

if ($teamname != '') // Valid user ID, show the form.   
{
    // Headliner
    echo '<h2>Edit Team</h2>';

    // Create the form:
    echo '
    <div id="EditTeam"></div>
    <div id="Team">
        <fieldset id="TeamDetails">
            <legend>Edit Team</legend>
            <form method="post" id="information">
            <p id="status"></p>
            <input type="hidden" name="z" value="' . $id . '" />                
            <p>
                <label for="tname">New Team Name:</label><br/>
                <input type="text" name="tname" id="tname" size="10" maxlength="45" value="' . $teamname . '" />
            </p>
            <p>
                <label for="abouttm">Team Information:</label><br/>
                <textarea id="abouttm" name="abouttm" cols="30" rows="2">"' . $about . '"</textarea><br />
                <small>Enter something cool about your team.</small>
            </p>
            <p>
                <input type="hidden" name="id" id="id">
                <input type="button" value="update" id="update" />
            </p>
        </form>
        </fieldset>
    </div>';                

}
else 
{   //Not a valid user ID, kill the script
    echo '<p class="error">This page has been accessed in error.</p>';
    include '../includes/footer.html';
    exit();
}   

// Close the connection:
$db->close();
unset($db);

include '../includes/footer.html';
?>

你会注意到我还定义了一个 $flag 来帮助调试,但具有讽刺意味的是,无论点击“更新”按钮的次数如何,它都会输出 0。所以没有迹象表明数据库正在更新,但是当我检查表时,它肯定是。

我感谢任何帮助或指示。谢谢,

4

1 回答 1

2

#status消息未显示,因为您已将其隐藏slideUp()要再次显示,您需要向slideDown()他们显示。

    success: function() {
        $('#status').text('Update successful!');
-ADD->  $('#status').slideDown('slow');
    },
    complete: function() { 
        setTimeout(function() {
            $('#status').slideUp('slow');
            }, 3000);

执行方式与在错误处理程序中执行的方式相同:
success: function(){
$('#status').text('Update successful!').slideDown('slow');
...

好像你早就知道了,只是忘记了……

其他可能有用的方法是stop()确保在新动画开始时停止先前的动画,这在使用超时/动画时尤其重要。
(有用=可以防止其他可见性问题并确保消息不会开始跳进跳出
(长=大约0,5-1,5秒或更长,如果在此期间可能发生其他事情,那么它很长... )

例如,这将clear fx queue和: finish running animation immediatelyslideUp()

$('#status').stop(true, true).slideUp('slow');

您还询问了对其他代码部分的建议

如果您至少两次使用相同的代码,或者如果它是可以重用的通用方法,请使其可重用:

function redirect_to( $page ) {
    session_unset();
    session_destroy();
    $url = BASE_URL . $page;
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

if ($condition == true) {
    redirect_to( 'index.php' );`
}
于 2012-05-03T09:08:53.670 回答