Php 单击链接时未删除用户
我有一个用户表,我希望能够在单击链接时删除用户$在会话中设置用户名。以下是链接:Php 单击链接时未删除用户,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有一个用户表,我希望能够在单击链接时删除用户$在会话中设置用户名。以下是链接: <?php echo "<a href='delete_user.php?id=".$user_name."' onclick=\"return confirm('Are you sure?')\">Delete Account</a>" ?> 以下是delete_user.php上的代码: <?php session_start(); session_destroy
<?php echo "<a href='delete_user.php?id=".$user_name."' onclick=\"return confirm('Are you sure?')\">Delete Account</a>" ?>
以下是delete_user.php上的代码:
<?php
session_start();
session_destroy();
require "connection.php";
?>
<?php
if($_GET['id'] != ""){
$user_name = $_GET['id'];
$sql = "DELETE FROM users WHERE user_name='{$user_name}'";
$result = mysqli_query($connection, $sql);
header('Location: register.php');
}
?>
<?php include "footer.php";?>
没有明确的原因来解释为什么您的代码不起作用。但是,您提到了自己是PHP新手,因此使用代码学习良好的实践可以(1)帮助解决手头的问题,(2)使代码更高效,更易于调试
我建议您以面向对象的方式使用mysqli
,它需要的代码更少,而且通常更容易理解
建立连接很简单:
<?php
$host = 'localhost';
$user = 'USERNAME';
$pass = 'PASS';
$data = 'DATABASE';
$mysqli = new mysqli($host, $user, $pass, $data);
// catch errors for help in troubleshooting
if ($mysqli->errno)
{
echo 'Error: ' . $mysqli->connect_error;
exit;
}
?>
为服务器创建安全的环境请记住以下几点:
不要相信用户输入(永远!)
不要对数据库执行直接查询
在开发时,将代码分解为多个步骤,以便轻松地对每个部分进行故障排除
记住这三件简单的事情,创建一个删除文件
<?php
if (isset($_GET['id'])
{
// never trust any user input
$id = urlencode($_GET['id']);
$table = 'users';
// set a LIMIT of 1 record for the query
$sql = "DELETE FROM " . $table . " WHERE user_name = ? LIMIT 1";
// to run your code create a prepared statement
if ($stmt = $mysqli->prepare( $sql ))
{
// create the bind param
$stmt->bind_param('s', $id);
$stmt->execute();
$message = array(
'is_error' => 'success',
'message' => 'Success: ' . $stmt->affected_rows . ' were updated.'
);
$stmt->close();
}
else
{
$message = array(
'is_error' => 'danger',
'message' => 'Error: There was a problem with your query'
);
}
}
else
{
echo 'No user id is set...';
}
首先,这是一种可怕的方法,你很容易接受SQL注入,而且还可以使用GET直接将查询标记到URL的末尾,这很容易被潜在的黑客或任何用户获得。使用POST代替jQuery,我还建议您使用Ajax,这样您就不会被重定向到php文件,而只需运行它。因为不是任何人都可以访问该URL并删除用户,所以我建议使用PHP会话,这样只有来自您站点的用户才能删除用户。另外,简单地将id传递给PHP文件是非常不安全的,因为任何人都可以在他们的站点上创建指向您的PHP文件的链接并删除用户
因此,请尝试以下方法修复代码(增加安全性):
请注意:我知道这可能不是最好的方法,也不是最坏的方法,但这是一种相当安全的方法,效果很好
您的主页index.php:
<?php
session_start();
// Create a new random CSRF token.
if (! isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = base64_encode(openssl_random_pseudo_bytes(32));
}
// Check a POST is valid.
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// POST data is valid.
}
?>
...
<form id="delete_user_form" action="delete_user.php" method="post">
<input type="hidden" name="user_id" value="<?php echo $user_name; ?>" />
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
<input type="submit" value="Delete User" />
</form>
现在,对于delete_user.php文件,这将修复错误:
<?php
session_start();
require "connection.php";
// Checks if csrf_token is valid
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if(isset($_POST['user_id']) && $_POST['user_id'] != ""){
$user_name = $_POST['user_id'];
$sql = "DELETE FROM users WHERE user_name = '$user_name' LIMIT 1"; //LIMIT 1 only allows 1 record to be deleted
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully"; //You get this in your javascript output data variable
} else {
echo "Error deleting record: " . $conn->error; //You get this in your javascript output data variable
}
$conn->close();
}
}
?>
警告:使用mysqli
时,您应该使用和将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将$\u POST
、$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:$db=newmysqli(…)
和$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了mysqli
API,不应该在新代码中使用。很多问题都可以被检测到并解决,因此错误不容易被忽略。因此您触发了一些标准注释。阅读它们。但也要考虑一下您在这里做什么。有人知道我们吗ername可以在脚本运行后删除用户。不需要密码。这就是你想要的吗?基本上,你不应该以这种方式使用用户名。我希望这是出于学术目的,因为使用此代码会非常糟糕。你绝对不会检查是否有人被允许删除该用户,所以ally有人可以随时随意删除数据库中的每个用户,直到所有用户都消失了,你才知道。感谢所有的好建议。事实证明,这不是删除,因为它是一个外键。我将设置更改为“ON delete CASCADE”,效果很好。
<?php
session_start();
require "connection.php";
// Checks if csrf_token is valid
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if(isset($_POST['user_id']) && $_POST['user_id'] != ""){
$user_name = $_POST['user_id'];
$sql = "DELETE FROM users WHERE user_name = '$user_name' LIMIT 1"; //LIMIT 1 only allows 1 record to be deleted
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully"; //You get this in your javascript output data variable
} else {
echo "Error deleting record: " . $conn->error; //You get this in your javascript output data variable
}
$conn->close();
}
}
?>
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}