未从更新/插入表单

时间:2016-04-19 16:14:36

标签: php mysql

我有一个update information表格可以做两件事:

  • 更新数据库表中已有的信息。
  • 添加以前未存储在数据库表中的信息。

下面是我的PHP代码:

    <?php
    require_once("../includes/database.php");
?>

<?php
// restricts access to logged in users only
session_start();
if(isset($_SESSION['student_id'])) {
    // do nothing
}
else {
    header('Location: login.php');
}
?>

<?php
    //mysql_
    $connection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
    if(mysqli_connect_errno())
    {
        die("Database connection failed: " .
                    mysqli_connect_error() .
        " (" . mysqli_connect_errno() . ")");
    }
?>

<?php
    // retrieves current user information
    $student_id = $_SESSION['student_id'];
    $query1 = "SELECT * FROM students WHERE student_id = {$student_id}";
    $result1 = mysqli_query($connection, $query1);
    $row = mysqli_fetch_assoc($result1);
    $_SESSION["fname"] = $row["f_name"];
    $_SESSION["lname"] = $row["l_name"];
    $_SESSION["email"] = $row["email"];
    $_SESSION["key"] = $row["password"];

?>
<?php
    // updates database with updated user info
    if(isset($_POST['update'])) {
        $update_f_name = $_POST['fname'];
        $update_l_name = $_POST['lname'];
        $update_email = $_POST['email'];
        $update_pword = $_POST['key'];
        $insert_username = $_POST['username'];
        $insert_city = $_POST['city'];
        $insert_state = $_POST['state'];
        $insert_zip = $_POST['zip'];
        $insert_bio = $_POST['bio'];
        //updates information already in the db
        $query ="UPDATE students 
                SET f_name = '{$update_f_name}', 
                l_name = '{$update_l_name}', 
                email = '{$update_email}', 
                password = '{$update_pword}' 
                WHERE student_id='{$student_id}'";
        //inserts additional information into the db
        $query2 = "INSERT INTO students 
                   (username, city, state, zip, bio) 
                   VALUES('{$insert_username}', '{$insert_city}', '{$insert_state}', '{$insert_zip}', '{$insert_bio}')
                   WHERE student_id = '{$student_id}'";
        $result2 = mysqli_query($connection, $query2);
        $result = mysqli_query($connection, $query);

        if(!$result and !result2){
            die("Database query failed.". mysqli_error($connection));
        }
        header('Location: dashboard.php');
    }

没有显示错误和重定向(成功发生同一页面)。但是当我在phpmyadmin中检查我的数据库时,应该插入的列($query2字符串中的列)仍然具有值NULL


以下是我的数据库架构:

    CREATE TABLE students
(
    student_id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(30),
    email VARCHAR(80),
    password VARCHAR(30),
    f_name VARCHAR(30),
    l_name VARCHAR(30),
    bio VARCHAR(350),
    dp VARCHAR(15),
    is_suspended CHAR(1) DEFAULT '0' NOT NULL,
    suspension_reason VARCHAR(150),
    role_id INT NOT NULL,
    created_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_on TIMESTAMP,
    is_active CHAR(1) DEFAULT '1' NOT NULL,
    city VARCHAR(15) NOT NULL,
    state VARCHAR(15) NOT NULL,
    zip VARCHAR(6) NOT NULL,
    b_day DATE,
    CONSTRAINT students_id_pk PRIMARY KEY(student_id),
    CONSTRAINT students_role_id_fk FOREIGN KEY(role_id) REFERENCES user_roles(role_id) ON DELETE CASCADE,
    CONSTRAINT students_username_uq UNIQUE(username),
    CONSTRAINT students_email_uq UNIQUE(email)
);

编辑:我知道我的代码很容易被SQL注入。我将在更新完美运行后实现。

3 个答案:

答案 0 :(得分:0)

session_start()将无法正常工作,因为您通过空行将第一个php块与第二个块隔开,该空行将空间输出到输出缓冲区。在将任何内容输出到输出缓冲区之前必须运行session_start(),因此请按此更改

如果您查看了PHP错误日志,则会看到错误

<?php
// restricts access to logged in users only
session_start();

require_once("../includes/database.php");

if(isset($_SESSION['student_id'])) {
    // do nothing
} else {
    header('Location: login.php');
}
?>

完全没有必要继续启动和停止所有这些<?php ... ?> <?php ... ?>

的PHP解释器

在PHP代码的开头只需要一个<?php,最后只需要一个?>

header()也不会出于同样的原因!

  

你的代码也满了SQL Injection opertunaties阅读本文,看看你可以阻止它。

此行也是一个问题

if(!$result and !result2){

应该是

if(!$result or !result2){

但当然这将使您的数据库部分更新,即一个或另一个查询将发生但另一个不会。

  

您还需要查看transactional processing

这也是一个问题

$query2 = "INSERT INTO students 
               (username, city, state, zip, bio) 
               VALUES('{$insert_username}', '{$insert_city}', '{$insert_state}', '{$insert_zip}', '{$insert_bio}')
               WHERE student_id = '{$student_id}'";

由于INSERT没有或不支持WHERE子句

答案 1 :(得分:0)

如果您从客户端获取$_POST数据,则需要避免SQL注入(请参阅PHP and SQL Injection)。

但是,我感觉它插入了空值,因为$_POST变量不存在。 我建议对您的值进行isset()检查。

啊哈,发现你的错误。正如if(!$result and !result2){那样,只有当$result AND $result2失败时,您的代码才会死亡。将其更改为OR(||),您应该好好去!

if(!$result || !result2){

是的,Riggs说,没有必要继续打开和关闭PHP标签(<?php)。如果您的脚本完全是PHP,则可以使用<?php安全地开始编写脚本,而不必使用结束标记。

答案 2 :(得分:0)

查看第二个查询,MySQL INSERT语法不支持WHERE子句,因此您的查询将失败。

此外,我无法看到更新和插入语句背后的逻辑到同一个表。您的'student_id'是PRIMARY KEY,因此假设密钥存在并且您的第一个Update语句成功,INSERT将自然失败,因为主键已经存在。

您可能需要使用以下内容将其更改为单个语句; INSERT ... ON DUPLICATE KEY UPDATE ...

e.g。

INSERT INTO students 
                   (student_id, username, city, state, zip, bio) 
                   VALUES('{$student_id}', '{$insert_username}', '{$insert_city}', '{$insert_state}', '{$insert_zip}', '{$insert_bio}')
ON DUPLICATE KEY UPDATE
                f_name = '{$update_f_name}', 
                l_name = '{$update_l_name}', 
                email = '{$update_email}', 
                password = '{$update_pword}'";

请参阅http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

如果两个更新语句都失败,您的脚本也将退出。

另外一般来说,如果这是一个完整的脚本,你应该考虑数据输入的安全性,以及检查用户是否登录的机制。也没有必要将PHP解释器停止为这将在脚本执行之前创建浏览器输出。