我有一个脚本,我设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值
现在,每次cron运行时,它都会插入一条全新的记录。导致重复,导致我手动删除重复。
我如何防止重复,只更新丢失或与NEW $ VAR值不同的信息?
我想做的事情可以这样表达:IF old value is NOT new value use new value else use old value;
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 ''; }
}
}
}
答案 0 :(得分:1)
您应该尝试使用INSERT ... ON DUPLICATE KEY UPDATE
。 Documentation
这意味着您必须为表定义一些唯一(可能是 primary )键,该表始终是常量,因此MySQL知道要更新的内容。
一个快速举例说明如何做到这一点:
INSERT INTO table (f1,f2,f3) VALUES ('something_unique',2,5)
ON DUPLICATE KEY UPDATE f2=2,f3=5
答案 1 :(得分:1)
如果数据库中已存在标记为UNIQUE
或PRIMARY KEY
的字段之一,则将以静默方式忽略以下语句。如果您正在搜索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';
要考虑的另一件事是INSERT ... ON DUPLICATE KEY UPDATE
语法:
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;
答案 2 :(得分:0)
我最后写了另一个if语句来检查传入和现有db值是否存在唯一值,并将其留空以防止它导入重复项。我还写了一个单独的文件来更新值,区分我收到的(新)和数据库(旧)的内容,这对我的应用程序来说非常有用。
以下是遇到此问题的其他人的答案:)
$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
}
}
}
此外,我偶然发现了一个简单的错误报告技巧,帮助我清理了一些我忽略的事情。只需将其放在文件的顶部,或者您要调试的上方;)
error_reporting(E_ALL);