【问题标题】:jQuery XMLHttpRequest calling External PHP form not submitingjQuery XMLHttpRequest 调用外部 PHP 表单未提交
【发布时间】:2014-03-30 07:27:31
【问题描述】:

我最近有一个朋友专门研究梯形逻辑而不是网络编程,来找我寻求她雇主的项目帮助。虽然我使用更传统的编码语言,但我自己远不是 jquery 和 php 方面的专家。我们遇到的问题是通过 XMLHttpRequest 将 jquery / html 表单插入父页面的 php 页面没有从父页面执行其“发布”操作。使这个问题变得更加困难的是,当页面在父页面之外(直接加载到浏览器中)自行运行时,它会很好地执行其“发布”操作。在这一点上,我已经进行了许多小时的搜索和反复试验,但我很困惑,现在向您寻求帮助。以下是相关的代码位。您可以提供的任何帮助将不胜感激,因为在通过 XMLHttpRequest 插入表单时执行提交表单时,我们尝试过的任何方法似乎都不起作用。

父页面的Javascript代码插入外部表单:

function showUser(str)
{
if (str=="")
  {
  document.getElementById("insertUserHere").innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp2=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp2.onreadystatechange=function()
  {
  if (xmlhttp2.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("insertUserHere").innerHTML=xmlhttp2.responseText;
    }
  }

xmlhttp2.open("GET","ajax-userForm.php?q="+str,true);
xmlhttp2.send();
}

由 xhmlhttprequest (ajax-userForm.php) 插入的外部 PHP 页面的代码:

    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    <script type="text/javascript">

    // JQUERY: Plugin "autoSubmit"
    (function($) {
        $.fn.autoSubmit = function(options) {
            return $.each(this, function() {
                // VARIABLES: Input-specific
                var input = $(this);
                var column = input.attr('name');

                // VARIABLES: Form-specific
                var form = input.parents('form');
                var method = form.attr('method');
                var action = form.attr('action');

                // VARIABLES: Where to update in database
                var where_val = form.find('#where').val();
                var where_col = form.find('#where').attr('name');


                // ONBLUR: Dynamic value send through Ajax
                input.bind('blur', function(event) {



                        // Get latest value
                    var value = input.val();

                    if (input.attr('type') == "checkbox")
                        {

                            if (input.attr('checked') )
                            {
                            value = 1;
                            }
                            else
                            {
                            value = 0;
                            }

                        }


                        // AJAX: Send values
                    $.ajax({
                        url: action,
                        type: method,
                        data: {
                            val: value,
                            col: column,
                            w_col: where_col,
                            w_val: where_val                    

                        },
                        cache: false,
                        timeout: 10000,
                        success: function(data) {
                            // Alert if update failed
                            if (data) {
                                alert(data);
                            }
                            // Load output into a P
                            else {
                                $('#notice').text('Updated');
                                $('#notice').fadeOut().fadeIn();
                            }
                        }
                    });
                    // Prevent normal submission of form
                    return false;
                })
            });

        }
    })(jQuery);
    // JQUERY: Run .autoSubmit() on all INPUT fields within form
    $(function(){
        $('#ajax-userForm INPUT').autoSubmit();
    });

    </script>
    <!-- STYLE -->
    <style type="text/css">
        INPUT { margin-right: 1em }
    </style>


</head>
<body>

<!-- CONTENT -->
<?php
$q = intval($_GET['q']);
/*
 * DATABASE CONNECTION
 */

// DATABASE: Connection variables
$db_host        = "localhost";
$db_name        = "DBNAME";
$db_username    = "root";
$db_password    = "DBPWD";

// DATABASE: Try to connect
if (!$db_connect = mysql_connect($db_host, $db_username, $db_password))
    die('Unable to connect to MySQL from ajax-form.');
if (!$db_select = mysql_select_db($db_name, $db_connect))
    die('Unable to select database');

/*
 * DATABASE QUERY
 */

// DATABASE: Get current row
//$result = mysql_query("SELECT * FROM user");
$result = mysql_query("SELECT * FROM user where Project_ID = '".$q."' ");
$row = mysql_fetch_assoc($result);



?>
<form id="ajax-userForm" class="autosubmit" method="post" action="ajax-updateUser.php">
    <fieldset>
        <legend>Update user information</legend>

        <label>First Name:</label>
            <input name="FirstName" value="<?php echo $row['FirstName'] ?>" />

        <label>Last Name:</label>
            <input name="LastName" value="<?php echo $row['LastName'] ?>" />

        <label>Hometown</label>
            <input name="Hometown" value="<?php echo $row['Hometown'] ?>" />

        <label>Married</label>        
            <input type = "checkbox" id = "chkMarried" name="Married" <?php echo $row['Married'] == 1 ? 'checked':'unchecked' ?>/>

        <label>Employed</label>        
            <input type = "checkbox" id = "chkEmployed" name="Employed" <?php echo $row['Employed'] == 1 ? 'checked':'unchecked' ?>  />

        <input id="where" type="hidden" name="Project_ID" value="<?php echo $row['Project_ID'] ?>" />
    </fieldset>
</form>

<p id="notice"></p>


</body>
</html>

页面代码 (ajax-updateUser.php) 由上述代码 (ajax-userForm.php) 中的“发布”操作调用:

/*
 * DATABASE CONNECTION
 */

// DATABASE: Connection variables
$db_host        = "localhost";
$db_name        = "DBNAME";
$db_username    = "root";
$db_password    = "DBPWD";

// DATABASE: Try to connect
if (!$db_connect = mysql_connect($db_host, $db_username, $db_password))
    die('Unable to connect to MySQL from ajax-update.');
if (!$db_select = mysql_select_db($db_name, $db_connect))
    die('Unable to select database');
$message = "Connection Successful";
//echo "<script type='text/javascript'>alert('$message');</script>";
// DATABASE: Clean data before use
function clean($value)
{
    return mysql_real_escape_string($value);
}

/*
 * FORM PARSING
 */

// FORM: Variables were posted
if (count($_POST) > 0)
{
    $message = count($_POST);
    //echo "<script type='text/javascript'>alert('$message');</script>";
    // Prepare form variables for database
    foreach($_POST as $column => $value)
        ${$column} = clean($value);

    // Perform MySQL UPDATE
    $result = mysql_query("UPDATE user SET ".$col."='".$val."'
        WHERE ".$w_col."='".$w_val."'")
        or die ('Unable to update row.');
}
else
{
    $message = "Nothing in Post";
    echo "<script type='text/javascript'>alert('$message');</script>";
}
?>

【问题讨论】:

  • 旁注:您确实意识到您的 PHP/SQL 有问题。注意到 SO 的语法高亮是如何表现的吗?真的不多,但我敢打赌这只是一个错字,而不是你的工作代码;-)
  • 是的,我认为它只是在我在 SO 上插入代码时发生的。当我使用虚拟数据库密码发布我的版本时,我也忘记关闭报价。

标签: javascript php jquery ajax xmlhttprequest


【解决方案1】:

几件事:

缺少您的报价

DBPWD

您对状态 200 的检查使用:

xmlhttp // whereas the rest is xmlhttp2

我的理论,没有更多的上下文 - 声明时没有使用 var 关键字:

xmlhttp2=new XMLHttpRequest();

这意味着请求像这样附加到窗口:window.xmlhttp2 = ... - 您是否会意外修改“父”页面上其他地方的相同标识符?这将解释共享状态错误以及为什么它只能单独工作(您不会有其他代码隐式修改 window.xmlhttp2)

你也可能在做坏事:

xmlhttp2.open("GET","ajax-userForm.php?q="+str,true);

因为我不知道这条路是什么意思。

另一个可能是,您是否为来自外部域的请求设置了 CORS 标头?

干杯,
安德鲁

【讨论】:

  • 感谢您的回复。你能告诉我用 var 关键字声明 xhmlhttp2 的正确方法吗?
  • Javascript 使用函数作用域,这意味着每次输入新函数(如 showUser 函数)时,可以覆盖任何变量含义的上下文。只需在函数内创建第一行:var xmlhttp2;这将使函数内部对变量 xmlhttp2 的所有引用都成为本地函数(外部函数不可编辑) function showUser(str){ var xmlhttp2; ....代码....}
  • 好的,我按照您的建议在函数的开头声明了 xmlhttp2 (var xmlhttp2;)。还是一样的功能。我应该提到,父级正在将外部页面加载到 jquery 选项卡中。这本身会导致任何问题吗?
  • 定义“外部”——如果你能复习一下 JS 和 PHP 的位置,我最好能帮忙
  • 当我说外部时,我的意思是一个单独的 php 文件。具体来说,同一目录中的一个名为“ajax-userForm.php),如以下几行所示: xmlhttp2.open("GET","ajax-userForm.php?q="+str,true); xmlhttp2.send() ;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多