将从表中拉出的用户名插入另一个表中

时间:2015-07-07 16:07:02

标签: php html mysql

这让我疯了,我正在学习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">&copy; EpicOwl UK. All Rights Reserved.</p>
</div>
</body>
</html>

2 个答案:

答案 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属性告诉表单应如何传输数据。值为postget。您似乎也在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&parameter2=value2&parameter3=value3 /*etc...*/