Я занят созданием сайта для местного бизнеса, который занимается молочными коктейлями. Естественно, они хотели показать свои вкусы на сайте и иметь страницу управления, где они могли бы их редактировать. Я получил варианты, которые будут отображаться на главной странице, но у меня возникла проблема со страницей управления.
У меня есть база данных, которая содержит список вкусов. 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');
}
?>
В настоящее время у меня нет записей в базе данных. Однако, когда я пытаюсь добавить Chocolate и нажимаю кнопку Add, я получаю эту ошибку:
saveBadSQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов
Чего я не понимаю, так это почему $_POST['edit']
установить сохранить вместо добавления? Я чувствую, что пропускаю какую-то глупо простую ошибку в своем коде. Если кто-нибудь может мне помочь, я был бы признателен.
Заранее спасибо.
Вы должны двигаться вправо $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{
...
}
Это сообщение об ошибке:
saveBadSQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
потому что вы пытаетесь эту строку, когда нет: id
$statement->bindValue(":id", $id);
И вы всегда получаете saveBad, потому что вы назначать под вашим контролем:
if ($btnType = "save"){
Исправить в:
if ($btnType === "save"){