这比标题可能让你相信要复杂得多。我有一个用户在用户进入页面后立即查询我的数据库的功能。然后查询返回id
和note_name
(这些是我的数据库中列中的名称)。我可以让笔记显示得很好,我遇到麻烦就是删除它们。我对如何动态告诉服务器当前正在选择哪个音符感到困惑。
如果我提供了足够的信息来解决这个问题,请告诉我,我正在删除不必要的代码以节省空间。所有代码都在相同的.php
脚本中。
// 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>';
}
}
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">×</button>
</form>
';
}
}
?>
</div>
</div><!-- col -->
答案 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">×</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">×</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
});
});