php update table по форме

Я пытаюсь обновить таблицу из формы.

У меня 3 страницы. Первая запрашивает все строки из моей таблицы с помощью ссылки «Изменить». При нажатии на редактирование (стр. 2) код вытягивает $ id и помещает его в URL-адрес. Идентификатор $ id извлекается из URL-адреса и используется в запросе для заполнения формы.

Моя проблема заключается в передаче обновленной информации о форме в мою таблицу. В основном обновление не происходит.

Вторая страница

<?php include '../db/config.php'; include '../db/opendb.php'; $id = $_GET["id"]; $order = "SELECT * FROM tableName where id='$id'"; $result = mysql_query($order); $row = mysql_fetch_array($result); ?> <form method="post" action="edit_data.php"> <input type="hidden" name="id" value="<?php echo "$row[id]"?>"> <tr> <td>Title</td> <td> <input type="text" name="title" size="20" value="<?php echo"$row[title]"?>"> </td> </tr> <tr> <td>Post</td> <td> <input type="text" name="post" size="40" value="<?php echo "$row[post]"?>"> </td></tr> <tr> <td align="right"> <input type="submit" name="submit value" value="Edit"> </td> </tr> </form> 

* фиксированная третья страница

  include '../db/config.php'; include '../db/opendb.php'; if (isset($_POST[id])){ $id = mysql_real_escape_string(trim($_POST['id'])); }else{ $id = NULL; } if (isset($_POST[title])){ $title = mysql_real_escape_string(trim($_POST['title'])); }else{ $title = NULL; } if (isset($_POST[post])){ $post = mysql_real_escape_string(trim($_POST['post'])); }else{ $post = NULL; } $query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'"; mysql_query($query); ?> 

заранее спасибо : )

* редактировать Спасибо всем

 if (isset($_POST[title])){ $title = mysql_real_escape_string(trim($_POST['title'])); }else{ $title = NULL; } if (isset($_POST[post])){ $post = mysql_real_escape_string(trim($_POST['post'])); }else{ $post = NULL; } $query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'"; mysql_query($query); 

Я бы также рекомендовал mysqli-функции вместо mysql, и я, вероятно, не стал бы вызывать столбцы «переменная» и «столбец», чтобы избежать путаницы.

Должен быть

 UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}... 

Спросите себя, что вы настраиваете?

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

 $query = "UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']} WHERE id = '$id'"; 

Обратите внимание, что вы также должны включать поля $_POST внутри строк с фигурными скобками ( {} ) или помещать их вне кавычек. (например, " = " .$_POST['title']. ", " ). Это абсолютно необходимо, если вы используете стандартный способ доступа к ним с кавычками (например, не $_POST[title] а $_POST['title'] или $_POST["title"] ).

Кроме того, вы должны добавить в свой код следующее:

  • Некоторая обработка ошибок , в настоящее время вы даже не знаете, что-то пошло не так. Самый простой способ – проверить возвращаемое значение функции mysql_query() для null а если оно равно null , получите сообщение об ошибке mysql с mysql_error() .
  • Эвакуация для пройденных значений. В настоящее время вы напрямую передаете опубликованные данные в запрос mysql, который очень небезопасен. (См. Например, SQL-Injection в wikipedia ). Вы должны использовать mysql_real_escape_string() для всех данных формы, прежде чем вставлять их в запросы. Это ускользает от всех частей, которые могут быть вредоносными.

Это связано с тем, что вы не устанавливаете значения. В заявлении:

 $query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'"; 

вы должны передать имена столбцов для обновления.

Если вы еще не используете PDO-инструкции, чтобы предотвратить атаки SQL-инъекций, вы должны использовать больше защиты, а затем просто mysql_real_escape_string (). Помимо того, что вы избегаете данных, вы должны подтвердить, что представленные данные – это то, что вы ожидаете.

То есть. В вашем коде здесь:

  $id = $_GET["id"]; $order = "SELECT * FROM tableName where id='$id'"; $result = mysql_query($order); $row = mysql_fetch_array($result); 

Если вы добавили:

 if(is_numeric($_GET['id'])){ $id = mysql_real_escape_string(trim($_GET["id"])); $order = "SELECT id, title, post FROM tableName where id='$id'"; $result = mysql_query($order); $row = mysql_fetch_array($result); } 

Это, по крайней мере, подтверждает то, что вы выполняете, на самом деле является идентификационным номером (то есть, если идентификатор фактически является числом;). Вы можете применить эту логику ко всем своим входам, если вы еще не используете инструкции PDO. Если вы ожидаете буквы, то проверяйте буквы, цифры проверяются на номера, выбегайте специальные символы. Опять же, это минимум. Я бы действительно предложил прочитать сотни методов SQL-инъекций и начать читать PDO.

Кроме того, в отношении использования оператора SELECT *. Я попытался бы избежать этого. Он добавляет уровень уязвимости к вашим операторам, если вы измените порядок полей в таблице и используете $ row [0] (нумерованные запросы), он может гасить вещи и, наконец, если ваша таблица содержит дополнительные поля с данными, которые не имеет отношения к тем, которые вам нужны, то вы используете на этой странице, тогда вы загружаете информацию, которая вам не нужна.

  $order = "SELECT id, title, post FROM tableName where id='$id'"; 

Хорошо бы это решить. 🙂 Удачи!