PHP检测数据库是否新插入数据

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

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

 


$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可以工作,但是可以显示整个数组…所以我不确定如何修改代码以仅显示最新片段,而不显示整个组件.

有什么建议么?

解决方法:

担保的

做这种事情的最安全的方法之一是:

>在源上增加字段
>允许查询目标

分步,源驱动

>您在源中添加了一些数据,其ID会自动增加
>您从源查询目标,并需求知道最后一个ID
>使用此ID从源中获取所有新记录,并使用这些数据查询目标上的插入页面

备用,目标驱动

>您在源中添加了一些数据,其ID会自动增加
>您的目标获取更大的ID,并需求来源提供新数据
>目标自己更新

您可以再次执行第一步.如果您小心插入(使用回滚,一次失败就将整个批次中断),那么只要源/目标链接发生故障,并且带宽尽可能低,就应该有一个完美的目标.

单面和免签

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

不管数据是否在途中丢失,它只会发送一次.

>具有三个状态字段在源上发送

一步步

>在源中添加一些数据,默认情况下将其发送为0
>您将每个发送== 0设置为发送= -1
>选择每-1,然后将它们发送到目标
>将-1更新为1

返回第一步.

这样可以使您大批量工作,而不必在发送脚本之前加锁写操作,并且保证在发送脚本之间不能掉线.

时间戳记

这看起来很像上一个,但是我们没有使用每行一个字段,而是使用一个新表来保持最后一个同步:

一步步

>您在源中添加一些数据及其时间戳
>您将获取当前时间戳-1(现在是一秒钟)
>您将获取最后的同步时间戳(如果是第一次同步,则为0)
>选择并发送行,其中timestampOfPost< = timestamp-1和timestampOfPost> timestampLastSync
>使用时间戳-点2中的1更新您的上一个同步时间戳.

如果您不使用“将时间倒退1秒”并将其保留在变量中,则时间戳可能会很棘手,因为您可能会丢失一些更新:

如果以*** 754(.1)s发送,则从*** 754(.2)s到(.9)s的每一行都将被视为已发送,就像我们完成了*** 754的时间戳一样,它将开始下次发送*** 755.

标签:
最后更新:2022/02/04
免责声明:本站部分内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。
如果您发现本社区中有涉嫌抄袭的内容请发送邮件至:Hi@r1yun.cn进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

在线评论