php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07

简介: 本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。

前几篇笔记中已经提到过 $_GET 和 $_POST 以及 $_FILES,这篇笔记就将$_REQUEST $_SERVER 和 $_COOKIE $_SESSION来简单说明一下.

1、$_REQUEST

使用$_REQUEST既可以获取GET方式提交的数据,也可以获取POST方式提交的数据 $_REQUEST = array_merge( $_GET,$_POST)

<form action="req.php" method="post">
    <input type="text" name="t1"><br>
    <input type="submit" value="提交">
</form>

<br>

<form action="req.php" method="get">
    <input type="text" name="t2"><br>
    <input type="submit" value="提交">
</form>
<?php
// 获取表单参数 并且 使用 $_REQUEST 来获取表单的参数

// 因为两个表单的数据name值不一样,且为了安全,判断一下 获取到的数据是否是定义过的

if(isset($_REQUEST['t1'])){
   
    echo $_REQUEST['t1']."我是post提交的表单"."</br>";
}


if(isset($_REQUEST['t2'])){
   
    echo $_REQUEST['t2']."我是get提交的表单"."</br>";
}

当采用GET 和 POST 混合提交数据的方式后,预定义变量是使用了POST还是GET提交的参数,与php.ini配置文件有关.
request_order = “GP” ,GP 决定 预定义变量GET 和 POST提交的顺序 (感觉画蛇添足,没啥大用处),只要知道使用 $_REQUEST预定义变量可以获取POST和GET方式提交的数据即可

2、$_SERVER

通过$_SERVER获取服务器主机和浏览器的一些相关信息

预定义变量使用 功能
$_SERVER[“REMOTE_ADDR”] 浏览器主机IP
$_SERVER[“SERVER_ADDR”] 服务器主机IP
$_SERVER[“SERVER_NAME”] 服务器主机名
$_SERVER[“SERVER_PORT”] 服务器占用端口号
$_SERVER[“HTTP_HOST”] 服务器主机名
$_SERVER[“PHP_SELF”] 当前执行php程序的相对路径
$_SERVER[“QUERY_STRING”] 查询字符串
$_SERVER[“DOCUMENT_ROOT”] web服务器根目录
$_SERVER[“REQUEST_URI”] 请求URI

tip:$_SERVER["QUERY_STRING"] 需要在url进行拼接才会显示 req.php?xxx=yyy&zzz=mmm 这样

使用如下:

一个表单:

<form action="req.php" method="post">
    <input type="text" name="t3"><br>
    <input type="submit" value="提交">
</form>

处理表单请求参数并且显示的页面 req.php

// 通过$_SERVER获取服务器主机的一些相关信息
if(isset($_REQUEST['t3'])){
   
    echo "浏览器主机IP-".$_SERVER["REMOTE_ADDR"]."<br>"; //::1
    // 有的web服务器不支持 这个 $_SERVER["SERVER_ADDR"]
    echo "服务器主机IP-". $_SERVER["SERVER_ADDR"]."<br>";
    echo "服务器主机名-".$_SERVER["SERVER_NAME"]."<br>";// localhost
    echo "服务器占用端口号-".$_SERVER["SERVER_PORT"]."<br>";// 81
    echo "服务器主机名-".$_SERVER["HTTP_HOST"]."<br>";//localhost:81
    echo "当前程序的执行相对路径名-".$_SERVER["PHP_SELF"]."<br>";//   /req.php
    echo "查询字符串-".$_SERVER["QUERY_STRING"]."<br>";// 需要在url进行拼接才会显示  req.php?xxx=yyy&zzz=mmm 这样
    echo "web服务器根目录-".$_SERVER["DOCUMENT_ROOT"]."<br>";//D:\phpstudy_pro\WWW\phpProjects\demo1
    echo "请求URI-".$_SERVER["REQUEST_URI"]."<br>";// /req.php
}

3、$_COOKIE

cookie 常用于识别用户(比如账号的自动登录)。cookie 是一种服务器留在用户计算机上的小文件。

cookie 是一组"键值对"信息,该信息由web服务器的php程序生成,最终保存到浏览器端主机内存或者浏览器端主机硬盘文件中。

在这里插入图片描述

3.1 cookie的内容

Cookie是一段不超过4KB的小型文本数据,由一个键值对,和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

(1)name 和 value:设置Cookie的标记名称(字符串)及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令牌 。

(2)expire属性:设置Cookie的生存期(过期时间),通常为整数数据类型。有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

(3)path属性:指定Cookie在web服务器的有效路径,即web服务器访问站点。。

(4)domain属性:指定了可以访问该 Cookie 的 有效域名。

(5)secure属性:指定Cookie 信息是通过 Http协议还是 Https协议加入请求头,取值范围为 true | flase。默认值为false,表示只有使用Http协议时才将cookie加入请求头中;true的话就是使用Https协议才…

3.2 cookie的分类

有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效

  • 会话cookie

    会话cookie仅保存在客户端内存中,并在用户关闭浏览器时失效.会话cookie的典型应用是实现session会话技术。

  • 持久cookie

    持久性Cookie会保存在用户的硬盘中。
    持久性Cookie失效的情况及原因:

    • 当cookie的过期时间到了以后,cookie失效
    • 浏览器用户手动删除cookie(清理缓存)
    • 浏览器主机存放的cookie太多,浏览器自动清除cookie.

3.3 php中cookie的使用

使用 setcookie()函数 或者 header()函数 ,可以在php中自行设定cookie.

setcookie()函数
语法格式:bool setcookie(string name [ [ [ [ ,string value], int exprie ], string path ], string domain ], int secure)
函数功能: 成功创建cookie则返回true,否则返回false

header()函数
直接通过 header("Set-Cookie:name=value")即可在请求头中添加cookie。

tip:一般设定cookie的过期时间即expire属性值时,使用 time() 函数 或者 mktime() 函数。

time() 函数
语法格式: int time(void)
函数功能:返回一个时间戳(从1970-1-1到目前时间)

cookie的删除:
使用 setcookie()函数将cookie的值设置为空,或者使用setcookie()函数将expire过期时间设置为过去的时间,即可删除cookie.

3.4 cookie自动登录小demo

login.php:

<?php
    // cookie的获取,用于实现自动登录
    $uName ="";
    $uPwd ="";
    if(isset($_COOKIE['uName'])){
   
        $uName = $_COOKIE['uName'];
    }
    if(isset($_COOKIE['uPwd'])){
   
        $uPwd = $_COOKIE['uPwd'];
    }
?>

<!--创建一个登录表单-->
<form action="checkLogin.php" method="post">
    账号:<input type="text" name="uName" value="<?php echo $uName?>"><br>
    密码:<input type="password" name="uPwd" value="<?php echo $uPwd?>"><br>
    <input type="submit" value="提交">
</form>

checkLogin.php:

<?php

// 1.使用 $_REQUEST 来获取表单参数

$uName = $_REQUEST['uName'];
$uPwd = $_REQUEST['uPwd'];

// 2.登录验证,如果是 admin  1234,则允许登录
$flag1 = boolval("admin"==$uName&&1234==$uPwd);
if($flag1 ){
   
    echo "登录成功"."<br>";
    echo "账号:".$uName."<br>密码:".$uPwd."<br>";
}
if (!$flag1){
   
    echo "登录失败请重新登录!点击下面的链接即可返回登录页面"."<br>";
    echo "<a href='login.php'>返回登录页面</a>";
}

// 3.设定用户登录cookie,只要不超过cookie的过期时间,下次就可以自动登录啦
$expireTime = intval(60*60*24*3);// 3天  60*60*24*3 设定cookie的过期时间是三天
setcookie("uName",$uName,time()+$expireTime);// 设置 cookie
setcookie("uPwd",$uPwd,time()+$expireTime);
echo "你的账号信息已经存放与cookie中,".$expireTime."秒 后过期";

运行图:
在这里插入图片描述

使用F12开发者工具对网络进行抓包查看,我们自己设定的cookie是否存在于请求头中。

在这里插入图片描述
在这里插入图片描述

再次回到login.php,发现cookie已经自动填充好啦

在这里插入图片描述

4、$SESSION

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,当浏览器关闭时,会话cookie从浏览器中删除,与浏览器cookie对应的session依旧存在,直到当服务器关闭,session销毁失效,或者session的过期时间到了session失效

cookie不设置过期时间的会话就是session,cookie保存至浏览器端,session文件保存在服务器的硬盘中。

php中提供了预定义变量$_SESSION用来解析和修改Session文件PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

4.1 session的工作原理

session的工作原理:
(1)当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

4.2 session的使用

4.2.1 修改php.ini中的session配置

php.ini配置文件中有一组Session的配置选项,用于管理Session的自身属性。

  • 1.session.save_hanler = files :设置服务器保存用户个人信息的保存方式,默认为“files”,表示用文件存储session信息。如果想要使用数据库存储session信息,则将其改为 session.save_hanler = user。
  • 2.session.save_path = "自定义路径": 在save_handler设为files时,用于设置session文件的保存路径。
  • 3.session_use_cookies =1:默认值为1,代表SessionID使用cookie传递,为0时使用查询字符串传递sessionID.
  • 4.session.name = PHPSESSID:session的名称,默认值为"PHPSESSID"。
  • 5.session.auto_start=0:浏览器请求服务器页面时,是否自动开启session,默认值为0,表示不自动开启session。
  • 6.session.cookie_lifetime =0:设置sessionID在cookie中的过期时间,默认值为0(浏览器关闭sessionID即失效)。
  • 7.session.cookie_path= / :使用cookie传递sessionID时cookie的有效路径,默认为/
  • 8.session.cookie_domain = : 使用cookie传递sessionID时cookie的有效域名,默认为空。
  • 9.session.gc_maxlifetime = 1440,设置session文件中的最大过期时间,默认为1440秒,即如果1440秒之内没有访问session文件,则该session文件失效。

下面的是session在php.ini中默认的配置:

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;
; The path can be defined as:
;
;     session.save_path = "N;/path"
;
; where N is an integer.  Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories.  This is useful if
; your OS has problems with many files in one directory, and is
; a more efficient layout for servers that handle many sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
;     session.save_path = "N;MODE;/path"
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; http://php.net/session.save-path
;session.save_path = "/tmp"

; Whether to use strict session mode.
; Strict session mode does not accept an uninitialized session ID, and
; regenerates the session ID if the browser sends an uninitialized session ID.
; Strict mode protects applications from session fixation via a session adoption
; vulnerability. It is disabled by default for maximum compatibility, but
; enabling it is encouraged.
; https://wiki.php.net/rfc/strict_sessions
session.use_strict_mode = 0

; Whether to use cookies.
; http://php.net/session.use-cookies
session.use_cookies = 1

; http://php.net/session.cookie-secure
;session.cookie_secure =

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

; Initialize session on request startup.
; http://php.net/session.auto-start
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

; The path for which the cookie is valid.
; http://php.net/session.cookie-path
session.cookie_path = /

; The domain for which the cookie is valid.
; http://php.net/session.cookie-domain
session.cookie_domain =

; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
; http://php.net/session.cookie-httponly
session.cookie_httponly =

; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
; Current valid values are "Strict", "Lax" or "None". When using "None",
; make sure to include the quotes, as `none` is interpreted like `false` in ini files.
; https://tools.ietf.org/html/draft-west-first-party-cookies-07
session.cookie_samesite =

; Handler used to serialize data. php is the standard serializer of PHP.
; http://php.net/session.serialize-handler
session.serialize_handler = php

修改一下session文件的保存路径
在这里插入图片描述

4.2.2 开启session

session的使用不同于cookie,必须在php程序中调用session_start()函数启动session后才能使用session.

session_start()

语法格式:bool session_start ( void )

函数功能如下:

  • 1.加载php.ini配置文件中session的配置信息(session的生存周期,session的保存路径)加载到web服务器的内存中。

  • 2.创建SessionId 或者使用原有的SessionID。若Cookie请求头中不存在相应的SessionID则表示第一次访问,则创建一个新的SessionID来标识,若已经存在,则直接使用Cookie请求头中的已有的SessionID.

  • 3.在web服务器创建Session文件或者解析已有的Session文件.如果是新的SessionID,则创建Session文件,$_SESSION为空数组,反之若是已经存在的SessionID,则直接将Session文件中的内容到$_SESSION数组中。

  • 4.产生Cookie响应头信息,Cookie响应头会随着响应发送给浏览器。(响应头形如 ``)

4.2.3 删除和销毁session

php提供了session_unset() 和 session_destory()用来删除session数据。

session_unset()用于释放指定的 session 变量,只清空对应SessionID的数据,保留SessionID。
语法格式:void session_unset( void )

session_destory()用于彻底删除销毁session,SessionID也被清除置为0。
语法格式:bool session_destory(),销毁session成功后返回true,否则返回false。

4.3 session 图书上传信息添加和修改例子

addBook.php,添加书籍信息页面:


<form action="toAddBook.php" method="post" >
    作者:<input type="text" name="author" placeholder="请输入文章作者"><br>
    标题:<input type="text" name="title" placeholder="请输入文章标题"><br>
    类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <option value="文学类">文学类</option>
        <option value="科普类">科普类</option>
        <option value="教辅类">教辅类</option>
    </select><br>
    内容:<textarea name="content"></textarea><br>
    <input type="submit" value="添加图书">
</form>

toAddBook.php,php处理添加图书信息页面:

<?php

// 获取表单上传的文本信息
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;

// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

showBook.php,显示图书信息页面:

<?php

// 获取session数据

$author = "";
$title = "";
$bookType ="";
$content = "";
// 每个需要session的地方都需要使用session_start();来开启
session_start();
// 用isset函数判断下,不然报错就不好了
if(isset($_SESSION['author'])){
   
    $author = $_SESSION['author'];
}
if(isset($_SESSION['title'])){
   
    $title = $_SESSION['title'];
}
if(isset($_SESSION['bookType'])){
   
    $bookType = $_SESSION['bookType'];
}
if(isset($_SESSION['content'])){
   
    $content = $_SESSION['content'];
}

// 定界符输出
echo <<<div

<p>作者:$author</p>
<p>标题:$title</p>
<p>文章类型:$bookType</p>
<p>文章内容:$content</p>
<p>
    <button οnclick="window.location.href='updateBook.php'">修改图书内容</button>
</p>
div;

updateBook.php,图书更新表单页面:

<?php
    // 获取session数据

    $author = "";
    $title = "";
    $bookType ="";
    $content = "";
    // 每个需要session的地方都需要使用session_start();来开启
    session_start();
    // 用isset函数判断下,不然报错就不好了
    if(isset($_SESSION['author'])){
   
        $author = $_SESSION['author'];
    }
    if(isset($_SESSION['title'])){
   
        $title = $_SESSION['title'];
    }
    if(isset($_SESSION['bookType'])){
   
        $bookType = $_SESSION['bookType'];
    }
    if(isset($_SESSION['content'])){
   
        $content = $_SESSION['content'];
    }

?>
<form action="toUpdateBook.php" method="post" >
    作者:<input type="text" name="author" value="<?php echo $author?>"><br>
标题:<input type="text" name="title" value="<?php  echo $title;?>"><br>
类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <?php
            if ("文学类"==$bookType){
   
                echo '<option value="文学类" selected>文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类">教辅类</option>';
            }
            if ("科普类"==$bookType){
   
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类" selected>科普类</option>
                      <option value="教辅类">教辅类</option>';
            }if ("教辅类"==$bookType){
   
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类" selected>教辅类</option>';
            }
        ?>

    </select><br>
内容:<textarea name="content"><?php echo $content?></textarea><br>
    <input type="submit" value="修改图书">
</form>

toUpdateBook.php,图书更新表单数据处理页面:

<?php
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;
// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

tip:每个需要session的地方都需要使用session_start();来开启

运行代码,启动服务:

依次抓包,查看session
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行过程中 的 sessionID PHPSESSID=e2l88u5bva8bhl6ikjeuti5pm1

**打开我们的session文件保存的位置,进行查看:

其底层存储方式为author|s:6:"张三";title|s:21:"杀死一只知更鸟";bookType|s:9:"文学类";content|s:2:"77";**

在这里插入图片描述


好啦,这篇笔记就到这里啦!!!

相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
530 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
457 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
353 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。