php - 不能将PDOStatement类型的对象用作Google Cloud Messaging的数组

问题描述 投票:0回答:1

我最近开始使用PDO编写我的应用程序,我目前正面临一个问题,即我从表中提取设备ID并将其发送到firebase以进行推送通知。当我在页面上执行时,我的下面的PHP脚本我得到这个错误

错误

Cannot use object of type PDOStatement as array in /Applications/XAMPP/xamppfiles/htdocs/myapp/send_fcm.php

PHP

$row = $conn->query("SELECT device_id,os_type from devices");
while($row->setFetchMode(PDO::FETCH_ASSOC)) {
    $gcmRegIds = array();
    array_push($gcmRegIds, $row['device_id']);
    echo json_encode($gcmRegIds);
}

$url = "https://fcm.googleapis.com/fcm/send";
$token = $gcmRegIds;
$serverKey = 'API_KEY';
$title = "Title";
$body = "Body of the message";
$notification = array('title' =>$title , 'text' => $body, 'sound' =>'default');
$arrayToSend = array('to' => $token, 'notification' =>$notification,'priority'=>'high','badge'=>'1');
$json = json_encode($arrayToSend);

$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: key='. $serverKey;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
//Send the request
$response = curl_exec($ch);
//Close request
if ($response === FALSE) {
    die('FCM Send Error: ' . curl_error($ch));
}
curl_close($ch);
php
1个回答
2
投票

PDO::query返回PDOStatement对象以成功进行SELECT查询。让我们改变那个变量的名称,因为$row在那里有点误导。

$stmt = $conn->query("SELECT device_id,os_type from devices");

现在当你从中获取时,你可以得到行。 setFetchMode()不会获取一行,所以我们只需使用fetch()PDO::FETCH_ASSOC常量来定义其中的获取模式。

假设你想要一个数组中的所有device_id值,你需要在循环之前移动数组初始化($gcmRegIds = array();),或者在将每个值推入它之前将它设置回一个空数组,最后只有最后一个值。此外,array_push函数不是真正需要将一个项附加到数组。你可以使用[]

$gcmRegIds = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $gcmRegIds[] = $row['device_id'];
}

并且不要在循环中使用json_encode,之后再执行,否则您将重复使用无效的JSON。

echo json_encode($gcmRegIds);
© www.soinside.com 2019 - 2024. All rights reserved.