0

我需要将此表单发布到数据库并检索新添加的信息,而无需使用 XHR 刷新。

该页面加载了一些可以编辑的初始元素,并且可以通过按下按钮动态添加更多“新”元素(新用户需要这样做,因为他们没有预先存在的任务。它使用 session_id 跟踪您的身份)。

我已经在这玩了13个多小时了,有点累。

代码:

索引.php

<?php 
    //Sets unique session for the current visitor and keeps track of information for use with database
    $time = time();  
    $date = $today = date("Ymd");  
    $id = $time + $date;  

    $id = session_id();
    if(empty($id)) session_start();

    //echo "SID: ".SID."<br>session_id(): ".session_id()."<br>COOKIE: ".$_COOKIE["PHPSESSID"];


?>
<!doctype html>
<html>
    <head>
    <meta charset='utf-8'> 
    <title>Simple To-Do List</title>
    <?php
        // Create connection via my connect.php file
        require 'connect.php';

            // Create query
            $query= "select * from checklist where SID = '".session_id()."'"; 
            $result = mysql_query($query);

            // Create requisite array for checklist
            $checklistItems = array();

           //Check to ensure query won't implode and is valid
           if($result === FALSE) {
             die(mysql_error()); 
            }

             // Calculates number of rows from query  
            $num=mysql_numrows($result);

            mysql_close($con);

    ?>
        <!-- javascript code to dynamically add new form fields as well as check\uncheck all boxes -->
            <script src="//code.jquery.com/jquery-latest.min.js" language="javascript" type="text/javascript"></script>  
            <script src="addInput.js" language="Javascript" type="text/javascript"></script>



    </head>
    <body>   

        <h1>My To-Dos</h1>


     <form name="checklist" id="checklist" class="checklist">
        <?php // Loop through query results   
              while($row = mysql_fetch_array($result))
                  {
                  $entry = $row['Entry'];
                  $CID = $row['CID'];
                  $checked =$row['Checked'];
                 // echo $CID;
                  echo "<input type=\"text\" value=\"$entry\" name=\"textfield$CID;\" id=\"textfield$CID;\" onchange=\"showUser(this.value)\" />";
                  echo "<input type=\"checkbox\" name=\"checkbox$CID;\" id=\"checkbox$CID;\"  value=\"$checked\"".(($checked == '1')? ' checked="checked"' : '')."  />";
                  echo "<br>";
                  }
        ?> 
        <div id="dynamicInput"></div>
        <input type="submit" id="checklistSubmit" name="checklistSubmit" class="checklist-submit"> <input type="button" id="CompleteAll" name="CompleteAll" value="Check All" onclick="javascript:checkAll('checklist', true);"><input type="button" id="UncheckAll" name="UncheckAll" value="Uncheck All" onclick="javascript:checkAll('checklist', false);">                  
     <input type="button" value="Add another text input" onClick="addInput('dynamicInput');"></form>


    </body>
</html>

连接.php

<?php 

// Create connection
$con=mysql_connect("localhost","root","");
$selected = mysql_select_db("madmonk",$con); 

// Check connection
if (mysqli_connect_errno($con))
{
    echo "Failed to connect to MySQL: " . mysql_connect_error();
}

?>

addInput.js

// Creates new dynamic elements within HTML body
var counter = 0;
var limit = 8;

function addInput(divName){ 
     i=counter; i++;
     if (counter == limit)  {
          alert("You have reached the limit of adding " + counter + " inputs");
     }
     else {

          var newdiv = document.createElement('div');
          newdiv.innerHTML = " <input type='text'name='myInputs["+i+"]'><input type='checkbox' name='myInputs["+i+"]'><br>";
          document.getElementById(divName).appendChild(newdiv);
          counter++;
     }
}

//Checks\unchecks all checkboxes on the web page
function checkAll(formname, checktoggle)
    {
        var checkboxes = new Array(); 
        checkboxes = document[formname].getElementsByTagName('input');
        for (var i=0; i<checkboxes.length; i++)  {
        if (checkboxes[i].type == 'checkbox')   {
        checkboxes[i].checked = checktoggle;
          }
       }
    }


//AJAX code to communicate with server without page refresh
$('checklistSubmit').click(function(e) {
    $(e).stopPropagation();

    $.post({
        url: 'processor.php',
        data: $('#checklist').serialize(),
        dataType: 'html',
        success: function(data, status, jqXHR) {
           $('div.successmessage').html(data);
           //success callback function
           alert (success);
        }, 
        error: function() {
           //error callback function
           alert (failure);
        } 
    });
});

我知道我在使用上面的 AJAX 代码时遇到了问题。这很关键,我无法让它发挥作用。我以前从未尝试过做这样的事情,我决定尝试并全神贯注地完成它。啊。

处理器.php

<?php
require 'connect.php';

$entry  = $_POST['entry'];
$checked = $_POST['checked'];


$num_items = count($entry);
for ($i = 0; $i < $num_items; $i++)
{
    $sql="INSERT INTO checklist (Entry, Checked, SID)
VALUES ($checked, $entry, session_id()) WHERE SID = '".session_id()."'";}


mysql_close($con);

?>

^这是粗略的,完全未完成。

  1. 我如何与动态字段交互并循环它们以通过 mysql 和 php 进入数据库?

  2. 如何使用新值更新 index.php 页面,以便无缝添加刚刚添加的新项目?

  3. 我怎样才能让 AJAX 工作?

为了我,请非常具体。我对使用 AJAX 非常非常陌生。

4

4 回答 4

2

$('checklistSubmit')应该是$('#checklistSubmit')。你需要#寻找一个ID。

此外,该单击处理程序绑定应该在内部$(function() { ... });,以便在将表单加载到 DOM 之前它不会运行。

您的成功函数包含$('div.successmessage').html(data);但我在您的 PHP 中没有看到该类的 DIV。

$(e).stopPropagation();

应该:

e.stopPropagation();

因为e不是 DOM 元素,所以它是一个事件。

于 2013-06-01T06:06:39.180 回答
1

1)要与动态字段交互,只需给它们一个类,比如class="dynamicField"myId = <whatever the id you care about is>或其他东西,然后添加

$(".dynamicField").change(function(){
  $.post("updateDB.php", 
    { 
      "dataToGoInDB": $(this).val(),
      "idYouCareAbout": $(this).attr("myId")
    },
    function(data){
      console.log(data.responseBackFromDB);
  }, "json");

});

然后有一个 php 页面updateDB.php将查看 POST 变量,正确清理它们以避免 SQL 注入,然后对数据库执行任何您需要执行的操作。

如果您计划在创建 DOM 后添加动态字段,请改为:

$("document").on("change", ".dynamicField", function(){
  $.post("updateDB.php", 
    { 
      "dataToGoInDB": $(this).val(),
      "idYouCareAbout": $(this).attr("myId")
    },
    function(data){
      console.log(data.responseBackFromDB);
  }, "json");

});

这将为您将 .change 附加到 .dynamicField 的任何新实例。( http://api.jquery.com/on/ )

2) 要添加新字段,请尝试其中一种 jQuery DOM 操作方法,例如 append http://api.jquery.com/append/

3)看看我对#1的回答是怎么说的

希望有帮助。

于 2013-06-01T06:14:22.053 回答
0

您可以采取以下方法来处理 ajax:-

  1. 将ajax调用放在一个函数中。说 initAjax()。
  2. 将单击或更改处理程序放入 initMyForm() 之类的函数中
  3. 加载文档时执行此功能。

    $(document).ready(function(){
       initAjax();
       initMyForm();
    }
    
  4. 在 ajax 调用的成功或失败回调中更新表单的 HTML,然后再次调用 initMyForm();

  5. 示例代码

    function initAjax(){
        $.ajax({
           url : 'myurl',
           success : function(data){
              playWithData(data);
           },
           failure : function(data){
           }
        });
    }
    
    function playWithData(data){
        //after playing with data
        initMyForm();
    }
    
    function initMyForm(){
    }
    

    console.log 和 google chrome 的开发者工具(按 F12)也是好朋友。您也可以为 XHR 请求设置断点。这也将帮助您进行调试。

于 2013-06-01T06:26:53.513 回答
0

用这个...$.ajax({ type: "POST", url: url, data: data, success: success, dataType: dataType });

检查此链接 http://api.jquery.com/jQuery.post/

于 2013-06-01T06:04:49.887 回答