PHP / MySQL:从DB中删除数据

时间:2018-01-08 23:03:42

标签: php mysql database sql-delete

这比标题可能让你相信要复杂得多。我有一个用户在用户进入页面后立即查询我的数据库的功能。然后查询返回idnote_name(这些是我的数据库中列中的名称)。我可以让笔记显示得很好,我遇到麻烦就是删除它们。我对如何动态告诉服务器当前正在选择哪个音符感到困惑。

如果我提供了足够的信息来解决这个问题,请告诉我,我正在删除不必要的代码以节省空间。所有代码都在相同的.php脚本中。

notes.php

select_notes()函数

// query DB for pre-existing notes
function select_notes() {
  include('includes/connection.php');

  $username = $_SESSION['username'];
  // make READ query to the db and return the results
  $query  = "SELECT `id`, `note_name` FROM `notes` WHERE `username`='$username'";
  $result = mysqli_query($conn, $query);

  if (mysqli_num_rows($result) > 0) {
    // create empty array for future use
    $note_id   = [];
    $note_name = [];

    while ($row = mysqli_fetch_assoc($result)) {
      // push all the data from $row into $note_name array
      array_push($note_id, $row['id']);
      array_push($note_name, $row['note_name']);
    }

    // close connection and return array containing note details from DB
    mysqli_close($conn);

    return [ $note_id, $note_name ];
  } else {
    mysqli_close($conn);
    echo '<p>No notes available</p>';
  }
}

在HTML

中调用select_notes()的位置
<div class="saved-notes col-10 offset-1 col-md-4 offset-md-0">
          <header class="text-center">
            <h2>Saved Notes</h2>
          </header>
          <div class="pt-2">
            <form action="<?php htmlspecialchars($_SERVER['PHP_SELF']); ?>" class="form-inline px-1" method="POST">
              <input class="form-control mb-1 mr-1" name="note_name" type="text">
              <input class="btn btn-success btn-sm" name="create_note" type="submit" value="Save">
            </form>

            <?php

              if ($_POST['create_note']) {
                insert_note();
              }

              list($note_id, $note_name) = select_notes();

              foreach (select_notes() as $note) {
                foreach ($note as $value) {
                  echo '
                        <form action="notes.php" class="single-note-form" method="POST">
                          <button name="edit_note" type="submit">'.$value.'</button>
                          <button class="text-danger" name="delete_note" type="submit">&times;</button>
                        </form>
                  ';
                }
              }

            ?>

          </div>
        </div><!-- col -->

2 个答案:

答案 0 :(得分:2)

在“删除”表单中,您必须嵌入在查询中选择的注释的ID

<form action="notes.php" class="single-note-form" method="POST">
    <button name="edit_note" type="submit">'.$value.'</button>
    <button class="text-danger" name="delete_note" type="submit">&times;</button>
    //include a hidden field containing the records ID
    <input type="hidden" name="note_id" value="?" />
</form>

你会发现你返回数组的结构是为了限制。目前,您有2个数组,一个带有注释文本(我假设),另一个带有注释ID。我会把它组合成这样的一行(在select_notes里面):

 $notes = [];
 while ($row = mysqli_fetch_assoc($result)){
   $notes[] = ['id' => $row['id'], 'note_name' => $row['note_name']];
 }
 return $notes;

这样你将拥有一个多维数组,就像数据库返回的那样,然后在你的HTML中:

foreach (select_notes() as $note) {
   echo '
<form action="notes.php" class="single-note-form" method="POST">
    <button name="edit_note" type="submit">'.$note['note_name'].'</button>
    <button class="text-danger" name="delete_note" type="submit">&times;</button>
  <input type="hidden" name="note_id" value="'.$note['id'].'" />
</form>';
}

或者将note_id纳入表单的其他方式。

如果你需要一个id列表,使用$ids = array_column($notes, 'id')将它从多维数组中拉出来非常简单,所以你不会因使用组合结构而失去任何东西。事实上,它使代码更清晰,更简洁,更简洁。

http://php.net/manual/en/function.array-column.php

但无论如何,一旦它嵌入到表单中,它就变得简单了,因为它已经传递了post请求。然后,当您执行删除时,只需$_POST['note_id']即可。

您还应该在查询中使用预准备语句,即使它的会话数据并且您认为它是干净的。谁知道会发生什么变化,你可能会介绍一种方法,让用户修改该值,然后是开放季节。应始终执行SQL注入预防。这需要很少的努力,然后你知道你的代码是好的。

最后一件事:

$query  = "SELECT `id`, `note_name` FROM `notes` WHERE `username`='$username'";

我想说使用username可能会让你在某些方面感到悲伤。这应该真正使用用户表中的id。现在您的用户名可能是唯一的,但从纯粹的性能角度来看,使用数字索引比字符串更快。而且,这只是我的错误......

答案 1 :(得分:2)

我从您的问题中理解的是,用户登录并发送到这个新页面,其中PHP代码会发回与其用户名相关联的一个或多个注释。

您在页面上显示这些注释,但您想知道如何删除注释。

PHP运行一次,然后停止。它会显示页面上显示的注释。现在,您需要一种方法来(1)捕获用户交互(单击注释)和(2)发送指令以从数据库中删除注释。

执行此操作的一个好方法是使用javascript / jQuery捕获用户单击事件,以及(2)AJAX向/从服务器上的另一个PHP文件发送/接收数据(不用担心,比它简单得多)声音)。 PHP文件将接收信息并运行MySQL指令以删除相应的注释。

以下是一些简单的AJAX示例,以便您了解它是如何工作的。

https://stackoverflow.com/a/17974843/1447509

基本上,您的代码看起来像这样:

$(document).on('click', '.user-note', function(){
  var tmp = $(this).attr('id'); //assuming the id contains the note_id and you can isolate that, perhaps with .split()
  $.ajax({
    type: 'post',
     url: 'name_of_php_file_on_your_server.php',
    data: 'note_id=' +tmp+ '&what2do=delete'
  }).done(function(d){
    alert(d); //displays whatever the above PHP file echo's back to javascript
  });
});