将会话数据插入mysql数据库时出错

时间:2015-12-16 21:53:22

标签: php mysql mysqli

我有这个函数将图片数据插入到mysql数据库中,并且会话值在登录时被声明,在注销之前不会被销毁。但是,浏览器显示错误, 未定义的变量:_SESSION。 这是为什么? 请有人帮忙吗?

public function save($filename, $type, $size){

     global $connect;


       $sql  = "INSERT INTO photograph (";
       $sql .= " filename, type, size, caption ";
       $sql .= ") VALUES (";
       $sql .= " '{$filename}', '{$type}', '{$size}', '{$_SESSION["username"]}' ";
       $sql .= ")";
       $result = mysqli_query($connect, $sql);

       if(!$result){

          echo "Querying failed";
       }

}

2 个答案:

答案 0 :(得分:0)

尝试将此行更新为:

$sql .= " '{$filename}', '{$type}', '{$size}', '".$_SESSION["username"]."' ";

$ _SESSION数组的双引号导致字符串双引号内的问题

答案 1 :(得分:0)

首先,您不需要执行所有.=连接,这样可以使查询更容易阅读。

其次,您不能在双引号字符串中使用双引号,因为它会终止双引号字符串,因此请使用带单引号的$_SESSION['username']

第三,我认为至少有一个列名是MYSQL保留字,所以如果有疑问,请用反引号包装列名。

最好在失败的消息上输出真正的数据库错误,至少在开发过程中是这样。

public function save($filename, $type, $size){

     global $connect;


       $sql  = "INSERT INTO photograph (
                       `filename`, `type`, `size`, `caption`) 
                VALUES ('{$filename}', '{$type}', '{$size}',    
                        '{$_SESSION['username']}')";

       $result = mysqli_query($connect, $sql);

       if(!$result){
         echo "Querying failed". mysqli_error($connect);
       }

}

最后以这种方式进行查询会打开你的sql注入问题,所以尽量使用像这样的预处理语句

public function save($filename, $type, $size){

    global $connect;


    $sql  = "INSERT INTO photograph (
                      `filename`, `type`, `size`, `caption`) 
                VALUES (?,?,?,?)";

    $stmt = mysqli_prepare($sql);

    mysqli_stmt_bind_param($stmt, "ssis", 
                             $filename, $type, 
                             $size, $_SESSION["username"]);
    $result = mysqli_stmt_execute($connect, $stmt);

    if(!$result){
        echo "Querying failed". mysqli_error($connect);
    }
}

最后,在类中使用global是不好的做法,因为它会破坏封装。相反,在这种情况下将$connect作为参数传递给此方法,或者更好的是,如果此类需要它使其成为类变量

class whatever
{

    public $connect

    public function __construct($db_connection)
    {
        $this->connect = $db_connection;
    }

    public function save($filename, $type, $size){

        $sql  = "INSERT INTO photograph (
                          `filename`, `type`, `size`, `caption`) 
                    VALUES (?,?,?,?)";

        $stmt = mysqli_prepare($this->connect,$sql);

        mysqli_stmt_bind_param($stmt, "ssis", 
                                 $filename, $type, 
                                 $size, $_SESSION["username"]);
        $result = mysqli_stmt_execute($stmt);

        if(!$result){
            echo "Querying failed " . mysqli_error($this->connect);
        }
    }
}