【问题标题】:PHP + Mysql: Return function only show last resultPHP + Mysql:返回函数只显示最后一个结果
【发布时间】:2015-10-08 05:29:56
【问题描述】:

我正在为电报机器人编辑文件 php。当我在电报上测试时,它只显示此代码的最后一个值(但在 php 命令行上,有多个值):

if (mysqli_num_rows($cari) > 0) {
    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);

当我将函数 create_response 更改为此:

if (mysqli_num_rows($cari) > 0) {

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 命令行上显示我想要的完整结果。

如何解决这个问题?之前谢谢...

这是完整的代码:

<?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();
}

?>

【问题讨论】:

    标签: php mysql return


    【解决方案1】:

    你可以像这样使用数组:

    $linesArr = array();
    if (mysqli_num_rows($cari) > 0) {
        while($row = mysqli_fetch_array($cari)) {
            $linesArr[] = "QS.[".$row["surat"]."-" . $row["nosurat"]. "]:" . $row["ayat"]. ": " . $row["ayattext"];
        } 
        $hasil = implode(", ", $linesArr) . ".";
    } else {
        $hasil = "0 results";
    }
    return $hasil;
    mysqli_close($conn);
    

    【讨论】:

    • 已经尝试过这种方式,但我按照您的建议再次尝试。但是根本没有结果,并且在 php 命令行中显示此错误:警告:file_get_contents(api.telegram.org/bottoken/sendMessage):打开流失败:HTTP 请求失败!第 39 行 G:\xampp\htdocs\xbot\file.php 中的 HTTP/1.1 400 错误请求
    • 这就是第 39 行的内容:$result = file_get_contents(request_url('sendMessage'), false, $context);
    • 您上面描述的问题与您问题中描述的问题无关。在这种情况下,我建议您打开另一个问题并解释另一个问题。当然,有人会帮助你。我和@arkascha 已经解决了这个问题。
    • 谢谢马科斯和@arckascha。我会编辑并发布完整的代码。
    【解决方案2】:

    return 语句总是只返回一个参数。这就是它的工作原理。如果您需要所有行,则必须将它们放入数组中并返回。这是一个简单的演示:

    <?php
    function returnRows($cari) {
        $hasil = [];
        while($row = mysqli_fetch_array($cari)) {
            $hasil[] = sprintf(
                "QS.[%s-%s]:%s: %s. ",
                $row["surat"], 
                $row["nosurat"], 
                $row["ayat"], 
                $row["ayattext"]
            );
        } 
        return $hasil;
    }
    

    这将返回一个数组,数组的每个元素都包含一个字符串,因为您在分配中将它连接起来。

    【讨论】:

    • 已经尝试过这种方式,但我按照您的建议再次尝试。但是根本没有结果,并且在 php 命令行中显示此错误:警告:file_get_contents(api.telegram.org/bottoken/sendMessage): failed to open stream: HTTP request failed!第 39 行 G:\xampp\htdocs\xbot\file.php 中的 HTTP/1.1 400 错误请求
    • 这就是第 39 行的内容:$result = file_get_contents(request_url('sendMessage'), false, $context);
    • 很可能是您遇到了另一个错误。但是我看不出与上面的代码有任何联系。该代码行当然不是您提出问题的功能的一部分。抱歉,您没有在此处发布代码。
    • 太长了,不能在这里发帖。
    • 请只发布经过清理、缩短的代码,足以证明您的问题。永远不要发布all您的代码。并且始终在问题本身中包含所有附加信息(有一个edit 按钮),不要向 cmets 发布附加信息。
    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2017-01-03
    • 2019-04-26
    相关资源
    最近更新 更多