这让我疯了,我正在学习PHP,这个问题让我整天都在。我将一些用户数据库中的信息提取到一个文件中,然后在表单中使用它插入到另一个表中。
我想使用用户ID和用户名执行此操作,我立即尝试了$userID = $_GET['id'];
,但效果很好但在尝试$username = $_GET['username']
时没有。为了获得这个表单,我将用户ID回显到url中,这是为什么它只能获取ID?
如果我回复用户名,那就有点难过了。我想如果我将用户名回显到网址,它会起作用而且ID不会,但我不想回应用户名或两者都是诚实的,除非我也有。
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
include_once '../includes/conn.php';
if(!$user->is_loggedin()){
$user->redirect('../users/login.php');
}
$stmt = $conn->prepare("SELECT id, username FROM users");
$stmt->execute();
$userRow=$stmt->fetch(PDO::FETCH_ASSOC);
$userID = $_GET['id'];
$username = $_GET['username'];
if(isset($_POST['submit'])){
$category = trim($_POST['category']);
$points = trim($_POST['points']);
$reason = trim($_POST['reason']);
if($category==""){
$error[] = "Select category.";
}else if($points==""){
$error[] = "Provide points.";
}else if($reason==""){
$error[] = "Provide reason.";
}else if(strlen($reason) < 6){
$error[] = "Reason must be at least 6 characters<br /><br />";
}else{
try{
$sql = "INSERT INTO infractions(userid,username,category,points,reason)VALUES(?,?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->execute(array($userID, $username, $category, $points, $reason));
}
catch(PDOException $e){
echo $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>EpicOwl UK | CMS Users Add Infraction</title>
<meta charset="utf-8">
<link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" type="text/css" href="../css/main.css">
</head>
<body>
<div id="header">
<a href="index.php"><img id="logo" src="../images/logo.png" /></a>
<div id="navigation">
<ul>
<a href="../index.php"><li>Home</li></a>
<a href="../users/profile.php"><li>My Profile</li></a>
<a href="./index.php"><li>Admin Panel</li></a>
</ul>
</div>
</div>
<div id="content">
<form method="$_POST"><br />
<h2>Give <?php echo ($userRow['username']); ?> an Infraction</h2>
<label><strong>Category:</strong></label><br />
<select name="category">
<option value="Select Category">Select Category</option>
<option value="Language Used">Language Used</option>
<option value="Breaking Rules">Breaking Rules</option>
<option value="Double Posting">Double Posting</option>
</select><br /><br />
<label><strong>Number of points to award:</strong></label><br />
<input type="text" name="points" maxlength="50" /><br /><br />
<label><strong>Reason:</strong><label><br />
<textarea name="reason" rows="13" cols="60" maxlength="255"></textarea><br /><br />
<button type="submit" name="submit">Add Infraction</button><br /><br /><br />
</form>
</div>
<div id="footer">
<p class="copyright">© EpicOwl UK. All Rights Reserved.</p>
</div>
</body>
</html>
答案 0 :(得分:3)
看起来你正在混合准备好的陈述和查询。查询应该有占位符,PHP驱动程序将插入值。
这是一种方法..
$sql = "INSERT INTO infractions(userid,username,category,points,reason)VALUES(?,?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->execute(array($userID, $username, $category, $points, $reason));
这是第二种方式......
$sql = ("INSERT INTO infractions(userid,username,category,points,reason)VALUES(:userid, :username, :category, :points, :reason)");
$stmt = $conn->prepare($sql);
$stmt->execute(array(':category'=>$category, ':points'=>$points, ':reason'=>$reason, ':userid' => $userID, ':username'=> $username));
和第三种方法
$sql = ("INSERT INTO infractions(userid,username,category,points,reason)VALUES(:userid, :username, :category, :points, :reason)");
$stmt = $conn->prepare($sql);
$stmt->bindParam(":category", $category);
$stmt->bindParam(":points", $points);
$stmt->bindParam(":reason", $reason);
$stmt->bindParam(":userid", $userID);
$stmt->bindParam(":username", $username);
$stmt->execute();
我较少使用绑定,因此可能存在一些问题,但我认为这是正确的用法。
这是关于它的PHP手册,http://php.net/manual/en/pdo.prepared-statements.php。
准备语句的原因是将用户提供的数据与SQL分开。如果没有分离,您可能会遇到SQL注入,或者只是失败的查询,例如Mr. O'brien
试图创建帐户/登录。
SQL注入攻击是一种注入攻击,其中SQL命令被注入到数据平面输入中,以便执行预定义的SQL命令。
https://www.owasp.org/index.php/SQL_injection
和一个阻止这个
的方法的线程How can I prevent SQL injection in PHP?
method
元素的form
属性告诉表单应如何传输数据。值为post
或get
。您似乎也在PHP中将它们混合在一起。
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form
post:对应HTTP POST方法;表单数据包含在表单正文中并发送到服务器。
get:对应HTTP GET方法;表单数据附加到动作属性URI,带有'?'作为分隔符,生成的URI将发送到服务器。当表单没有副作用且仅包含ASCII字符时,请使用此方法。
PHP用法:
http://php.net/manual/en/reserved.variables.get.php
http://php.net/manual/en/reserved.variables.post.php
答案 1 :(得分:0)
我使用addinfraction.php?id = 1
这就是它无法正常工作的原因。您必须设置username参数才能工作。就像我说的那样:
addinfraction.php?id=<?php echo $list['id']; ?>&username=<?php echo $list['username']; ?>
addinfraction.php不知道你的例子中的用户名,不像id。
参数由字符&#39;&amp;&#39;分隔,如下所示:
?parameter1=value1¶meter2=value2¶meter3=value3 /*etc...*/