循环每行内容

时间:2017-03-14 15:52:09

标签: php android push-notification

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

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

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

<?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];

但它没有用,

请提出任何建议。

//更新了

  1. 我只得到一个令牌,但我在数据库中有两个令牌
  2. MySQLi错误
  3. 检查:Result

    // Riggs就是我的更新:

    我曾经测试过您的代码并且没有出现任何错误。

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

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

    你有办法简单地做:

    1. 获取第一行令牌值
    2. 将$ key设置为令牌
    3. Counter ++
    4. 获取第二行令牌值
    5. //做同样的步骤

1 个答案:

答案 0 :(得分:3)

我的猜测是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);
}