【问题标题】:If statement does not avoid insert queryif 语句不避免插入查询
【发布时间】:2015-04-19 23:15:39
【问题描述】:

我正在尝试创建一个简单的 api,假设它可以为来自移动应用程序的不同新闻添加视图。当我使用如下网址直接在浏览器中测试时:

http://url/addview.php?type=ios&identifier=35605C24-8EA6-4342-Bdfd-245432&newsid=147

如果 news_id、type 和 identifier 已经存在,它可以在这里工作并添加重复项。但是,当我在我的 ios 应用程序中通过异步 http 请求运行此 url 时,它似乎总是添加一条新记录,即使它已经存在于 d

$con = new mysqli('host','user','pass','db');
$type = $_GET['type'];
$identifier = $_GET['identifier'];
$news = $_GET['newsid'];

$check = $con->prepare("SELECT * FROM views WHERE views.news_id =? AND views.type =? AND views.identifier=?");
$check->bind_param("iss", $news, $type, $identifier);
$check->execute();
$check->store_result();
$check->fetch(); 

if ($check->num_rows == 0) {
    $con->next_result();
    $check->close();
    $add_view = $con->prepare("INSERT INTO views (views.news_id, views.type, views.identifier, views.reg_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP())");
    $add_view->bind_param("iss", $news, $type, $identifier);
    $add_view->execute();
    $add_view->close();
    $con->next_result();


}

$con->close();

【问题讨论】:

  • 为什么不在你的表上添加一个UNIQUE KEY(views.news_id, views.type, views.identifier)而不是2个查询,然后只做一个查询-INSERT INGORE ...
  • 你能回答一下吗?我不确定我是否理解?
  • unique 约束将导致数据库拒绝任何与约束冲突的新行。
  • 尝试删除$check->fetch();

标签: php mysql http


【解决方案1】:

如果您不想重复,请添加适当的唯一索引。根据您的逻辑,我认为这将是:

create unique index idx_views_3 on views(news_id, type, identifier);

然后,插入如下:

INSERT INTO views (news_id, type, identifier, reg_date)
    VALUES (?, ?, ?, CURRENT_TIMESTAMP())
    on duplicate key update news_id = values(news_id);

【讨论】:

  • 重复时不应更新。这个查询是这样做的吗:)?
  • @PeterPik 。 . . on duplicate key update 子句是无操作的。它将news_id 的值更新为它已经存在的值。 MySQL 会忽略此类更新,因此实际上什么都不会发生,除了检查该值是否未更改的少量工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多