You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:基于PHP Webhook的Dialogflow聊天机器人对接MySQL数据库

解决Dialogflow PHP Webhook查询MySQL并返回结果的问题

我来帮你搞定这个MySQL查询并返回结果到Dialogflow的问题!咱们一步步拆解,先理清楚整个流程,再给你补全代码。

核心流程梳理

Dialogflow调用你的Webhook时,会发送一个JSON格式的POST请求,你需要:

  1. 解析这个请求,提取用户的输入(或者Dialogflow识别后的参数)
  2. 用提取到的内容作为条件,查询MySQL数据库
  3. 将查询结果整理成Dialogflow要求的响应格式
  4. 把响应返回给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

火山引擎 最新活动