检查数据库中的新条目

时间:2016-11-18 22:37:15

标签: php mysql sql arrays

我正在尝试构建一个将查询数据库的应用程序,并在数据进入数据库时​​将数据发送到某个地方。

我可以使用以下代码从数据库中获取我想要的数据:

$sql="SELECT * FROM `signals` order by `time` DESC LIMIT 100";
$result = mysqli_query($DatabasePointer,$sql) 
    or die(mysqli_error($DatabasePointer));
$row_cnt = mysqli_num_rows($result);

if($row_cnt>0)
{
    $array = array();
    $i=0;

    while($row = mysqli_fetch_array($result))
    {
        $i++;
        //$a = array();
        $epoch = $row['time'];
        // convert UNIX timestamp to PHP DateTime
        $dt = new DateTime("@$epoch");

        if(
            ($row['symbol'] === 'USDJPYecn') 
            || ($row['symbol'] === 'USDCADecn') 
            || ($row['symbol'] === 'EURUSDecn')
            ) 
        {
            if(
                ($row['timeframe'] === 'M5') 
                || ($row['timeframe'] === 'M15')
                )  
            {
                $a = array(
                    "time" => $dt->format('Y-m-d H:i:s'),
                    "signal" => $row['signal'],
                    "symbol" => $row['symbol'],
                    "price" => $row['price'],
                    "timeframe" => $row['timeframe'],
                    "epoch" => $row['time'],
                    "candel" => $row['candel'] 
                    );
                $array[] = $a;
             }
        }

    } // while

    echo json_encode($array, JSON_UNESCAPED_SLASHES);           
}

但是,我不知道如何修改代码以检查数据是否是新的,或者是否已经发送到其他来源。我也不确定如何修改代码只发送新数据,因为它命中数据库,而不是像我现在调用的整个数据数组。

有人可以指出我正确的方向吗?

编辑:

$sql="SELECT * FROM `tdisignals` order by `time` DESC LIMIT 100";
$result = mysqli_query($DatabasePointer,$sql) 
    or die(mysqli_error($DatabasePointer));
$row_cnt = mysqli_num_rows($result);

if($row_cnt>0)
{
    $array = array();
    $i=0;
    while($row = mysqli_fetch_array($result))
    {
        $i++;
        //$a = array();
        $epoch = $row['time']; 
        // convert UNIX timestamp to PHP DateTime
        $dt = new DateTime("@$epoch");

        if( 
            $row['symbol'] === 'USDJPYecn' 
            || ($row['symbol'] === 'USDCADecn') 
            || ($row['symbol'] === 'GBPUSDecn'))
        {
            if(
                $row['timeframe'] === 'M5')
                || ($row['timeframe'] === 'M15'))
            {

                $a = array(
                    "time" => $dt->format('Y-m-d H:i:s'),
                    "signal" => $row['signal'],
                    "symbol" => $row['symbol'],
                    "price" => $row['price'],
                    "timeframe" => $row['timeframe'],
                    "epoch" => $row['time'],
                    "candel" => $row['candel'],
                    );

                $array[] = $a;
            }

        }

    }

    // echo json_encode($array, JSON_UNESCAPED_SLASHES);
    $fuegostore = json_encode($array, JSON_UNESCAPED_SLASHES);
    // $sql2 = "INSERT INTO fuegosync (time, lastsync) ".
    //          "VALUES ('$date', '$fuegostore')";
    // $result2 = mysqli_query($DatabasePointer,$sql2) 
       // or die(mysqli_error($DatabasePointer));
    $sql3="SELECT lastsync, MAX(CAST(time AS CHAR)) FROM `fuegosync`";
    $result3 = mysqli_query($DatabasePointer,$sql3) 
        or die(mysqli_error($DatabasePointer));

    $row2 = mysqli_fetch_row($result3);

    if($row2[0] === $fuegostore)
        echo 'No New Signals';
    else
        echo 'New Signals';
                    ///OPTION 1:
                    //print_r (json_encode($array[0], JSON_UNESCAPED_SLASHES));
                    //OPTION 2:
                    foreach($array as $x) {
                        if(strtotime($array[0]['time']) >= $row2[1]) {
                        echo '<br /><span>'.$x['signal'].' - '.$x['symbol'].' - '.$x['price'].'<br />';
                        } else {
                            echo 'No New Signals';
                        }
                }

    echo $row2[0];
}

此代码成功检测到数据库中的新数据。我现在正在努力的是修改代码只显示新检测到的数据,而不是你看到的整个数组。

新编辑: 我得到的代码只显示最新的数据,但现在我有一个难题。 如果我每分钟轮询一次数据库,并且新的数据点击数据库,则脚本会将其拾取 - 但是如果另一个新数据在第一个新部分发送到目标后的第二个数据点击,则第二个新作品将完全被忽略,因为民意调查将是每一分钟。我基本上每隔几秒就要对数据库进行轮询......这听起来像是一场表演噩梦...

灰显的选项1显示最新数据,但会在基于分钟的轮询之前跳过较新的部分,除非每秒轮询数据库。 选项2有效,但显示整个数组...所以我不确定如何修改代码只显示最新的部分,而不是整个部分。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

担保

执行此类操作的最安全方法之一是:

  • 在源
  • 上增加字段
  • 允许对目标进行查询

循序渐进,源头驱动

  1. 您在源中添加了一些数据,其自动递增id
  2. 您从源查询目标并要求最后id知道
  3. 使用此id,从源代码获取所有新记录,并使用这些数据查询目标上的插入页面
  4. 替代,目标驱动

    1. 您在源中添加了一些数据,其自动递增id
    2. 您的目标获得更大的id并向新来源询问数据
    3. 目标更新自己
    4. 你可以再次进入第一步。如果你小心插入(使用回滚,在一次失败时打破完整批处理),每当源/目标链路出现故障时,你应该有一个完美的目标,并且带宽尽可能低。

      单边和无检查

      这允许从源发送批量数据而无需回答或目标操作。

      这不关心数据是否在途中丢失,只发送一次。

      • 在源
      • 上有三个州字段send

      <强>步骤一步

      1. 您在源代码中添加了一些数据,默认情况下send位于0
      2. 您在send ==0
      3. 上设置了每个send = -1
      4. 选择每个-1并将其发送到目标
      5. -1更新为1
      6. 回到第一步。

        这样就可以让你获得大批量而无需让lock write等待发送脚本,并确保你不能在发送脚本之间放置一些线路。

        时间戳

        这看起来很像前一个,但是我们只是使用一个新表来保持上一次同步,而不是每一行都有一个字段:

        <强>步骤一步

        1. 您在源中添加了一些数据及其时间戳
        2. 您获得当前时间戳 - 1(之前一秒)
        3. 您获得了上次同步时间戳(如果您是第一次同步,则为0)
        4. 选择并发送timestampOfPost <= timestamp-1timestampOfPost > timestampLastSync
        5. 的行
        6. 使用第2点的timestamp - 1更新上次同步时间戳。
        7. 如果你没有及时使用&#34;去1seconde,那么时间戳可能会很棘手&#34;并将其保存在变量中,因为您可能会丢失一些更新:

          如果你发送***754(。1)s,***754(。2)s到(.9)s的每一行都将被视为发送,因为我们已经完成了时间戳{{ 1}}并将在***754开始下一次发送。