PHP多个表单在同一页面上有多个按钮

时间:2014-12-16 21:54:01

标签: php mysql post pdo form-submit

我正在忙着为一家开办Milkshakes的本地企业编制网站代码。当然,他们希望在网站上展示自己的风味,并拥有一个可以编辑它们的管理页面。我已经在主页面上显示了这些风格,但是我在管理页面上遇到了问题。

我有一个数据库设置,其中包含一个风格列表。我试图允许他们做的3件主要事情是编辑,删除和添加新条目。目前,我使用2个提交按钮将每行(或每个风味及其ID)作为单独的表单调出:一个用于保存更改,另一个用于删除它。 代码如下:

用于管理页面:

<?php
$con = new PDO('mysql:host=host;dbname=dbname', "user", "password");
$con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "SELECT * FROM FlavourShakes";
$data = $con->query($query);
$rows = $data->fetchAll(PDO::FETCH_ASSOC);

foreach ($rows as $row) {
    $id = $row['id'];
    $flavour = $row['Flavour'];
    print "<form action=\"saveFlavorShakes.php\" method=\"post\"> \n
            <fieldset> \n 
                <input name=\"id\" value=\"$id\" readonly/> \n 
                <input name=\"Flavour\" value=\"$flavour\" /> \n
                <input type=\"submit\" name=\"edit\" value=\"Save\"> \n 
                <input type=\"submit\" name=\"edit\" value=\"Remove\"> \n 
            </fieldset> \n 
           </form> \n";
}
?>  

<form action="saveFlavorShakes.php" method="post">
    <fieldset>
        <input name="Flavour" />
        <input type="submit" name="edit" value="Add">
    </fieldset>
</form>

在我的处理页面上:

<?php
$flavour = $_POST['Flavour'];
$id = $_POST['id'];
$btnType = $_POST['edit'];

$con = new PDO('mysql:host=hostname;dbname=dbname', "user", "password");
$con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "";

try
{
    switch($_POST['edit']){
        case'Save':                             
            $query =    "UPDATE FlavorShakes
                        SET Flavour= :name,
                        WHERE id = :id;";
            $notice = "saveOK";
            $_POST['notice'] = $notice;
            break;
        case'Add':
            $query = "INSERT INTO FlavourShakes(Flavour) VALUES (:name);";
            $notice = "addOK";
            $_POST['notice'] = $notice;
            break;
        }
        //I know I haven't added a case for the remove button yet.


        $statement = $con->prepare($query);
        $statement->bindValue(":id", $id);
        $statement->bindValue(":name", $flavour);

        $count = $statement->execute(); 

    header('Location: EditFlavorShakes.php');   
}

catch(PDOException $e) {
    if ($btnType = "save"){ 
        $notice = "saveBad";
        $error = $e->getMessage();  
        $_POST['notice'] = $notice;
        $_POST['error'] = $error;
    } elseif($btnType = "delete"){ 
        $notice = "delBad";
        $error = $e->getMessage();
        $_POST['notice'] = $notice;
        $_POST['error'] = $error;           
    }elseif($btnType = "add"){ 
        $notice = "addBad";
        $error = $e->getMessage();  
        $_POST['notice'] = $notice;
        $_POST['error'] = $error;   
    }else{
        $notice = "otherBad";
        $error = $e->getMessage();
        $_POST['notice'] = $notice;
        $_POST['error'] = $error;   
    }
    echo $notice;
    echo $e->getMessage();

    //header('Location: EditFlavorShakes.php');
}
?>

目前,我在数据库中没有任何条目。但是,当我尝试添加Chocolate并单击Add按钮时,出现此错误:

  

saveBadSQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

我不明白为什么$_POST['edit']设置为保存而不是添加?我觉得我在代码中忽略了一些愚蠢的错误。如果有人可以帮助我,我会很感激。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您需要将正确的$statement电话移至每个案例 -

switch($_POST['edit']){
        case'Save':                             
            $query = "UPDATE FlavorShakes
                     SET Flavour= :name,
                     WHERE id = :id;";
            $notice = "saveOK";
            $_POST['notice'] = $notice;
            $statement = $con->prepare($query);
            // this query needs multiple values bound
            $statement->bindValue(":id", $id);
            $statement->bindValue(":name", $flavour);
            break;
        case'Add':
            $query = "INSERT INTO FlavourShakes(Flavour) VALUES (:name);";
            $notice = "addOK";
            $_POST['notice'] = $notice;
            $statement = $con->prepare($query);
            // this one needs one value bound
            $statement->bindValue(":name", $flavour);
            break;
        }
        //I know I haven't added a case for the remove button yet.


        $count = $statement->execute(); 

您还在if语句中遗漏了几项测试(您正在分配)。将=替换为== -

if ($btnType == "save"){ 
        ...
    } elseif($btnType == "delete"){ 
        ...
    }elseif($btnType == "add"){ 
        ...
    }else{
        ...
    }

答案 1 :(得分:0)

此错误消息:

saveBadSQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

是因为你在没有:id

时尝试这一行
$statement->bindValue(":id", $id);

你总是得到saveBad,因为你在控制中assign

if ($btnType = "save"){ 

修复:

if ($btnType === "save"){