You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram bot inline keyboard连接PHP MySQL数据库代码无输出求助

Telegram Inline Keyboard对接PHP+MySQL无结果问题排查

现有代码存在的问题

  • 循环内变量覆盖:while循环每次迭代都会重新给$bet_league赋值,循环结束后变量仅保留最后一条联赛数据,无法生成包含所有联赛选项的完整键盘结构。
  • 全链路无错误校验:从数据库连接、SQL执行到结果遍历环节没有任何错误捕获逻辑,任意环节失败都会导致代码静默终止,无任何报错输出。
  • 无输出/对接逻辑:代码仅完成变量赋值操作,既没有调试打印逻辑,也没有将生成的JSON结构传入Telegram Bot API接口,自然看不到执行结果。
  • 结构不符合API规范:每次循环生成的键盘结构仅包含单条数据对应的单个按钮,没有将所有联赛按钮追加到同一个键盘数组中,即使输出也不符合Telegram接口的格式要求。

修正后可运行代码

<?php
// 强制显示所有错误,调试阶段开启,正式上线可关闭
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 校验数据库连接有效性
if (!$con) {
    die("数据库连接失败:" . mysqli_connect_error());
}

$sql = "SELECT * FROM league";
$result = mysqli_query($con, $sql);

// 校验SQL执行结果
if (!$result) {
    die("查询执行失败:" . mysqli_error($con));
}

// 初始化键盘按钮容器
$leagueButtons = [];
// 遍历结果集,逐一生成按钮追加到容器
while ($row = mysqli_fetch_assoc($result)) {
    $leagueName = isset($row['league_name']) ? trim($row['league_name']) : '未命名联赛';
    // 每个子数组代表键盘的一行,这里每行放一个联赛按钮
    $leagueButtons[] = [
        [
            'text' => $leagueName,
            'callback_data' => 'league_select_' . $row['id'] // callback_data建议绑定唯一ID,长度不超过64字节
        ]
    ];
}

// 所有按钮组装完成后,统一生成符合Telegram要求的reply_markup结构
$bet_league = json_encode([
    'inline_keyboard' => $leagueButtons
], JSON_UNESCAPED_UNICODE); // 加JSON_UNESCAPED_UNICODE参数避免中文转义乱码

// 调试阶段直接输出结构校验,正式对接API时将$bet_league作为reply_markup参数传入sendMessage等接口即可
echo $bet_league;

// 释放资源
mysqli_free_result($result);
mysqli_close($con);
?>

调试&对接注意事项

  • 调试时如果输出为空,可以在代码最后加var_dump(json_last_error_msg())查看JSON编码是否失败。
  • 对接Telegram API时,reply_markup参数直接传入$bet_league字符串即可,不要二次JSON编码,否则会触发接口参数格式错误。
  • 如果league表无数据,生成的键盘为空数组,会出现无按钮的情况,可以通过mysqli_num_rows($result)判断查询结果条数,无数据时返回对应提示即可。

内容的提问来源于stack exchange,提问作者Yoni Tad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:57:23