我的Telegram城市选择对话代码存在问题,请求技术排查
你的Telegram城市选择对话代码的问题分析
我帮你梳理了这段代码,发现几个核心问题:
按钮数组构造完全错误
你在循环里写的$this->buttons["text"] = $row["name"];,会导致每次循环都覆盖同一个text键的值,最终$this->buttons里只会剩下最后一条城市的名称,根本生成不了多个可选按钮。
反而你注释掉的那行$this->buttons[] = [ 'text' => $row["name"] ];才是正确逻辑——它会把每个城市按钮作为独立元素添加到数组中,而不是覆盖。Telegram API调用格式不符合要求
第一个sendMessage直接传$this->buttons是无效的,Telegram的消息按钮必须包裹在特定的键盘结构里(比如回复键盘reply_markup),不能直接把按钮数组当参数传。
第二个sendMessage的代码被截断了('repl...'),看得出来你原本想构造reply_markup参数但没写完,这会导致选择键盘完全无法渲染。补充小建议:如果后续要支持超过6个城市的分页选择,你还需要动态处理
offset的值,但当前先把按钮构造和API调用的基础问题解决。
给你一个修正后的简化示例参考:
public function createCityDialog() { $selectCity = "select name from telegramCity limit 6 offset 0"; $result = mysqli_query($this->connection, $selectCity); $keyboard = []; while ($row = mysqli_fetch_assoc($result)) { $keyboard[] = [ 'text' => $row["name"] ]; // 正确添加每个按钮元素 } // 按照Telegram API要求构造完整的消息参数 $this->telegramAPI->api("sendMessage", [ 'chat_id' => $this->chatID, 'text' => '请选择城市', 'reply_markup' => [ 'keyboard' => $keyboard, 'resize_keyboard' => true, // 可选:让键盘自适应屏幕大小 'one_time_keyboard' => true // 可选:用户选择后自动隐藏键盘 ] ]); }
内容的提问来源于stack exchange,提问作者Bipa
相关产品推荐
相关产品推荐

