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