Имя файла изображения было случайно удалено из MySQL после PHP обновления блога CRUD - PullRequest
0 голосов
/ 07 апреля 2020

Кажется, я не могу переопределить эту переменную $ featured_image = ""; Если я обновлю сообщение в блоге новым изображением, старым изображением или оставлю его пустым, я в конечном итоге потеряю имя исходного изображения в MySQL, что, в свою очередь, удаляет изображение из сообщения в блоге. Фактический файл все еще находится в правильной папке, имя файла просто отсутствует в MySQL. Частично проблема заключается в том, что я не могу определить существующее имя файла в базе данных. Спасибо!

<?php
// Post variables
$post_id = 0;
$isEditingPost = false;
$published = 0;
$title = "";
$post_slug = "";
$body = "";
$featured_image = ""; // <-- there's the culprit
$post_topic = "";

// lots of other functions omitted for clarity
function editPost($role_id)
{
    global $conn, $title, $post_slug, $body, $published, $isEditingPost, $post_id;
    $sql = "SELECT * FROM posts WHERE id=$role_id LIMIT 1";
    $result = mysqli_query($conn, $sql);
    $post = mysqli_fetch_assoc($result);
    // set form values on the form to be updated
    $title = $post['title'];
    $body = $post['body'];
    $published = $post['published'];
}

function updatePost($request_values)
{
    global $conn, $errors, $post_id, $title, $featured_image, $topic_id, $body, $published;

    $title = esc($request_values['title']);
    $body = esc($request_values['body']);
    $post_id = esc($request_values['post_id']);
    if (isset($request_values['topic_id']))
    {
        $topic_id = esc($request_values['topic_id']);
    }
    // create slug: if title is "The Storm Is Over", return "the-storm-is-over" as slug
    $post_slug = makeSlug($title);

    if (empty($title))
    {
        array_push($errors, "Post title is required");
    }
    if (empty($body))
    {
        array_push($errors, "Post body is required");
    }
    // if new featured image has been provided
    if (isset($_POST['featured_image']))
    {
        // Get image name
        $featured_image = $_FILES['featured_image']['name'];

        // somewhere around here I need an else statement to not overwrite the existing
        //file name stored in mysql. The global variable is defined as "" and that is
        //overriding the existing file. Also, if i try to upload a new file or the
        //original, it won't take either.


        // image file directory
        $target = "../static/images/" . basename($featured_image);
        if (!move_uploaded_file($_FILES['featured_image']['tmp_name'], $target))
        {
            array_push($errors, "Failed to upload image. Please check file settings for your server");
        }
    }

    // register topic if there are no errors in the form
    if (count($errors) == 0)
    {
        $query = "UPDATE posts SET title='$title', slug='$post_slug', views=0, image='$featured_image', body='$body', published=$published, updated_at=now() WHERE id=$post_id";
        // attach topic to post on post_topic table
        if (mysqli_query($conn, $query))
        { // if post created successfully
            if (isset($topic_id))
            {
                $inserted_post_id = mysqli_insert_id($conn);
                // create relationship between post and topic
                $sql = "INSERT INTO post_topic (post_id, topic_id) VALUES($inserted_post_id, $topic_id)";
                mysqli_query($conn, $sql);
                $_SESSION['message'] = "Post created successfully";
                header('location: posts.php');
                exit(0);
            }
        }
        $_SESSION['message'] = "Post updated successfully";
        header('location: posts.php');
        exit(0);
    }
}


1 Ответ

0 голосов
/ 08 апреля 2020

Есть несколько проблем с вашим кодом:

  1. Вы используете библиотеку mysqli, которая делает вас уязвимым для атак SQL инъекций. Чтобы предотвратить это, вы должны использовать подготовленные операторы и параметризованные запросы .

  2. С одной стороны, вы ищете $_POST['featured_image']:

    if (isset($_POST['featured_image']))
    

А через несколько строк вы просматриваете $FILES['featured_image']:

    // Get image name
    $featured_image = $_FILES['featured_image']['name'];

Кроме того, эта функция, кажется, полагается на третий массив, параметр с именем $request_values:

function updatePost($request_values)

Это действительно сбивает с толку и, возможно, является ошибкой.

Но это касается вашей реальной проблемы: когда вы создаете переменную $featured_image пусто, ваш оператор SQL обновляет столбец пустым:

$query = "UPDATE posts SET title='$title', slug='$post_slug', views=0, image='$featured_image', body='$body', published=$published, updated_at=now() WHERE id=$post_id";

Чтобы обновить столбец image только тогда, когда $featured_image не является пустым, вы можете условно включить image='$featured_image' в ваш $query:

$query = "UPDATE posts SET title='$title', slug='$post_slug', views=0, " . ( strlen($featured_image) ? "image='$featured_image', " : '' ) . "body='$body', published=$published, updated_at=now() WHERE id=$post_id";

В любом случае вам действительно нужно изменить свой код, чтобы использовать что-то вроде библиотеки PDO вместе с параметризованными запросами для предотвращения SQL атак внедрения.

...