0
FIXED! See bottom for solution.

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

HTML 代码:

<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+...,我不得不删除?. 感谢大家的帮助!

4

3 回答 3

1

由于您已经使用 jquery,因此您的生活变得复杂,也将它用于 AJAX。

$.AJAX({ url: "php 路径", type: "post", data: $("#formID").serialize(), });

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

抱歉有拼写,从手机感应到。问候

埃泽基

于 2013-04-13T00:03:22.750 回答
0

有很多事情是错误的。

您没有在/元素上使用该name属性。他们需要有一个才能将它们与 POST 请求一起发送。属性与表单无关(使用标签时除外;属性指向它们)inputselectnameidfor

<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

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

于 2013-04-13T01:15:51.417 回答
0

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

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

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

另外,再往下两行,您正在调用此处未列出的函数

xmlHttpReq2.onreadystatechange = addRecordCallback;

看看该功能的作用会有所帮助。

于 2014-12-18T21:58:32.820 回答