Я работаю над сайтом CMS, у меня есть сообщения в блогах, которые я храню в базе данных. Я могу их создавать, редактировать и удалять. Однако возникает проблема, когда я хочу их отредактировать. Я не могу указать предложение WHERE в запросе на обновление, чтобы оно соответствовало идентификатору сообщения в блоге, которое я пытаюсь редактировать!

Предположим, у меня есть сообщение в блоге с идентификатором «5». Если я напишу для него этот код, он будет работать именно так, как должен.

 $sqledit = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

Но я не хочу редактировать просто сообщение в блоге №5, я хочу редактировать сообщение в блоге, которое я обновляю. Мне кажется, это должно работать,

WHERE id= $_POST[id]";

... но это не так.

Это просто вызывает у меня ошибку undefined id. Но этого не должно быть, потому что я могу удалять сообщения в блоге точно так же, используя этот конкретный код:

$sqldel = "DELETE FROM `paginas` WHERE id= $_POST[id]"; 

Это позволяет мне.

Код ниже находится на странице блога, запрос редактирования находится на отдельной странице edit.php

        if (isset($_POST['edit'])) // if pressed, execute

        {  
        echo

        '<br><br>  <div class="blogscript">
         <form action="edit.php" method="post">Edit your stuff<br>          
        <input type="text" placeholder='. $pagetitle . ' ><br><br>          
        <textarea id="message2" name="message">&lt;p&gt;' . $message . '&lt;/p&gt;</textarea><br>           
        <input type="submit" name="editsubmit" value="Confirm" />
        <input type="hidden" name="id" value="' . $id . '">.            </form></div>';
        }           

Я с нетерпением жду любых советов, которые мне стоит попробовать.

РЕДАКТИРОВАТЬ:

Это моя страница edit.php

<?php
  $DB_host = "localhost";
  $DB_user = "root";
  $DB_pass = "";
  $DB_name = "cmsbase";

  $MySQLi_CON = new MySQLi($DB_host,$DB_user,$DB_pass,$DB_name);

     if($MySQLi_CON->connect_errno)
     {
         die("ERROR : -> ".$MySQLi_CON->connect_error);
     }


     $sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

    if ($MySQLi_CON->query($sql) === TRUE) {
    echo "";
    } else {
    echo "Error: " . $sql . "<br>" . $MySQLi_CON->error;
    }
    $MySQLi_CON->close(); //close connection


    echo "<script>alert('Edited');location.href='index.php';</script>";

?>

EDIT: это то, что содержит var_dump Это то, что написано в var_dump

0
JohnMichael 19 Апр 2016 в 22:28

2 ответа

Лучший ответ

Чтобы значения присутствовали в $_POST, вам необходимо иметь некоторый элемент (например, <input>, <select>, <textarea>) внутри вашей формы с name атрибут установлен на желаемый ключ $_POST.

Вы можете добавить скрытый ввод в свою форму для идентификатора.

<input type='hidden' name='id' value='" . $id . "'>

Предполагая, что вы получаете переменную $message, показанную в этом коде формы, путем выбора из своей базы данных, вы также сможете получить идентификатор оттуда или, возможно, из своего $_GET, если так вы определяете какой пост отображается.

2
Don't Panic 19 Апр 2016 в 19:57

(Хотя на самом деле это не ответ, то, что я хочу сказать, не помещается в комментариях)

Ваша линия

$sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

Ужасно. Это кошмар. Допустим, данные POST в форме отправлены из сценария каким-то роботом, потому что я почти уверен, что вы этого не делаете предотвратить XSRF в вашем коде.

Что, если этот сценарий выбрал публикацию:

$_POST ==> array => message = "mwahahaha";
                 => id      = "1; DROP TABLE paginas;"

И вы можете подумать, «откуда они узнают имя моего стола?» , но это легко найти с помощью других гнусных вставок идентификаторов или других взломов вашего кода из других точек входа, которые дают результат SELECT, и многие таблицы имеют общие имена, такие как " users " / " orders "/" корзины "/" touch-me "и т. д. (Хорошо, может быть, не трогайте меня, но идею вы поняли).

Mysqli_real_escape_string() Можно использовать, но это только экранирование кавычек и специальных символов, это не снижает риск внедрения и компрометации SQL.

Итак, что вам делать?

В данном случае я хочу обратить ваше внимание на жонглирование типов PHP. В отличие от многих других языков, PHP подразумевает типы данных, а не определенные связи данных, поэтому тип данных "1.06" можно string и использовать как float также.

Ваш параметр id в вашем MySQL очень вероятно является числовым целочисленным значением, поэтому как вы можете быть уверены, что значение $_POST['id'] также является целым числом, а не Инструкция SQL?

$id = (int)$_POST['id'];

Это заставляет значение быть целым числом, поэтому

$id = (int)"1; DROP TABLE paginas;";

Фактически обрабатывается как $id = 1. Таким образом, вы избавляетесь от множества скомпрометированных таблиц, строк спама и прочего гнусного мусора по всему вашему сайту, вашей базе данных и вашей репутации.

Пожалуйста, обратите внимание на следующую концепцию:

НИКОГДА НЕ ДОВЕРЯЙТЕ НИКОМУ КОДУ, ПРЕДСТАВЛЕННЫМ ПОЛЬЗОВАТЕЛЕМ

ВСЕГДА

1
Martin 19 Апр 2016 в 21:18