求助:基于PHP Webhook的Dialogflow聊天机器人对接MySQL数据库
解决Dialogflow PHP Webhook查询MySQL并返回结果的问题
我来帮你搞定这个MySQL查询并返回结果到Dialogflow的问题!咱们一步步拆解,先理清楚整个流程,再给你补全代码。
核心流程梳理
Dialogflow调用你的Webhook时,会发送一个JSON格式的POST请求,你需要:
- 解析这个请求,提取用户的输入(或者Dialogflow识别后的参数)
- 用提取到的内容作为条件,查询MySQL数据库
- 将查询结果整理成Dialogflow要求的响应格式
- 把响应返回给Dialogflow
完整代码示例
下面是补全后的完整代码,包含数据库连接、请求解析、查询、响应构造的全流程:
<?php // 处理跨域(可选,根据你的部署环境调整) header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); // 只处理POST请求 $method = $_SERVER['REQUEST_METHOD']; if ($method !== 'POST') { http_response_code(405); echo json_encode(["error" => "Method not allowed"]); exit; } // 1. 解析Dialogflow的请求数据 $request = json_decode(file_get_contents('php://input'), true); if (!$request) { http_response_code(400); echo json_encode(["error" => "Invalid JSON request"]); exit; } // 提取用户输入(或者你需要的参数,比如Dialogflow识别的实体参数) $userInput = $request['queryResult']['queryText']; // 如果是用参数的话,比如你定义了一个叫"product"的参数,就这么取: // $userInput = $request['queryResult']['parameters']['product']; // 2. 连接MySQL数据库(用PDO更安全,推荐) $dbHost = '你的数据库主机'; $dbName = '你的数据库名'; $dbUser = '数据库用户名'; $dbPass = '数据库密码'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { // 数据库连接失败时返回提示 $response = [ "fulfillmentText" => "抱歉,暂时无法查询数据,请稍后再试。" ]; echo json_encode($response); exit; } // 3. 执行MySQL查询(使用预处理语句防止SQL注入!) try { // 这里假设你有一个叫`products`的表,根据用户输入查询`name`匹配的记录 $stmt = $pdo->prepare("SELECT description FROM products WHERE name LIKE ?"); // 用%模糊匹配,根据你的需求调整 $stmt->execute(["%$userInput%"]); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // 4. 构造Dialogflow响应 if (count($result) > 0) { // 把查询结果拼接成文本 $reply = "找到以下结果:\n"; foreach ($result as $row) { $reply .= "- " . $row['description'] . "\n"; } $fulfillmentText = $reply; } else { $fulfillmentText = "没有找到和「$userInput」相关的内容哦。"; } // 按照Dialogflow要求的格式返回响应 $response = [ "fulfillmentText" => $fulfillmentText, // 如果需要更丰富的响应(比如卡片、按钮),可以加fulfillmentMessages // "fulfillmentMessages" => [ // [ // "text" => [ // "text" => [$fulfillmentText] // ] // ] // ] ]; echo json_encode($response); } catch(PDOException $e) { // 查询出错时返回提示 $response = [ "fulfillmentText" => "查询数据时出现错误,请稍后再试。" ]; echo json_encode($response); } // 关闭数据库连接(可选,PDO会自动关闭) $pdo = null; ?>
关键细节说明
- 跨域处理:开头的
Access-Control-Allow-Origin是为了本地测试方便,正式部署时可以限制特定域名。 - 请求解析:Dialogflow的请求是通过
php://input传递的JSON,必须用json_decode解析。 - SQL注入防护:一定要用预处理语句(
prepare+execute),绝对不能直接把用户输入拼进SQL语句里! - 响应格式:Dialogflow接受的响应必须是JSON格式,核心字段是
fulfillmentText(纯文本回复),如果需要更复杂的回复(比如卡片、图片),可以用fulfillmentMessages字段,具体格式可以参考Dialogflow官方文档。 - 错误处理:添加了数据库连接失败、查询失败的异常捕获,保证Webhook不会崩溃,同时给用户友好提示。
你可以根据自己的数据库表结构和业务需求,修改查询语句和结果拼接的逻辑。比如如果是查询单个记录,就用fetch()代替fetchAll(),然后直接取字段值即可。
内容的提问来源于stack exchange,提问作者Laycoonz




