【问题标题】:Is there a way to DELETE notes by PHP without having their ID's assigned with them?有没有办法通过 PHP 删除笔记而不分配它们的 ID?
【发布时间】:2016-08-16 08:06:39
【问题描述】:

我正在做一个网络应用练习,注册用户可以在其中登录并创建笔记。现在我想添加一个功能,如果我点击我要添加到他们身边的“X”,它会删除某个注释,但我无法真正弄清楚如何识别由此创建的某个注释方法,更准确地说,我如何返回它的 id 以用于删除查询。 这是您可以检查它现在的样子的网站,下面我将附上我列出 cmets 的方式。提前致谢!

http://laszlovaszi.com/mx_agency/index.php

<?php
function confirm_query($result) {
	if (!$result) {
		die("Database query failed.");
	}
}

function find_notes_by_id($user_id) {
	global $connection;
	$row = array();
	
	$safe_user_id = mysqli_real_escape_string($connection, $user_id);
	
	$query = 'SELECT content ';
	$query .= 'FROM notes ';
	$query .= 'WHERE user_id = '.$safe_user_id;
	$result = mysqli_query($connection, $query);
	
	confirm_query($result);
	
	$final_data = array();
    while($row = mysqli_fetch_assoc($result)){ // iterates over the result-set object to get all data
        $final_data[] = $row; //assigns value to the array
    }
	return $final_data;

}
?>

<div class="notes text-center">
					<?php
					$notes_set = find_notes_by_id($userRow['id']);
					if(empty($notes_set)){
						echo "No notes have been posted for this user yet.";
					} else {
						echo "<div class=\"notelist text-left\">";
						foreach($notes_set as $note){
							echo "<div class=\"note text-left\">";
							echo "● ";
							echo htmlentities($note['content']);
							echo "<br />";
							echo "</div>";
						}
						echo "</div>";
					}
					?>
</div>

【问题讨论】:

  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs
  • 看起来你也在慢慢写自己的 ORM。您是否考虑过使用现有的 DoctrinePropel
  • 你的意思是像笔记是我的对象吗? - 对不起,我只是一个初学者 :) 我还没有真正考虑过它们中的任何一个,因为首先我认为自己学习“硬编码”所有内容更聪明,这样我才能看透它适用于基础。
  • 这就像从一个只有零件的车间开始学习驾驶,然后必须制造自己的汽车。如果你不知道汽车是什么样子或者它应该如何工作,你可能会建造一些其他的装置并学习很多基础知识,但仍然不知道如何开车穿过城镇。 ORM 会为你做很多繁重的工作,但你仍然可以在需要的时候低头弄脏。不要认为这是作弊。将其视为完成工作并在您想要时学习,而不是因为您必须这样做。
  • 例如,Laravel 会自动为您做很多需要四五年才能完全吸收的东西:SQL、XSS、CSRF 保护、MVC 分离、数据库抽象、迁移, 等等。学习编码没有底线,最终你需要了解所有这些以及更多,但要及时。现在变得富有成效,你会觉得学习更多,而不是基础知识失败而几乎什么都做不了。保持高效,享受乐趣,并尽可能学习。享受吧!

标签: php mysql mysqli crud sql-delete


【解决方案1】:

现在我想添加一个功能,如果我点击它会删除某个注释 我将要添加到他们身边的“X”

使“X”成为一个 javascript 函数的链接,该函数获取笔记 ID 并向服务器发出 ajax 请求以删除笔记。当您在 foreach($notes_set as $note) 步骤中呈现每个注释时,该 ID 将被放置在函数调用中。链接可以这样写:

echo "<a onclick='deleteNote($note[id])'> X </a>";

当用户按下“X”时,deleteNote() 函数将执行。这个函数会向delete.php?note=123 发出一个AJAX 请求(123 是PHP 输入的$note['id'])。

这是一个原始 Javascript 示例。如果使用JQuery之类的框架,那就更简单了:

<script>
function deleteNote(noteID) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
      //remove the note from the DOM and alert user of success
    }
  };
  xhttp.open("GET", "delete.php?note="+noteID, true);
  xhttp.send();
}
</script>

在 PHP 中,您可以使用 $id = $_GET['note'] 检索注释 id。然后可以在您的 DELETE 查询中使用此值。

请记住在删除之前先验证以下内容:

  • 用户已通过身份验证
  • note id 确实属于该用户

否则,任何人都可以删除每个人的笔记。

【讨论】:

  • 如果这个链接被浏览器预取或被机器人爬取,这将导致糟糕的时刻。一个好的框架会将这些隔离在表单后面,以防止这种情况发生。
  • @tadman 这是一个很好的观点!谢谢。我会稍微修改一下以避免这种情况。
  • 谢谢,这似乎是合乎逻辑的,也是我想要做到的。我喜欢这个解决方案,笔记 ID 将与笔记本身一起呈现,我想这是我错过的部分!我马上去试试!
  • 它有效,非常感谢!我只是有点困惑,来自 url 的 id 是如何被分配到 $_GET['note'] 的?我已经意识到,$_GET['note'] 的值是在 url 本身中分配的。这实际上是如何工作的?
  • @sklrboy ? 之后的 URL 部分是查询字符串。当一个 url 有example.com?name=john&amp;id=7 时,PHP 会自动解析查询字符串并用键和值构建$_GET 数组。在此示例中,$_GET['name'] = 'john'$_GET['id'] = 7
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多