【问题标题】:Get MySQL data and store it to a PHP array based on the data array returned by another MySQL select operation根据另一个 MySQL 选择操作返回的数据数组,获取 MySQL 数据并将其存储到 PHP 数组中
【发布时间】:2016-01-08 03:18:25
【问题描述】:

我正在创建一个 iOS 应用程序,但在使用 PHP 编写的 Web 服务部分时遇到了困难。我想要实现的是,向设备发送推送通知。我已经完成了那部分。但是,我需要一种机制来区分已成功发送到手机的通知和未成功发送的通知。我为此目的使用了一个反馈网络服务,它也在工作。有一个具有以下结构的 MySQL 表。根据每个通知的状态位,我收集每个设备令牌对应的所有通知,并将其制成数组发送给设备。这是我面临困难的地方。

我有两张桌子。

此表存储通知 ID、设备令牌和通知状态。通过查看此表,我的脚本可以确定通知是否已发送到特定设备。我的脚本收集所有未传递到特定设备 ID 的通知 ID,并使用以下 apps_notif 表来获取未传递的通知。表结构如下。

我的 PHP/MySQL 脚本如下。

$fecthnotif=mysqli_query($mysqli,"SELECT notif_id FROM notif_status WHERE notif_status=0 AND dev_token='$device_token'") or die(mysqli_error($mysqli));

$d2=array();     
    while($row = mysqli_fetch_assoc($fecthnotif)) {  
    $d2[]=$row;

$json = json_encode($d2);

    $arr = json_decode( $json,true);

此时,我收到了一组 JSON 格式的未送达通知。结果如下。

[{"notif_id":"124"},{"notif_id":"129"}]

现在,我将结果循环如下。

foreach($arr as $item) { //foreach element in $arr
    $uses= $item['notif_id']; }

我想要实现的是从上述结果中获取每个 notif_id,从 apss-Notif 表中获取所有通知数据,使其成为单个 JSON 对象并将该有效负载返回给应用程序。因此 JSON 应该拥有所有最初未发送的所有通知的通知数据。

在 foreach 循环中,我编写了一个查询循环来将所有待处理的通知存储到数组中,但它不起作用。

$d=array();

foreach($arr as $item) { //foreach element in $arr
    $uses= $item['notif_id']; //etc
    //echo $uses;
    $sendnotif=mysqli_query($mysqli,"SELECT * FROM apps_notif WHERE notif_id='$uses'") or die(mysqli_error($mysqli));
    while($row = mysqli_fetch_assoc($sendnotif)) {  
    $d[]=$row;
    $i++;
    }
}

编辑:基本上,我想要实现的是从apps_notif 表中返回符合条件的行,notif_status=0(来自表notif_status)和dev_token="qwerty"(来自apps_notif 表)

我可以看到有两行符合条件。

【问题讨论】:

  • 您可以使用JOINS从2个表中获取数据,而不是先从notif_status表中获取数据,然后像SEELCT a.* from apps_notif a JOIN notif_status b ON b.notif_id = a.notif_id WHERE b.notif_status=0 AND b.dev_token='$device_token'那样获取apps_notif表中的数据
  • 你能告诉我如何在php中做到这一点吗?用上面的代码?我仍然对循环感到困惑。

标签: php ios mysql foreach while-loop


【解决方案1】:

希望对你有帮助

SELECT b.* 
FROM notif_status a 
INNER JOIN apps_notif b ON a.notif_id = b.notif_id 
WHERE notif_status = 0 
  AND dev_token = '$device_token';

使用子查询,

SELECT * 
FROM app_notify 
WHERE notify_id IN (SELECT notif_id 
                    FROM notif_status 
                    WHERE notif_status = 0 
                      AND dev_token = '$device_token') ;

看你的表。在表 1 中你有 notify_id 但在 table 2 你有 date 有类似的值。因此,如果您匹配table1 notifyIdtable2 notifyId,您将无法获得所需的输出。首先检查应该如何设计表格的正确标准。

【讨论】:

  • 你能告诉我如何在php中做到这一点吗?用上面的代码?我仍然对循环感到困惑。
  • 查询返回错误 #1052 - 字段列表中的列 'notif_id' 不明确
  • a.notify_id改成b.*
  • 我认为您的 notify_id 不匹配。
  • 请查看数据库中的数据。有 2 个符合条件的行。通知 ID 为 124 和 129。所以我需要来自 apps_notif 的 124 和 129 对应的行
【解决方案2】:

您可以尝试下面的 PHP 代码从 2 个表中获取详细信息并制作 JSON 对象。未测试查询,因为我没有相应的数据库表。

$query = "SELECT a.* from apps_notif a JOIN notif_status b ON b.notif_id = a.notif_id WHERE b.notif_status=0 AND b.dev_token='$device_token'";
$res = mysqli_query($mysqli,$query);
$d = array();
while ($row = mysqli_fetch_assoc($res)) {
     $d[] = $row;
}
$json = json_encode($d);

希望对你有所帮助。

【讨论】:

  • 当我用 echo 打印 JSON 时,它只会打印类似 []
  • 可能是查询没有返回数据。通过打印查询并复制它,然后在 PhpMyadmin 中执行它来检查查询。看看你得到的结果是不是。
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'SEELCT a.* from apps_notif a JOIN notif_status b ON b.notif_id = a.notif_id WHER' 附近使用正确的语法
  • 基本的东西select不是seelct
  • 我更正了。但它仍然返回一个空行。这不应该是因为有 3 行符合 dev_token= 'qwerty' 和 notif_status=0 的条件
猜你喜欢
  • 2013-05-16
  • 2015-01-18
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2011-06-11
  • 2013-08-14
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多