我有简单的表格来更新产品库存,它使用数据表为数据库中的所有项目生成行。当我在函数中设置断点时,我可以使用表单正确更新库存,但如果我删除断点,它将停止工作。
HTML表单:
<form id="updateStock">
<input id="Penguincard" type="text" value="200">
<input type="submit" onclick="updateStock("Penguincard", "Penguin card");" value="Update">
</form>
使用Javascript:
function updateStock(id, item){
var idS = "#" + id;
var newStock = $(idS).val();
$.post("URL",{item: item, stock: newStock},
function(result){
alert(result);
});
return false;
}
PHP:
<?php
ini_set('display_errors', 1);
// Adds a new item to the database
require('common.php');
if ($_SERVER["REQUEST_METHOD"] == "POST"){
if (empty($_POST["item"])){
echo 'item is blank';
exit();
}else
{
$item = test_input($_POST["item"]);
// check if item only contains letters and whitespace
if (!preg_match("/^[a-zA-Z0-9 ]*$/",$item))
{
echo 'item reg';
exit();
}
}
if (empty($_POST["stock"])) {
echo 'stock is blank';
exit();
}else
{
$stock = test_input($_POST["stock"]);
// check if stock only contains letters and whitespace
if (!preg_match("/^[0-9]*$/",$stock))
{
echo 'stock reg';
exit();
}
}
}else{
//don't run unless post
echo 'Not post';
exit();
}
$stmt = $db->prepare('UPDATE `stock` SET `stock`=:stock WHERE `item`=:item');
// bind the parameters to the insert after sanitizing them
$stmt->bindParam(':item', $item);
$stmt->bindParam(':stock', $stock);
//execute the insert
$status = $stmt->execute();
if( $status ){
echo 'Item added successfully!';
exit();
}
//sanitizing function
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
编辑:通过不工作我的意思是它似乎运行onClick功能但不提交帖子。
从答案看来,调试似乎允许在默认表单操作发生之前提交帖子,从而使其正常工作。
答案 0 :(得分:4)
您实际上从未实际取消提交按钮的click
功能;来自updateStock函数的return false;
,但实际上并没有做任何事情(onclick
属性代码本身需要返回false。结果表单正在提交并且AJAX请求被取消。
最简单的解决方法是:
<input type="submit" onclick="return updateStock('Penguincard', 'Penguin card');" value="Update">
但是,使用jQuery绑定事件处理程序可能会更好:
$(':submit').on('click', function(e) {
e.preventDefault();
updateStock('Penguincard', 'Penguin card');
});
答案 1 :(得分:2)
这一行是问题所在:
onclick="updateStock("Penguincard", "Penguin card");"
属性中的双引号是问题所在。将它们转换为单引号。这是人们喜欢使用jQuery委托添加点击事件的一个原因。