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+...
,我不得不删除?
。感谢大家的帮助!
答案 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;
看到这个功能会有所帮助。