我想用php或ajax将它发回给自己后刷新一个表单

时间:2010-07-01 17:00:40

标签: php mysql ajax

我的项目是一个小酒馆菜单,使用PHP和MySQL。它打印出一个漂亮的菜单项表,只要它们有库存。

我使用addRemove.php来添加和删除菜单中的项目。它为每个项目创建一个按钮,打开或关闭。 “打开”的项目有库存并显示在菜单上。当用户单击按钮时,它会将按钮的名称发回表单,然后“切换”功能会对该项执行更新。如果按钮打开,则会切换为关闭。如果它关闭,它会切换到打开状态。

示例:我在菜单上有3个项目,Spaghetti,Pizza和Cheeseburger。我用完意大利面,所以我去addRemove.php。

Spaghetti,Pizza和Cheeseburger作为按钮加载 比萨饼:[ON] 意大利面条:[ON] 干酪汉堡包:[ON]

我点击Spaghetti按钮,数据库正确更新为: 比萨饼:[ON] 意粉:[关闭] 干酪汉堡包:[ON]

但表格显示: 比萨饼:[ON] 意大利面条:[ON] 干酪汉堡包:[ON]

然后我点击Cheeseburger按钮,数据库再次正确更新: 比萨饼:[ON] 意粉:[关闭] 干酪汉堡包:[OFF]

现在显示表格 比萨饼:[ON] 意粉:[关闭] 干酪汉堡包:[ON]

显示的表格是实际数据的一步。我认为问题是在执行'toggle'UPDATE查询之前发布并重新加载表单。

我不知道AJAX,是否有一种简单的方法可以在UPDATE后强制刷新?

这里是addRemove.php:

<?php include ("data2.php");
$keys = array_keys($_POST);
if(isset($keys[0])){
    toggle($name[$keys[0]]);
}
?>
<form action="addRemove2.php" method="post">
<?php
global $name;
$c = count($name);
//$c = 2;
for($i=0;$i<$c;$i++){
$item = $name[$i];
if($inStock[$i]==1){
    $onOff = "ON";$color = "blue";
}
else{
    $onOff = "OFF";$color = "red";
}
echo "<label>$item</label>";
echo "<input type='submit' name='$i' value='$onOff' style='color:$color'>";
echo "<br />";
}
?>
</form>
<?php

function turnOn($item){ 
    $dbc = mysqli_connect('localhost','root','','bigItaly')
        or die('Error connecting to MySQL Server.');
    $queryString = "UPDATE items SET inStock='1' WHERE name='$item'";
    mysqli_query($dbc, $queryString);
    mysqli_close($dbc);
}

function turnOff($item){
    $dbc = mysqli_connect('localhost','root','','bigItaly')
        or die('Error connecting to MySQL Server.');
    $queryString = "UPDATE items SET inStock='1' WHERE name='$item'";
    mysqli_query($dbc, $queryString);
    mysqli_close($dbc);}

function getInStock($item){
    global $name, $inStock;
    $key = array_search($item, $name);
    return $inStock[$key];
}

function toggle($item){
    if (getInStock($item)=="1"){
        turnOff($item);
    }
    else{
        turnOn($item);
    }
}
?>
</html>

这是数据库架构。

INSERT INTO `items` (`id`, `name`, `unitPrice`, `inStock`, `category`) VALUES
(1, 'Fettucine Alfredo', 2, 1, 'Pastas'),
(2, 'Hawaiian', 3, 1, 'Pizzas'),
(3, 'Spaghetti', 3, 1, 'Pastas'),
(4, 'Supreme', 5, 1, 'Pizzas'),
(5, 'Deluxe Lasagna', 2, 1, 'Pastas'),
(6, 'Barbecue Chicken', 6, 1, 'Pizzas'),
(7, 'Guacomole Bacon', 3, 1, 'Burgers'),
(8, 'Swiss Mushroom', 2, 1, 'Burgers'),
(9, 'Breakfast Burger', 2, 1, 'Burgers');

2 个答案:

答案 0 :(得分:0)

好的我找到了一个解决方案,但它有点难看。 我添加了这段代码:

<?php include ("data.php");
$keys = array_keys($_POST);
if(isset($keys[0])){
    toggle($name[$keys[0]]);
/* This refreshes the page after a 1/5 sec delay*/
    $urlRefresh = "addRemove.php";    
    header("Refresh: 0.2; URL=\"" . $urlRefresh . "\"");

}
?>

答案 1 :(得分:0)

我可能只是错过了真正的问题,但如果您只需要让页面等待结果然后刷新,我认为您可以在收到查询后简单地添加刷新。因为PHP与Javascript不同,它是同步的,所以在查询数据库时执行会暂停。因此,只需添加:

header("Location: http://www.yoursite.com/addRemove.php");

在“toggle()”函数的最后:

function toggle($item){
if (getInStock($item)=="1"){
    turnOff($item);
}
else{
    turnOn($item);
}
}

但这不是非常用户友好(他们点击表单,看到页面刷新两次)。相反,为什么不在一个单独的文件中使用UPDATE逻辑。表单在那里提交,文件查询数据库,一旦查询完成,重定向到原始表单页面。没有双重刷新。