AJAX无法POST到PHP文件

时间:2013-04-12 23:48:47

标签: php mysql ajax forms post

FIXED! See bottom for solution.

我有一个非常艰难的时间。我已经好几个星期了。我正在尝试使用AJAX将新记录添加到mysql中。 PHP文件100%工作,但我似乎无法使AJAX与我的表单一起使用,该表单具有发送数据的POST方法。这是我第一次使用StackOverflow btw,所以请放轻松。这是代码:

HTML code:

<form name='addform' method='POST' >
    <td></td>
    <td><input type='text' id='cname'></td>
    <td>
        <select id='fuel'>
            <option value='Petrol'>Petrol</option>
            <option value='Diesel'>Diesel</option>
            <option value='Hybrid'>Hybrid</option>
            <option value='LPG'>LPG</option>
        </select>
    </td>
    <td>
        <select id='trans'>
            <option value='Automatic'>Automatic</option>
            <option value='Manual'>Manual</option>
            <option value='Semi-Auto'>Semi-Auto</option>
        </select>
    </td>
    <td><input type='text' id='engine'></td>
    <td><input type='text' id='doors'></td>
    <td><input type='text' id='total'></td>
</tr>
<tr>
    <td><input type='submit' value='Add Car' onclick='addRecord()'></td>
...

我有一个外部.js文件来处理Javascript:

function addRecord(){
    if (
        document.addform.cname.value == "" 
        || document.addform.fuel.value == "" 
        || >document.addform.trans.value == "" 
        || document.addform.engine.value == "" 
        || document.addform.doors.value == "" 
        || document.addform.total.value == ""
    ) 
    { 
        alert ("Empty >field(s) - Cannot create record"); 
        return;
    }

    var mydata = null;
    // Mozilla/Safari
    if (window.XMLHttpRequest) 
    {
        xmlHttpReq2 = new XMLHttpRequest ();
    }
    // IE
    else if (window.ActiveXObject) 
    {
        xmlHttpReq2 = new ActiveXObject ("Microsoft.XMLHTTP");
    }

    var cname = document.getElementById('cname').value;
    var fuel = document.getElementById('fuel').value;
    var trans = document.getElementById('trans').value;
    var engine = document.getElementById('engine').value;
    var doors = document.getElementById('doors').value;
    var total = document.getElementById('total').value;

    mydata = '?cname='+cname+'&fuel='+fuel+'&trans'+trans+'&engine'+engine+'&doors'+doors+'&total'+total;          

    alert ("To Server (Add New Record):\n\nadd.php" + mydata);

    xmlHttpReq2.open('POST', "add.php" +mydata, true);
    xmlHttpReq2.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttpReq2.send(null);
    xmlHttpReq2.onreadystatechange = addRecordCallback;
}

PHP代码:

<?php

$link = mysql_connect ("194.81.104.27", "www", "www");
mysql_select_db ("xyz") or die(mysql_error());

$tot=$_POST[total];
$door=$_POST[doors];
$query = "INSERT INTO tbl 
    (ID, CARNAME, FUELTYPE, TRANSMISSION, ENGINESIZE, DOORS, TOTAL, AVAILABLE)
    VALUES ('$_POST[cname]','$_POST[cname]', '$_POST[fuel]', '$_POST[trans]','$_POST[engine]', $door, $tot, $tot)";
    $result = mysql_query($query);
    mysql_close ($link);
?>

我将信息放入表单,单击按钮,警报告诉我确实从表单中获取数据。但之后没有任何反应。我认为由于某种原因,数据没有以正确的格式发送到PHP文件。

谢谢!

Solution was:

我设法让它发挥作用!部分错误就像@adeneo说我那里没有onclick='addRecord(); return false;'!我做的另一件事是删除表单的id,不确定它是否做了什么。我还将“mydata”附加到.send,如此:xmlHttpReq2.send(mydata);最后我不得不删除“?”这是在mydata变量收集事物中的cname前面。所以它是mydata = '?cname='+cname+...,我不得不删除?。感谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

因为你已经使用了jquery,所以你的生活变得复杂,也可以将它用于AJAX。

$。AJAX({    url:“php的路径”,    类型:“post”,    data:$(“#formID”)。serialize(),    });

将此作为数据发送,您将没事。

抱歉通过电话感知拼写。 问候

Ezeky

答案 1 :(得分:0)

有很多不妥之处。

您未在name / input元素上使用select属性。他们需要name才能通过POST请求发送它们。 id属性与表单无关(使用标签时除外; for属性指向它们)

<form action="/path/to/php/file.php" method="post" id="addform">
    <div>
        <label for="carname">CName</label>
        <input type="text" name="carname" id="carname">
    </div>
    <div>
        <label for="fuel">Fuel</label>
        <select id="fuel" name="fuel">
            <option value="Petrol">Petrol</option>
            <option value="Diesel">Diesel</option>
            <option value="Hybrid">Hybrid</option>
            <option value="LPG">LPG</option>
        </select>
    </div>
    <div>
        <label for="transmission">Transmission</label>
        <select id="transmission" name="transmission">
            <option value="Automatic">Automatic</option>
            <option value="Manual">Manual</option>
            <option value="Semi-Auto">Semi-Auto</option>
        </select>
    </div>
    <div>
        <label for="engine">Engine</label>
        <input type="text" id="engine" name="engine">
    </div>
    <div>
        <label for="doors">Doors</label>
        <input type="text" id="doors" name="doors">
    </div>
    <div>
        <label for="total">Total</label>
        <input type="text" id="total" name="total">
    </div>
    <div>
        <label for="submit">Engine</label>
        <input type="submit" id="submit" value="Add Car" onclick="addRecord()">
    </div>
</form>

对于javascript,使用jQuery(或类似的库)要容易得多。它抽象出所有细节和浏览器差异,让您的生活更轻松。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
// When the page is done loading...
$(function () {
    // When the form is submitted
    $("form#addform").on("submit", function () {
        // Get the form data and serialize it
        var data = $(this).serialize();
        // Create a POST request
        var post = $.post("/path/to/php/file.php", data);
        // When the request is done show a message
        post.done(function () {
            alert("Form submitted!");
        });
        // If the request fails show another message
        post.fail(function () {
            alert("Error! Form not submitted.");
        });
        // Returning false prevents the form's normal
        // behaviour, i.e. its submission
        return false;
    });
});
</script>

查看您的PHP代码,看起来您刚刚学习了PHP:您使用的是不推荐使用的扩展(mysql);你只需使用POST变量而不必担心安全问题;并且你的SQL代码看起来有些不确定(例如什么是AVAILABLE,为什么它被设置为$total?);最后,应该引用字符串数组索引。

// Database handle
$db = new MySQLi('194.81.104.27', 'www', 'www', 'xyz');

// SQL query with placeholders
$sql = "INSERT INTO tbl (CARNAME,FUELTYPE,TRANSMISSION,ENGINESIZE,DOORS,TOTAL) VALUES (?,?,?,?,?,?)";

// Create a statement object
$stmt = $db->prepare($sql);

// Fill in the placeholders
$stmt->bind_param('ssssii', $carname, $fuel, $transmission, $engine, $doors, $total);

// Set the values
$carname      = filter_input(INPUT_POST, 'cname', FILTER_SANITIZE_STRING);
$fuel         = filter_input(INPUT_POST, 'fuel', FILTER_SANITIZE_STRING);
$transmission = filter_input(INPUT_POST, 'transmission', FILTER_SANITIZE_STRING);
$engine       = filter_input(INPUT_POST, 'engine', FILTER_SANITIZE_STRING);
$doors        = filter_input(INPUT_POST, 'doors', FILTER_SANITIZE_NUMBER_INT);
$total        = filter_input(INPUT_POST, 'total', FILTER_SANITIZE_NUMBER_INT);

// If the statement was not executed then there was an error
if ($stmt->execute() === false) {
    header('HTTP/1.0 404 Not Found', true, 404);
}
// Done

注意:我从未测试过任何示例。我根据需要在文本编辑器中将它们写下来,因此您可能需要对它们进行调整。

答案 2 :(得分:0)

我认为问题的一部分是你将数据"mydata = '?cname='+cname+'&fuel..."粘贴到URL的背面,就像使用GET作为传递方法一样,但是你将POST定义为传递方法,所以这样做没必要。

POST方法为您封装数据。请尝试从此行中删除+mydata

xmlHttpReq2.open('POST', "add.php" +mydata, true);

另外,还有两行,你正在调用一个未列在这里的函数

xmlHttpReq2.onreadystatechange = addRecordCallback;

看到这个功能会有所帮助。