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

我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:19:43