循环每行内容

Posted

技术标签:

【中文标题】循环每行内容【英文标题】:Loop on each row content 【发布时间】:2017-03-14 15:52:08 【问题描述】:

我正在使用此脚本向单个用户发送推送通知。

我想在脚本中创建一个循环以将通知发送给所有用户。

我必须从数据库中获取令牌并为每个令牌循环。

<?php

require "init.php";
$message=$_POST['message'];
$title=$_POST['title'];
$path_to_fcm='https://fcm.googleapis.com/fcm/send';
$server_key="MY_SERVER_KEY";
$sql="select * from fcm_info"; //there's one field called fcm_token
$result=mysqli_query($con,$sql);
$row=mysqli_fetch_row($result);
$key=$row[0];

$headers= array(
'Authorization:key='.$server_key,
'Content-Type:application/json'
);

$fields= array('to'=>$key,
'notification'=>array('title'=>$title,'body'=>$message));

$payload=json_encode($fields);

$curl_session= curl_init();
curl_setopt($curl_session,CURLOPT_URL, $path_to_fcm);
curl_setopt($curl_session,CURLOPT_POST, true);
curl_setopt($curl_session,CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_session,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_session,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_session,CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($curl_session,CURLOPT_POSTFIELDS, $payload);

$result=curl_exec($curl_session);
curl_close($curl_session);
mysqli_close($con);?>

我试过的是:

while($d=mysqli_fetch_array($result,MYSQLI_BOTH))

echo $d[0]; 

我改变了:

$key to $d[0];

但是没用,

任何建议,请。

//更新了

    我只得到一个令牌,但我在数据库中有两个 MySQLi 错误

查看:Result

//Riggs 这是我的更新:

我曾经测试过你的代码,没有出现错误。

我添加了 echo $row['fcm_token'];在while循环之后,但页面没有显示我的回声。

通知已发送到数据库中 fcm_token 的第一行。我认为 Riggs 认为循环没有获取第二行,也没有将 $key 设置为新令牌。

你有办法简单地做吗:

    获取第一行标记值 将 $key 设置为令牌 计数器 ++ 获取第二行标记值

//做同样的步骤

【问题讨论】:

你对“它不起作用”是什么意思——你有错误吗?显示消息..你有错误的结果.? .然后显示数据样本您的结果和预期结果 “但它不起作用” - 定义它;将mysqli_error($con) 添加到查询中是否有任何错误?错误报告呢? 抱歉,编辑了问题伙计们,代码有效,但它正在将通知发送到我从数据库中获得的唯一令牌,但我有两个,可能是错误的循环? 【参考方案1】:

我的猜测是fcm_token不是查询结果中返回的第一列,当使用SELECT *

当您使用* 查询数据库时,即返回所有列,您想要的单列没有理由成为结果数组中返回的第一列。所以假设使用$row[0]

是很危险的

如果您只想返回特定的列,而不是在查询中指定列名,那么您不仅知道哪一列将是结果数组中的第一/第二/...,而且效率更高。

$sql="select fcm_token from fcm_info"; //there's one field called fcm_token
$result=mysqli_query($con,$sql);
$row=mysqli_fetch_row($result);
// now using columns positions i.e. $row[0] will be getting the fcm_token col
$key=$row[0];

最好还是使用mysqli_fetch_assoc() 和类似的列名

$sql="select fcm_token from fcm_info"; //there's one field called fcm_token
$result=mysqli_query($con,$sql);
$row=mysqli_fetch_assoc($result);
$key=$row['fcm_token'];

当涉及到对返回的多个结果的循环时,再次使用列名并使用参数 MYSQLI_ASSOC 以便将行作为关联数组返回,即列名用作行数组的键。

while($row=mysqli_fetch_array($result,MYSQLI_ASSOC))

    echo $row['fcm_token]; 

或者

while($row=mysqli_fetch_assoc($result))

    echo $row['fcm_token]; 

RE:你评论,这是你建议你想做的事

<?php
require "init.php";
$message=$_POST['message'];
$title=$_POST['title'];
$path_to_fcm='https://fcm.googleapis.com/fcm/send';
$server_key="MY_SERVER_KEY";
$sql="select * from fcm_info"; //there's one field called fcm_token
$result=mysqli_query($con,$sql);

// remove this it is fetching the first row outside the loop
//$row=mysqli_fetch_row($result);
//$key=$row[0];

$headers= array(
                'Authorization:key='.$server_key,
                'Content-Type:application/json'
        );


while($row=mysqli_fetch_assoc($result)) 

    $fields = array('to'=>$row['fcm_token'],
                   'notification'=>array(
                            'title'=>$title,
                            'body'=>$message
                            )
                    );

    $payload = json_encode($fields);

    $curl_session= curl_init();
    curl_setopt($curl_session,CURLOPT_URL, $path_to_fcm);
    curl_setopt($curl_session,CURLOPT_POST, true);
    curl_setopt($curl_session,CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl_session,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_session,CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl_session,CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($curl_session,CURLOPT_POSTFIELDS, $payload);

    $result=curl_exec($curl_session);
    curl_close($curl_session);

【讨论】:

非常感谢 RiggsFolly,但我想要让我们假设我有多个令牌一个是:1234,另一个是:5678 和其他.. 我想将每个令牌设置为 $key 并发送通知.但在你的例子中,我仍然得到一个令牌。不能用for循环吗? 查看完整代码的编辑。您忘记在选择后删除提取,这是获取第一个结果并且什么都不做。现在循环正在处理它应该适用于所有结果的所有结果 非常感谢@RiggsFolly 我很快就会看到它

以上是关于循环每行内容的主要内容,如果未能解决你的问题,请参考以下文章

java循环嵌套

循环结构进阶

notepad去除每行空格后面的所有的内容,并且获取每行最后一个字段的内容(就是删除每行的行首空格)

七.sed多行模式和循环

C如何将.txt文件的内容放入二维数组

c:forEach中对List的遍历,list每一个对象不是bean,而是String,在JSP中,怎么JSTL循环输出list内容