Mysql:在所有重复更新上插入一些重复的列

时间:2017-11-04 09:41:00

标签: mysql

所以我想创建一个视图计数器,我的表看起来像这样。

post_id  |  view_count  |  view_ip
----------------------------------
20       |           1  |  some ip
21       |           1  |  some ip

此时我迷失了,我知道这样做是错的,但我不知道怎么做。

所以目前我用count(post_id)调用视图,它给了我1但是当我用手机打开网站时(不是在wifi上)我希望第二行有post_id = 20但重复激活,我没有制作新插页...

这是我的问题:

INSERT IGNORE INTO `views`
SET view_count=1, post_id = '.$article['post_id'].', view_ip = "'.$ip.'"
ON DUPLICATE KEY UPDATE view_count=view_count;

在堆栈的某个地方有一个答案如何跳过更新,这是推荐的,但我不确定这是否正常...

P.S .:    我的想法是每个ip都有一个视图。

1 个答案:

答案 0 :(得分:0)

从语义上讲,您尝试表达"为此帖子插入新视图,但如果已有视图,请添加一个"。

这可以通过以下方式完成:

(post_id, view_ip)

您需要在DUPLICATE KEY上使用uniq索引才能发生view_ip = ?

哦,拜托,请不要连接字符串以伪造SQL查询,这是SQL Injections的方法。请使用预准备语句,准备好的语句提供非常干净(在视觉上和技术上)的方式来将值放在语句中,并且它在服务器端非常安全地进行。

当我说它"视觉上清洁"我的意思是我更喜欢:

view_ip = "'.$ip.'"

在:

?

另外,第二个很容易进行SQL注入。

<div class="main-content"> <!-- page content --> <div id="page-wrapper"> <div class="tab-pane active" id="horizontal-form"> <h3 class="blank1">Vehicle Details</h3> {!! Form::open(array('class' => 'form-horizontal','route' => 'vehicles.store','method'=>'POST')) !!} <script type="text/javascript"> $('#cp2').colorpicker(); </script> <div class="row"> <div id="cp2" class="input-group colorpicker-component"> <input type="text" value="#00AABB" class="colorpicker form-control" /> <span class="input-group-addon"><i></i></span> </div> <div class="row"> <div class="form-group"> <div class="col-md-6"> <div class="col-xs-12 col-sm-12 col-md-12 text-center"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </div> </div> {{ Form::close() }} </div> </div> </div> </div> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"> </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap- colorpicker/2.5.1/js/bootstrap-colorpicker.min.js"></script> 占位符可能因系统而异。