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
相关产品推荐
相关产品推荐

