0

jquery の投稿機能を利用してデータベースを動的に更新するフォームを実装しようとしています。私が認識しているのは、ユーザーが「更新」ボタンをクリックした後、成功関数が「更新成功」メッセージで正常に呼び出されることです。

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()ことを確認することです。特に、長いタイムアウト/アニメーションを使用する場合は重要です。
(便利=可視性に関する他の問題を防ぎ、メッセージが飛び出したり飛び出したりしないようにすることができます
(long = 0.5〜1.5秒以上のどこか、この間に何か他のことが起こる可能性がある場合は、長い...

たとえば、これはclear fx queue、、finish running animation immediatelyおよびslideUp()

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

コードの他の部分についても提案を求めました

同じコードを少なくとも2回使用している場合、または再利用できる一般的な方法である場合は、再利用可能にします。

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 に答える