Telegram bot Inline keyboards sends too many callbacks PHP

Viewed 522

So problem is I am using inline keyboard in my bot. And when I am trying to push this keyboard it gives me 3-5 callbacks. I don't know where is my mistake.

EDIT
I don't know why but it causes this error when i working with mysqli->fetch_assoc();

There is not full code just peace where I use inline keyboard

 if ($callback_data!=Null){
        checkJSON(3124,$order_id);
        $message_id = $update['callback_query']['message']['message_id'];
        $callback_data = json_decode($callback_data,true);
        checkJSON(3125,$callback_data["order_id"]);
        $order_id = $callback_data["order_id"];
        checkJSON(3126,$order_id);
        $rs = $mysqli->query("SELECT manager_id FROM orders WHERE id=".$order_id);
        $row = $rs->fetch_assoc();
        $manager = $row['manager_id'];

        if ($manager!=Null){
            $rs = $mysqli->query("SELECT telegram_id FROM managers WHERE id=".$manager);
            $row = $rs->fetch_assoc();
            $manager_telegram_id = $row['telegram_id'];
            if ($chatID==$manager_telegram_id){
                $callback_data = json_decode($callback_data);
                $order_id = $callback_data["order_id"];
                $status = $callback_data["status"];
                checkJSON(1231234,$callback_data);
                if($status == '3'){
                    editMessage($chatID,$message_id,"Заказ N".$order_id." подтвержден");
                }
                else{
                    editMessage($chatID,$message_id,"Заказ N".$order_id." отклонен");
                }
                $mysqli->query("UPDATE orders SET status=".$status." WHERE id=".$order_id);
            }
            sendMessage($chatID,$update['callback_query']['message']['message_id']);
            editMessage($chatID,$message_id,
            "Данный заказ уже в оброботке");

        }
        else{
            $get_manager_query = $mysqli->query("SELECT id FROM managers WHERE telegram_id=".$chatID);
            $row = $get_manager_query->fetch_assoc();
            $manager = $row['id'];

            $data1 = json_encode(array("order_id"=>$order_id,"status"=>3));
            $data2 = json_encode(array("order_id"=>$order_id,"status"=>4));
            $inline_button1 = array("text"=>"Принять","callback_data"=>$data1);
            $inline_button2 = array("text"=>"Отказать","callback_data"=>$data2);
            $inline_keyboard = [[$inline_button1,$inline_button2]];
            $keyboard=json_encode(array("inline_keyboard"=>$inline_keyboard));
            editMessage($chatID,$message_id,
                "Вы приняли данный заказ",$keyboard);
            $rs = $mysqli->query("UPDATE orders SET status=1, manager_id=".$manager." WHERE id=".$order_id);
        }

}
    function sendMessage($chatID,$text){
    $sendto =API_URL."sendmessage?chat_id=".$chatID."&text=".urlencode($text);
    file_get_contents($sendto);
}
function editMessage($chatId, $messageId, $message,$replyMarkup=Null) {

    $url = API_URL."editMessageText?chat_id=".$chatId."&message_id=".$messageId.
        "&text=".urlencode($message)."&reply_markup=".$replyMarkup;
    file_get_contents($url);

}
2 Answers

Set your data by some separator After, get that data by $update['callback_query']['data'] and split by seted separator.

$botToken = "(your token)";
$website = "https://(site_url)/bot" . $botToken;

$order_id = '44423'; //my additional data

$keyboard = ["inline_keyboard" => [
    [
            [
            "text" => "Доставлено",
            "callback_data" => "delivered_".$order_id, // set few data by '_' separator Like ("delivered_443423_phone12345667_...)
            ],
            [
                "text" => "Затримуюсь",
                "callback_data" => "delaying_".$order_id,
            ]
    ],
    ]
];

$params = [
    'chat_id' => $chat_id,
    'text' => $msg,
    'parse_mode' => 'html',
    'reply_markup' => json_encode($keyboard),
];
$ch = curl_init($website . '/sendMessage');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);

Update processing. For get update you need set webhook on file where bot is placed. https://api.telegram.org/bot(your token)/setWebhook?url=https://example.com/bot_directory/bot.php Site must have SSL (https).

$update = json_decode(file_get_contents('php://input'), TRUE);

$botToken = "(your token)";
$botAPI = "https://api.telegram.org/bot" . $botToken;

$msg = $update['message']['text'];
$user_id = $update['message']['from']['id'];

if (isset($update['callback_query'])) {

$update_multiple = explode('_', $update['callback_query']['data']); //split data

if ($update_multiple[0] == 'delivered') {
       $data1 = $update_multiple[1]; // get some data
       // ......
    }

}
Related