2014-12-16 3 views
-2

Я занят кодированием веб-сайта для местного бизнеса, который делает Milkshakes. Естественно, они хотели показать свои вкусы на сайте и иметь страницу управления, где они могли бы их редактировать. Я получил ароматы на главной странице, но у меня проблема с страницей управления.PHP Несколько форм на одной странице с несколькими кнопками

У меня есть база данных, которая содержит список ароматов. 3 основные вещи, которые я пытаюсь разрешить им делать, - это редактировать, удалять и добавлять новые записи. В настоящее время я вызываю каждую строку (или каждый вкус и ее идентификатор) в виде отдельных форм с помощью двух кнопок отправки: один для сохранения изменений и один для удаления. код ниже:

для страницы управления:

<?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'); 
} 
?> 

В настоящее время у меня нет каких-либо записей в базе данных. Однако, когда я пытаюсь добавить шоколад и нажмите кнопку Добавить, я получаю эту ошибку:

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

То, что я не понимаю, почему это $_POST['edit'] набор, чтобы сохранить вместо добавить? Мне кажется, что я пропускаю какую-то туповатую ошибку в моем коде. Если кто-то может мне помочь, я был бы признателен.

Заранее спасибо.

ответ

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 ($btnType == "save"){ 
     ... 
    } elseif($btnType == "delete"){ 
     ... 
    }elseif($btnType == "add"){ 
     ... 
    }else{ 
     ... 
    } 
+0

как я сказал. Глубоко простая ошибка, я полностью оглянулся. Благодаря! – Termonator145

0

Это сообщение об ошибке:

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

потому, что вы пытаетесь эту линию, когда нет: идентификатор

$statement->bindValue(":id", $id); 

И вы всегда получите saveBad причинить вам assign вашим контролем:

if ($btnType = "save"){ 

Исправление к:

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

да, однако в сообщении об ошибке, я получил его поставить saveBad, чтобы указать на кнопку сохранения нажата. он должен показывать addBad, если есть проблема – Termonator145

+0

@ Termonator145 нет, вы вызываете вместо сравнения. Вы знаете = vs === – OIS

+0

Я использовал оператор switch, а не if/else – Termonator145

Смежные вопросы