【问题标题】:Update record with AJAX without refreshing form使用 AJAX 更新记录而不刷新表单
【发布时间】:2014-10-17 09:41:31
【问题描述】:

我正在尝试在不刷新表单的情况下更新数据库中的记录。我有grid.php 页面,其中包含用于显示和更新记录的表单。然后,我有文件update.php 和UPDATE 查询。第三个文件是js1.js,带有 AJAX 代码。如果我通过action=update.php 将grid.php 映射到update.php,则更新查询效果很好。但是,一旦我尝试包含 js1.js 文件以防止表单刷新,它就会停止工作。

代码如下:

grid.php

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="j1.js"></script>
<?php //query.php
    require_once 'header.php';
    if (!$loggedin) die();

    $query = "SELECT SpringMgmt.SpringMgmtID, 
                     SpringMgmt.SpringMgmtActiveYear, 
                     SpringMgmt.PoolID, 
                     SpringMgmt.Notes, 
                     SpringMgmt.SOIEstSubmitted,
                     SpringMgmt.EstAdditional, 
                     SpringMgmt.SOIMeetingScheduled, 
                     Pool.Pool, 
                     Pool.AreaManager, 
                     Employees.EmployeeID, 
                     Employees.FirstName
              FROM SpringMgmt
                   INNER JOIN Pool ON SpringMgmt.PoolID = Pool.PoolID
                   INNER JOIN Employees ON Employees.EmployeeID = Pool.AreaManager ";
    $result = mysql_query($query);
    echo "OK</div>";
    if (!$result) die ("Database access failed0: " . mysql_error());

    //TABLE AND ITS HEADING
    echo '<table id="header" cellpadding="0" cellspacing="0" border="0" >';
    echo "
    <tr> 
    <th>Pool</th>
    <th>Notes</th>
    <th>SO Sent</th>
    <th>Est</th>
    <th>Meet Date</th>
    </tr> 
    ";
    while($record = mysql_fetch_array($result)){
        echo "<form id='myForm' name='myForm'  method=post>";
        echo "<tr>";
        echo "<td >$record[Pool]</td>";
        echo "<td ><textarea size=4 name=Notes rows=3 cols=22>$record[Notes]</textarea> </td>";
        echo "<td style=background-color:><input type=text size=3 name=SOIEstSubmitted value='$record[SOIEstSubmitted]' /></td>";
        echo "<td ><textarea size=4 name=EstAdditional rows=3 cols=12>$record[EstAdditional]</textarea></td>";
        echo "<td style=background-color:><input type=text size=3 name=SOIMeetingScheduled value='$record[SOIMeetingScheduled]' /></td>";
        echo "<td>
              <input type=hidden name='SpringMgmtID' value=$record[SpringMgmtID] />
              <input type=submit name='submit' id='submit' value='Submit' />
              </div></td>";
        echo "</tr>";
        echo "</form>";
    }
    echo "</table>";
?>   

update4.php:

<?php 
    require_once 'header.php';
    if (!$loggedin) die();

    if(isset($_POST['submit'])){
        $UpdateQuery = "UPDATE SpringMgmt 
                        SET    Notes='$_POST[Notes]',
                               SOIEstSubmitted='$_POST[SOIEstSubmitted]',
                               EstAdditional='$_POST[EstAdditional]',
                               SOIMeetingScheduled='$_POST[SOIMeetingScheduled]'
                        WHERE SpringMgmtID='$_POST[SpringMgmtID]'";
        mysql_query($UpdateQuery);
    };
?>

js1.js

$(function () {

    $('form').on('submit', function (e) {

        e.preventDefault();

        $.ajax({
            type: 'post',
            url: 'update4.php',
            data: $('form').serialize(),
            success: function () {
                alert('form was submitted');
            }
        });

    });

});

【问题讨论】:

  • 你能缩进你的代码吗!
  • 由于您在循环中构建表单,您将拥有n 的表单数量。您没有指定在data: $('form').serialize(), 中序列化哪个form。
  • 我希望这不是您在项目中使用的 SQL 代码。如果是,会受到 SQL 注入的影响。您应该阅读stackoverflow.com/questions/60174/…,然后使用 MySQLi 或 PDO 和参数化查询重写它。
  • 除了肖恩的回复,我相信(无法检查)你应该把data: $('form').serialize(),这一行改成data: $(this).serialize(),

标签: php jquery mysql ajax ajaxform


【解决方案1】:

好的,所以我将尝试一些事情并快速帮助您。

查询

你的问题很复杂,但我觉得没必要。我已经用 MySQL 做了很长一段时间了,我不记得我在你的方法中使用 INNER JOIN 的情况。因此,您的查询的语法要短得多:SQL Aliases

$query = "SELECT s.*, p.Pool, p.AreaManager, e.EmployeeID, e.FirstName
              FROM SpringMgmt as s, Pool as P, Employees as E
              WHERE s.PoolID = p.PoolID AND e.EmployeeID = p.AreaManager ";

HTML

假设您的脚本中的 HTML 是您希望它显示的方式,这里有几件事:您可以转义双引号,这样它们就不会破坏您的代码。我会将循环内的代码更改为:Click Here 以了解我在您的代码中添加的 ".$variable." 语句

echo "<form id=\"myForm\" name=\"myForm\"  method=\"post\">";
        echo "<tr>";
        echo "<td data-field-id=\"pool\">".$record['Pool']."</td>";
        echo "<td ><textarea data-field-id=\"notes\" size=\"4\" name=\"Notes\" rows=\"3\" cols=\"22\">".$record['Notes']."</textarea> </td>";
        echo "<td style=\"background-color:\"><input data-field-id=\"submitted\" type=\"text\" size=\"3\" name=\"SOIEstSubmitted\" value=\"".$record['SOIEstSubmitted']."\" /></td>";
        echo "<td ><textarea size=\"4\" data-field-id=\"additional\" name=\"EstAdditional\" rows=3 cols=\"12\">".$record['EstAdditional']."</textarea></td>";
        echo "<td style=\"background-color:\"><input data-field-id=\"meetingScheduled\" type=\"text\" size=\"3\" name=\"SOIMeetingScheduled\" value=\"".$record['SOIMeetingScheduled']."\" /></td>";
        echo "<td>
              <input type=\"hidden\" name=\"SpringMgmtID\" value=\"$record[SpringMgmtID]\" />
              <input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Submit\" />
              </div></td>";
        echo "</tr>";
        echo "</form>";

AJAX/Javascript 调用

这解释起来有点复杂。 jQuery ajax 对象success 函数可以接受一些参数来帮助您处理请求。更多解释见this link。跳转关于.done() 函数的部分。其中之一是从请求返回的数据。这意味着在您的update4.php 文件中,如果您将数据作为JSON 对象输出到浏览器,那么您可以在原始页面上使用该数据。

$(document).ready(function(){
$('form').on('submit', function (e) {
    e.preventDefault();

    $.ajax({
        type: 'post',
        url: 'update4.php',
        data: $(this).serialize(),
        success: function (data,successText) {
           for(var x in data){
              //Use tree traversing to find the input/text elements that have the data-field-id option equal to the x variable; I can't test it right now so I don't want to have this here.
           }
        }
    });

});

});

Update4.php

正如另一位用户在评论部分指出的那样,您在此处的查询很容易发生 SQL 注入。请按照他们提供的链接阅读更多信息。

现在,假设您希望返回所有数据,那么您的 update4.php 文件中的最后一行应该接近于:

<?php 
  require_once 'header.php';
    if (!$loggedin) die();

    if(isset($_POST['submit'])){
        $UpdateQuery = /*"UPDATE SpringMgmt 
                        SET    Notes='$_POST[Notes]',
                               SOIEstSubmitted='$_POST[SOIEstSubmitted]',
                               EstAdditional='$_POST[EstAdditional]',
                               SOIMeetingScheduled='$_POST[SOIMeetingScheduled]'
                        WHERE SpringMgmtID='$_POST[SpringMgmtID]'"; 
               Don't do this, please use a prepared statement or mysql(i)_real_escape_string() on the data.*/
        $result = mysql_query($UpdateQuery);
        if($result!==false){
              echo json_encode(array(
                     'notes'=> $_POST['Notes'],
                     'submitted'=> $_POST['SOIEstSubmitted'],
                     'additional'=>$_POST['EstAdditional'],
                     'meetingScheduled'=>$_POST['SOIMeetingScheduled']
                  ));
        }
    };

注意我确实不建议这样做。您应该将这些 $_POST 变量移动到您已正确清理的其他变量中。 切勿假设您的用户不了解网络技术。总是,总是假定用户是有恶意从您的数据库中窃取数据的人。因此,始终检查用户输入的数据。我设置它的唯一原因是因为您似乎对 Web 开发的这些方面还很陌生,并且对于我提供的所有其他信息,我不想让您超负荷并让您远离 Web 开发/设计。

旁注

我建议查找各种模板引擎。将显示 (HTML) 和数据 (PHP) 尽可能分开通常是一种更好的做法。我之前使用的唯一模板引擎是 PhpBB 3 模板引擎的修改版本和 Smarty(phpBB 团队基于其模板引擎)。

自从开始输入此内容以来,我已经看到另一个答案发布并快速阅读。我认为我们俩都解决了您的整体问题中略有不同的部分,因此我将这篇文章作为参考提供给您,尽管我认为其他用户的回答比我的要好一些。不过,我重复他的观点,如果我听起来居高临下或刻薄,我不是故意的。

另外,我相信有人会或已经向您指出,养成使用 mysqli_* 函数的习惯,因为 mysql_ 在未来的 PHP 版本中将被弃用(不再可用)。

【讨论】:

    【解决方案2】:

    披露:我的回答可能听起来令人难以置信,甚至是刻薄的,请注意这不是我的意图。我将向您展示如何解决此问题,但首先让我添加一些关于上面代码的 cmets 以及一些建议:

      1234563单元格”(代码看起来和听起来一样丑陋)。您可以在此处阅读有关类似案例的更多信息:Create a HTML table where each TR is a FORM
    1. 您的 SQL 语句受到 SQL 注入。这是不好的。真的,真的很糟糕。正如我在 cmets 中提到的,考虑更改为 MySQLi 或 PDO 并使用参数化查询。你可以在这里阅读更多信息:How can I prevent SQL injection in PHP?

    2. 您的 HTML 代码不干净。一般来说,您的页面会正常工作,因为浏览器会提供帮助,但相信我,那是糟糕的编程:您最终会更改代码,忘记它,这将是一团糟。就我所见:

      • 有多个具有相同 ID 的元素(循环创建的所有表单)。
      • 内联 CSS 不完整 (background-color:)。
      • 许多地方缺少引号。
      • 有几个关闭 &lt;/div&gt; 而没有打开 &lt;div&gt;(如果打开的 div 来自 header.php,这可能没问题;但即使是这样,代码也很难维护)

    最后,解决方案。我希望你没有跳过上面的所有文字,直接跳到这里,因为它不仅现在而且将来都会对你有所帮助。

    改变这两件事,你的代码就可以工作了(都在 js1.js 中):

    1. 将函数包装在$(document).ready 中,以便在页面加载完成时执行。
    2. 将数据从$("form").serialize() 更改为$(this).serialize(),这样您将只发送带有您单击的按钮的表单中的信息(而不是所有表单)。

    js1.js 的最终代码如下所示:

    $(document).ready(function () {
    
        $('form').on('submit', function (e) {
    
            e.preventDefault();
            $.ajax({
                type: 'post',
                url: 'update4.php',
                data: $(this).serialize(),
                success: function () {
                    alert('form was submitted');
                }
            });
    
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多