目录
回复内容:
首页 后端开发 php教程 PHP和mysql中,如何防止数据重复insert?

PHP和mysql中,如何防止数据重复insert?

Jun 06, 2016 pm 08:46 PM
php

因为运行的时候有延迟。

sql1 = SELECT * FROM posts WHERE mid = 2

sql2 = INSERT INTO posts (id,mid,other) VALUES ('',".$c.",'def');

因为用了for 循环。首先是检测是否存在Sql1,如果不存在,则sql2。
再重复循环。可是,当前sql2第一次没有运行insert时,第二次循环的时候执行Sql1是通过的,然后再次执行sql2,导致运行了两次sql2。

可能同时触发了一个链接,这样导致重复插入了。
综合几位朋友的说法,我决定不在这个循环里面插入数据。

但好像:
用 INSERT INTO posts (id,mid,other) VALUES ('',".$c.",'def'),('','c2','def2'),('','c2','def2'),('','c2','def2');
这样子不行,因为假如其中一个出错,那么整条就好像就不能插入了。

谢谢大家的解答,我再去试了下我想到的几种方式~谢谢~

这个要怎么处理呢?

听说要用事务处理,但是不懂如何使用。手册已经看过了,但不明白。。。

[以下只是举例子]
$c 是 变量, mid 字段不能设置为“唯一”

<br>$c = '10000';
for($a = 0;$a < 100; $a++){
    $sql1 =  "SELECT * FROM `posts` WHERE `mid` = ".$c;
    $query1 = mysql_query($sql1);
    $row = mysql_num_rows($query1);

    if($row == 0){
        $sql2 = "INSERT INTO `posts` (`id`,`mid`,`other`) VALUES ('',".$c.",'def')";
        $query2 = mysql_query($sql2);
    }
登录后复制
登录后复制

}

回复内容:

因为运行的时候有延迟。

sql1 = SELECT * FROM posts WHERE mid = 2

sql2 = INSERT INTO posts (id,mid,other) VALUES ('',".$c.",'def');

因为用了for 循环。首先是检测是否存在Sql1,如果不存在,则sql2。
再重复循环。可是,当前sql2第一次没有运行insert时,第二次循环的时候执行Sql1是通过的,然后再次执行sql2,导致运行了两次sql2。

可能同时触发了一个链接,这样导致重复插入了。
综合几位朋友的说法,我决定不在这个循环里面插入数据。

但好像:
用 INSERT INTO posts (id,mid,other) VALUES ('',".$c.",'def'),('','c2','def2'),('','c2','def2'),('','c2','def2');
这样子不行,因为假如其中一个出错,那么整条就好像就不能插入了。

谢谢大家的解答,我再去试了下我想到的几种方式~谢谢~

这个要怎么处理呢?

听说要用事务处理,但是不懂如何使用。手册已经看过了,但不明白。。。

[以下只是举例子]
$c 是 变量, mid 字段不能设置为“唯一”

<br>$c = '10000';
for($a = 0;$a < 100; $a++){
    $sql1 =  "SELECT * FROM `posts` WHERE `mid` = ".$c;
    $query1 = mysql_query($sql1);
    $row = mysql_num_rows($query1);

    if($row == 0){
        $sql2 = "INSERT INTO `posts` (`id`,`mid`,`other`) VALUES ('',".$c.",'def')";
        $query2 = mysql_query($sql2);
    }
登录后复制
登录后复制

}

问题描述的不是很清晰,

可是,当前sql2第一次没有运行insert时,第二次循环的时候执行Sql1是通过的,然后再次执行sql2,导致运行了两次sql2。

上面这句话没看懂什么意思

首先,在循环里面做sql查询是相当低效的,强烈建议你修改逻辑,避免这种情况

关于你举例子的那段for循环代码,两个优化方案
其一,在循环里拼接insert的数组,大概代码如下

$d = [];
for($i = 0; $i < 100; $i++)
{
    $r = mt_rand(1, 100);
    //排除重复值,
    if(!in_array($r, $d))
    {
         $d[] = $r;
    }
}
$pdo = new PDO($dsn, $user, $passwd);
$pdo->prepare("insert into table(col1,col2) values(?,?)");
foreach($d as $v)
{
    $pdo->execute(array($v, $v));
}
登录后复制

如上,复用insert语句模板,同时也排除了可重复插入的数值,如果对每一组值有特殊处理,也可以放在foreach处理
我很推荐你使用此种方式,这种方式也是安全的,能良好的预防sql注入,而无需你再去考虑太多sql注入的问题

其二,拼接一个比较长的insert的语句,

insert into table_name(col1,col2, ......) values(v1,v2,......),(v1,v2,......),......
登录后复制

上述二者可能并不切合题意,因为可能之前库里就存在和当前插入有重复的数据
在mysql里有如下sql语法

INSERT INTO TABLE (a,b,c)
VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
登录后复制

上句中的意思就是,插入一条语句到表中,如果插入的数据和表中唯一索引或者主键重复,更新字段c的值

结合这个sql语句,能很完美解决插入值重复的问题吧?

循环里敢这么玩!

不懂你这个$sql1判断的意义何在,设置id这个是唯一key不就好了么?而且同 @宋小北 循环里面敢这么玩!!

今天看到个文章和这个问题非常契合,特此补上:http://blog.sae.sina.com.cn/archives/3491 -2014/04/17 12:41

只要在'posts'的表,加上唯一UNIQUE即可,或者當然可以用

INSERT INTO
table(column1,column2,column3 ...columnN)
SELECT value1,value2,value3 ...valueN
FROM dual
WHERE NOT EXISTS(
SELECT *
FROM table
WHERE value = ?
);

先查询可用的mid, 再插入数据

$variable_array = array();
$c = 1000;
for($a = 0;$a < 100; $a++){
    $variable_array[] = $c;    
}
if (count($variable_array) == 0) {
    return false;
}
// 去重
$variable_array = array_unique($variable_array);
// 获取可用mid
$sql_head = "SELECT `mid` FROM `posts` WHERE `mid` in (#variable#) ";
// 加上单引号, 如果确定都是数字,那就不加
$mid_array = array_map(function($value){return "'$value'";}, $variable_array);
$mid_list = array();
foreach (array_chunk($mid_array, 500) as $piece) {
    $variable_str = implode(",", $piece);
    $sql_piece = str_replace("#variable#", $variable_str, $sql_head);
    $query_piece = mysql_query($sql_piece);
    // 获取mid $mid_piece
    $mid_piece = mysql_fetch_array($query_piece);
    $mid_list = array_merge($mid_list, array_diff($piece, $mid_piece););
}
// 插入数据库
$insert_str_array = array_map(function($value){return "('', '$value', 'def')";}, $mid_list);
$insert_head = "INSERT INTO `posts` (`id`,`mid`,`other`) VALUES ";
foreach (array_chunk($insert_str_array, 500) as $piece) {
    $variable_str = implode(",", $piece);
    $insert_sql = $insert_head.$variable_str;
    mysql_query($insert_sql);
}
登录后复制

很久没写php代码, 怎么获取mysql_query结果忘记了!!!直接用得mysql_fetch_array.

1.唯一索引。2.按照特征拿相关数据,进行对比

试试

<code>replace into `table` values set  key=val
</code>
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 使用数据库 CakePHP 使用数据库 Sep 10, 2024 pm 05:25 PM

在 CakePHP 中使用数据库非常容易。本章我们将了解CRUD(创建、读取、更新、删除)操作。

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

CakePHP 日志记录 CakePHP 日志记录 Sep 10, 2024 pm 05:26 PM

登录 CakePHP 是一项非常简单的任务。您只需使用一项功能即可。您可以记录任何后台进程(如 cronjob)的错误、异常、用户活动、用户采取的操作。在 CakePHP 中记录数据很容易。提供了 log() 函数

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

See all articles