我有这个函数将图片数据插入到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";
}
}
答案 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);
}
}
}