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

Php 将会话数据插入mysql数据库时出错,php,mysql,mysqli,Php,Mysql,Mysqli,我有这个功能可以将图片数据插入mysql数据库,并且会话值是在登录时声明的,只有在注销后才会被销毁。但是,显示错误的浏览器, 未定义的变量:\ u会话。 为什么呢? 请有人帮忙吗 public function save($filename, $type, $size){ global $connect; $sql = "INSERT INTO photograph ("; $sql .= " filename, type, size, captio

我有这个功能可以将图片数据插入mysql数据库,并且会话值是在登录时声明的,只有在注销后才会被销毁。但是,显示错误的浏览器, 未定义的变量:\ u会话。 为什么呢? 请有人帮忙吗

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";
       }

}

尝试将此行更新为:

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

$\u会话数组的双引号会在字符串双引号内引起问题。首先,您不需要执行所有的
=
串联,这样可以使查询更易于阅读

第二,不能在双引号字符串中使用双引号,因为它会终止双引号字符串,所以请使用带有单引号的
$\u 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);
        }
    }
}

这是因为你的引号到处都是,而且你至少使用了一个[MySQL关键字]()作为列名。您应该对所有查询进行错误检查,并且永远不要假设查询可以工作。脚本开头是否有
session\u start()