Я работаю в книге рецептов с SQL и PDO. В моей таблице «рецепты» есть столбец для «id», «name», «attachment_id»; Столбец 'attachment_id' является внешним ключом.
В таблице «вложения» есть столбцы «id», «attachment_path».
На данный момент, если я удаляю рецепт, изображение, путь к которому хранится в таблице «вложения», остается там. Чего я хочу добиться, так это того, что если я удалю рецепт, то «вложение», которое к нему принадлежит, также должно быть удалено. Я провел некоторое исследование и понял, что мне нужно создать триггер, но он продолжает показывать, что это неправильно, и я не могу понять, как это работает... или что делать с "разделителем". ...
Итак.... приступим:
functions.php:
function delete_recipe($recipe_id = ':recipe_id', $attachment_id = ':attachment_id') {
include 'db_connection.php';
try {
$sql = "DELETE FROM recipes ";
$sql .= "WHERE id =:recipe_id ";
$sql .= "LIMIT 1";
$results = $conn->prepare($sql);
$results->bindParam(':recipe_id', $recipe_id, PDO::PARAM_INT);
if($results->execute()) {
echo '1 row has been removed';
// if the recipe gets deleted, then delete its attachment
delete_attachment($attachment_id);
}
$conn = null;
} catch(PDOException $e) {
echo 'Error: ' . $e->getMessage() . '<br />';
return false;
}
return true;
}
function delete_attachment($attachment_id = ':attachment_id') {
include 'db_connection.php';
try {
$sql = 'DELIMITER $$';
$sql = 'CREATE TRIGGER image_before_delete_recipe';
$sql .= ' AFTER DELETE ON `recipes`;
$sql .= ' FOR EACH ROW BEGIN';
$sql .= ' IF NEW.deleted THEN ';
$sql .= "DELETE FROM attachments ";
$sql .= "WHERE id =:attachment_id ";
$sql .= "LIMIT 1";
$sql .= 'DELIMITER $$';
$results = $conn->prepare($sql);
$results->bindParam(':attachment_id', $attachment_id, PDO::PARAM_INT);
if($results->execute()) {
echo '1 row has been removed';
}
$conn = null;
} catch(PDOException $e) {
echo 'Error: ' . $e->getMessage() . '<br />';
return false;
}
return true;
}
Я знаю, что delete_attachment не имеет никакого смысла..... Я буквально не могу понять, как работает этот триггер и/или как мне его построить..... это обычный запрос на "удалить"?
Способ загрузки изображения:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$attach_id = filter_input(INPUT_POST, 'attach_id', FILTER_SANITIZE_NUMBER_INT);
$folder="images/";
$file = $_FILES['photo']['tmp_name'];
$file_to_upload = $folder . basename($_FILES['photo']['name']);
if(move_uploaded_file($file, $file_to_upload)) {
echo "File is valid, and was successfully uploaded.\n";
if($attach_id = add_image($file_to_upload)) {
if(add_recipe($name, $attach_id)) {
header('Location: index.php');
exit;
} else {
$error_message = "Could not add recipe";
}
} else {
$error_message = "Could not add image";
}
} else {
echo 'Upload failure';
print_r($_FILES);
}
}
include 'includes/header.php';?>
<div class="col-container">
<h1>Add a recipe</h1>
<?php
if (isset($error_message)) {
echo '<p class="message">' . $error_message . '</p>';
}
?>
<form method="POST" action="recipe.php" enctype="multipart/form-data">
<div>
<label for="name" class="required">Name</label>
<input name="name" type="text" value="" />
</div>
<div>
<input name="attach_id" type="text" value="" class="hidden" />
<label for="file">Filename:</label>
<input type="file" name="photo" id="photo"><br>
</div>
<button class="submit" type="submit" name="submit">Submit</button>
</form>
</div>
<?php include 'includes/footer.php';
Я знаю, что это очень грязно и неправильно, я должен проверить, что данные поступают правильно, пустых полей нет..... но для начала я предпочитаю работать над функциональностью... Кто-нибудь может сказать мне, должен ли я обязательно сделать это с одним из этих триггеров, и если да.... как мне начать????
Спасибо
$attachment_id
равно:attachment_id
Что вы ожидаете найти с таким значением? - person u_mulder   schedule 14.11.2016attachment
, прежде чем она будет удалена, чтобы вы могли удалить изображение из папки, в которой хранятся изображения. - person RiggsFolly   schedule 14.11.2016