Telegram Bot PHP: Предупреждение: файл_get_contents не смог открыть поток: 400 неверный запрос

Я редактирую файл php для бота telegram. Когда я проверяю телеграмму, она не показывает никакого ответа. В командной строке PHP он сказал:

Предупреждение:
file_get_contents (https://api.telegram.org/bottoken/sendMessage):
не удалось открыть
поток: HTTP-запрос не выполнен! HTTP / 1.1 400 неверный запрос в G: \ xampp \ htdocs \ xbot \ file.php on
линия 39

И в строке 39:

 $result = file_get_contents(request_url('sendMessage'), false, $context);

Но это работает, когда я меняю функцию create_response на эту:

function create_response($text)
{
$conn = mysqli_connect("localhost","root","admintma","aq");
$data = array();
$sql = "Select s.text_sr AS surat, s.no_sr AS nosurat, qi.verseid AS ayat, " .
"qi.ayahtext AS ayattext from quranindonesia qi left join surah s on " .
"qi.suraid=s.no_sr where qi.ayahtext like '%$text%' limit 3,5";
$cari = mysqli_query($conn, $sql);
//$hasil = '';

if (mysqli_num_rows($cari) > 0) {
// output data of each row
while($row = mysqli_fetch_array($cari)) {
$hasil = "QS.[".$row["surat"]."-" . $row["nosurat"]. "]:" .
$row["ayat"]. ": " . $row["ayattext"]. ". ";
var_dump($hasil);
}
} else {
$hasil = "0 results";
}
return $hasil;
mysqli_close($conn);
}

Но он показывает только последний результат, а в командной строке php показывает полный результат:

string(157) "Value1"string(219) "Value2"string(462) "Value3"string(555) "Value4"string(246) "Value5"{
"ok": true,
"result": {
"message_id": 197,
"from": {
"id": 107653xxx,
"first_name": "x_bot",
"username": "x_bot"},
"chat": {
"id": 2887198,
"first_name": "xxx",
"username": "xxx"},
"date": 1437240345,
"reply_to_message": {
"message_id": 196,
"from": {
"id": 2887xxx,
"first_name": "xxx",
"username": "xxx"},
"chat": {
"id": 2887xxx,
"first_name": "xxx",
"username": "xxx"},
"date": 1437240342,
"text": "mengetahuinya"},
"text": "Value5"}
}

Я запутался, как решить эту проблему? Заранее спасибо.

Вот полный код:

<?php
include("token.php");
//include("db.php");

function request_url($method)
{
global $TOKEN;
return "https://api.telegram.org/bot" . $TOKEN . "/". $method;
}

function get_updates($offset)
{
$url = request_url("getUpdates")."?offset=".$offset;
$resp = file_get_contents($url);
$result = json_decode($resp, true);
if ($result["ok"]==1)
return $result["result"];
return array();
}

function send_reply($chatid, $msgid, $text)
{
$data = array(
'chat_id' => $chatid,
'text'  => $text,
'reply_to_message_id' => $msgid
);
// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
'method'  => 'POST',
'content' => http_build_query($data),
),
);
$context  = stream_context_create($options);

$result = file_get_contents(request_url('sendMessage'), false, $context);
print_r($result);
}

function create_response($text)
{
$conn = mysqli_connect("localhost","root","xxx","aq");
$data = array();
$sql = "Select s.text_sr AS surat, s.no_sr AS nosurat, qi.verseid AS ayat, " .
"qi.ayahtext AS ayattext from quranindonesia qi left join surah s on " .
"qi.suraid=s.no_sr where qi.ayahtext like '%$text%' limit 3,5";
$cari = mysqli_query($conn, $sql);
//$hasil = '';

if (mysqli_num_rows($cari) > 0) {
$hasil = array();
// output data of each row
while($row = mysqli_fetch_array($cari)) {
$hasil[] = "QS.[".$row["surat"]."-" . $row["nosurat"]. "]:" .
$row["ayat"] . ": " . $row["ayattext"] . ". ";
//var_dump($hasil);
}
} else {
$hasil = "0 results";
}
return $hasil;
mysqli_close($conn);
}

function process_message($message)
{
$updateid = $message["update_id"];
$message_data = $message["message"];
if (isset($message_data["text"])) {
$chatid = $message_data["chat"]["id"];
$message_id = $message_data["message_id"];
$text = $message_data["text"];
$response = create_response($text);
send_reply($chatid, $message_id, $response);
}
return $updateid;
}

function process_one()
{
$update_id  = 0;

if (file_exists("last_update_id")) {
$update_id = (int)file_get_contents("last_update_id");
}

$updates = get_updates($update_id);

foreach ($updates as $message)
{
$update_id = process_message($message);
}
file_put_contents("last_update_id", $update_id + 1);

}

while (true) {
process_one();
}

?>

2

Решение

Проблема в том, что ваша функция process_message() надеется create_response() чтобы вернуть строку, а код, который не работает, возвращает массив, когда есть результаты, и строку, когда результатов нет. Лучше всего, если он всегда возвращает один и тот же тип данных.

Чтобы исправить это, измените create_response() функция, чтобы всегда возвращать массив, и иметь process_message() чтобы использовать его, однако необходимо преобразовать его в строку.

Кстати, ваш return команда должна быть последней командой, выполненной в функции. У тебя есть mysqli_close($conn); после него, который никогда не выполняется, если return выше него.

Итак, эти две функции становятся:

function create_response($text)
{
$conn = mysqli_connect("localhost","root","xxx","aq");
$data = array();
$sql = "Select s.text_sr AS surat, s.no_sr AS nosurat, qi.verseid AS ayat, " .
"qi.ayahtext AS ayattext from quranindonesia qi left join surah s on " .
"qi.suraid=s.no_sr where qi.ayahtext like '%$text%' limit 3,5";
$cari = mysqli_query($conn, $sql);

$hasil = array();
if (mysqli_num_rows($cari) > 0) {
// output data of each row
while($row = mysqli_fetch_array($cari)) {
$hasil[] = "QS.[".$row["surat"]."-" . $row["nosurat"]. "]:" .
$row["ayat"] . ": " . $row["ayattext"] . ". ";
}
}
mysqli_close($conn);
return $hasil;
}

function process_message($message)
{
$updateid = $message["update_id"];
$message_data = $message["message"];
if (isset($message_data["text"])) {
$chatid = $message_data["chat"]["id"];
$message_id = $message_data["message_id"];
$text = $message_data["text"];
$responseArr = create_response($text);
if (count($responseArr) > 0) {
$response = implode(". ", $responseArr) . ".";
} else {
$response = "0 results";
}
send_reply($chatid, $message_id, $response);
}
return $updateid;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]