Php SQL插入到表中会导致重复

Php SQL插入到表中会导致重复,php,mysql,cron,Php,Mysql,Cron,我有一个脚本,我为它设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值 现在,每次cron运行时,它都会插入一条全新的记录。导致重复,并导致手动删除重复 如何防止重复,只更新丢失的信息或与新的$VAR值不同的信息 我想做的可以这样表达:如果旧值不是新值,使用新值,否则使用旧值 if ($stmt->num_rows !== 1) { if ($insert_stmt = $mysqli->prepare("

我有一个脚本,我为它设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值

现在,每次cron运行时,它都会插入一条全新的记录。导致重复,并导致手动删除重复

如何防止重复,只更新丢失的信息或与新的$VAR值不同的信息

我想做的可以这样表达:
如果旧值不是新值,使用新值,否则使用旧值

    if ($stmt->num_rows !== 1) {
    if ($insert_stmt = $mysqli->prepare("
                                        INSERT INTO members (
                                                            start_date
                                                            )

                                        VALUES (?)")) 

        {
        $insert_stmt->bind_param('s',
                                $StartDate, 

                                );

    if (! $insert_stmt->execute()) { echo ''; }
        }
}
}

您应该尝试使用
INSERT。。。在重复密钥更新时

这意味着您必须为表定义一些唯一的(可能是主键)键,该键始终保持不变,以便MySQL知道要更新什么

下面是一个简单的示例,说明您将如何执行此操作:

INSERT INTO table (f1,f2,f3) VALUES ('something_unique',2,5) 
ON DUPLICATE KEY UPDATE f2=2,f3=5

如果数据库中已存在带有标志
UNIQUE
主键的字段之一,则以下语句将被静默忽略。如果您正在搜索
INSERT If NOT EXISTS
,这可能就是您要查找的内容:

INSERT IGNORE INTO `members` SET name='Steve',start_date='2015-11-20';
您还可以使用
REPLACE
覆盖已存在的记录。如果它还不存在,将创建它:

REPLACE INTO `members` SET name='Steve',start_date='2015-11-20';

另一个要考虑的事情是句法:


最后,我编写了另一个if语句来检查传入数据中是否存在唯一的值,以及现有的db值是否存在,并将其留空以防止导入重复数据。我还编写了一个单独的文件来更新值,这些值区分了我接收到的内容(新的)和数据库中的内容(旧的),这对我的应用程序非常有用

以下是我对遇到这个问题的其他人的回答:)

还有一个我偶然发现的简单错误报告技巧,它帮助我清理了一些我忽略的事情。只需将其放在文件的顶部,或要调试的上方;)


错误报告(E_ALL)

您是否尝试过插入。。。重复密钥更新时为是。你不能插入。。。关于使用重复密钥更新VALUE@MyWay-他需要在
INSERT
语句中包含
主键
(或者至少是一个
唯一的
键),我猜现在还不是这样,@MarkusWMahlberg lol`INSERT INTO。。选择。。从…起在重复键上更新val=VALUES(val)获取将与value()一起插入的值仅与INSERT INTO…一起使用。。。。值(…),以便我可以执行类似于
$var=xx123
的操作,并将其作为伪列/值传递给DB表?现在我想起来了。。。这个值在我正在检索的JSON数据中不是唯一的。只有
记录
电子邮件
@abdriusWell才是真正不安静的东西,无论什么是唯一的(并在数据库中设置为一个)都会成功@LeviZoesch-您是否从JSON中获取了成员id(
主键
-可能有一个,可能在数据库中称为
members.id
)呢?如果是这样,那就是你的独特数据。只需在
INSERT
语句中设置
members.id
<如果该记录已存在,则会触发重复密钥更新上的代码>
。我要说的是,我从第三方服务器获取的值不包含此
新的
虚构的唯一值。这只是站在我这边,那么JSON将如何区别于旧版本呢?我唯一可以交叉引用到数据库中的是
记录
不相同@谢谢。最后,我为记录#中的if值为true编写了一个else-if语句。昨晚开始了,但我很感激。请查看我发布的答案@NextLocal@NextLocal
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
$prep_stmt = "SELECT * FROM table WHERE column_keys=?";
    $stmt = $mysqli->prepare($prep_stmt);

    if ($stmt) {
        $stmt->bind_param('s',$varvalues);
        $stmt->execute();
        $stmt->store_result();

        if ($stmt->num_rows == 1) {

        if ($insert_stmt = $mysqli->prepare("")) {
            $insert_stmt->bind_param('');

            if (! $insert_stmt->execute()) { 
                echo 'shits broke'; }
            }
        } 
        else { if ($insert_stmt = $mysqli->prepare("
                                            INSERT INTO table (column_keys)
                                            VALUES (?)")) // you will need a ? per column seperate by a , (?,?,?...?)

            { $insert_stmt->bind_param('s',
                                    $varvalues
                                    ); // you will also need to bind a 's' (string) 'i' for num, etc per $var value.

        if (! $insert_stmt->execute()) { echo 'shits broke';} //lol 
            }
    }
    }