Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql——需要在重复键[…]上更新[…]之类的内容_Php_Mysql_Pdo_On Duplicate Key - Fatal编程技术网

Php Mysql——需要在重复键[…]上更新[…]之类的内容

Php Mysql——需要在重复键[…]上更新[…]之类的内容,php,mysql,pdo,on-duplicate-key,Php,Mysql,Pdo,On Duplicate Key,我正在验证几个数据库的电子邮件。 我们的验证提供商为我们创建了一个电子邮件列表,其中包含要放置的状态(已检查、无响应等…) 但是对于一些地址,我们也得到了修复(例如。foo@gail.com => foo@gmail.com) 我需要设置正确的状态(20),并且只是有时候修复电子邮件。我还必须在状态已经正确时修复邮件 我目前的PDO更新请求如下: $req_fix_mail_and_update_status = " UPDATE {$user_table_name} S

我正在验证几个数据库的电子邮件。 我们的验证提供商为我们创建了一个电子邮件列表,其中包含要放置的状态(已检查、无响应等…)

但是对于一些地址,我们也得到了修复(例如。foo@gail.com => foo@gmail.com)

我需要设置正确的状态(20),并且只是有时候修复电子邮件。我还必须在状态已经正确时修复邮件

我目前的PDO更新请求如下:

$req_fix_mail_and_update_status = "
    UPDATE {$user_table_name}
        SET status = :mail_status1
        , {$mail_column_name} = :mail_fixed1
    WHERE (({$mail_column_name} LIKE :mail_address)  OR  ({$mail_column_name} LIKE :mail_fixed2))
        AND ((status != :mail_status2) OR ({$mail_column_name} NOT LIKE :mail_fixed3))
";
现在,棘手的部分来了:
其中一个数据库存储有关多个网站的数据,可能包含邮件副本。
我在类似
(fk_站点,电子邮件)

。。。还有一个edge案例,其中一些电子邮件既有“固定”值条目,也有“非固定”值条目

e、 g:

Login   FK_Site  Mail            Status
Alice        01  foo@gmail.com        0
Alice        01  foo@gmal.com         0
Bob          02  foo@gmal.com         0
当然,尝试修复错误的地址将使复制无效,因为(fk#U站点,电子邮件)唯一约束将在Alice=>请求失败(#$%§@&!)上失败。
但是鲍勃·斯蒂尔需要修复他的邮件,电话线也需要更新状态

我正在寻找一种方法来解决这个问题,但是找不到SQL的任何东西。 当我失败时,再提出一个(比如说,最多两个)请求是可以的,但这似乎是一个很容易的方法,我不想把任务变成这样一个边缘的肮脏和不可读的东西

通常,我需要一个带有“ON DUPLICATE KEY”子句的
UPDATE[…],但看到它不存在并不奇怪。

我的worker是用PHP编写的,使用PDO


有什么想法吗?

好的,这是我问题的替代答案。 请注意,欢迎使用更简单的解决方案(如果存在…)

从技术上讲,它解决了我的需求,但它相当难看,需要我额外提出3个请求,而不是一个

  • 一个更新邮件和有错误邮件的行的状态,一旦邮件被修复就不会产生重复
  • 仅更新具有已正确电子邮件的行的状态
  • 一个是只更新由于约束而无法修复邮件的行的状态

这有点重,但性能不是问题。让我感到困扰的是,这会降低代码的可读性,需要详细解释为什么需要3个请求

以下是我的(PDO)请求,仅更新不会创建重复的行:

UPDATE prospect p1
    SET email = :mail_fixed1
    ,status = :mail_status1
WHERE 
    p1.email = :mail_address
    AND NOT EXISTS (
        SELECT site_id FROM (SELECT site_id, email, origin  FROM  prospect cpy) as p2
        WHERE 
            email = :mail_fixed2
            AND p1.site_id = p2.site_id
            AND p1.origin = p2.origin
        )
  • 唯一性约束在三元组上(
    站点id、电子邮件、来源
  • :mail\u fixed1
    :mail\u fixed2
    这样的占位符具有相同的绑定值。我之所以必须使用不同的占位符,是因为我的脚本还连接到SQL Server数据库,并且当占位符被多次使用时,驱动程序会因无法理解的错误而崩溃
  • 我的第三个请求(仅更新邮件修复程序将创建副本的行)是相同的,只是“不存在”被替换为“存在”(此外,邮件未修改,状态为“已修复”,但这些是详细信息)

中间的2rd请求没有什么特别之处,但出于完整性考虑,我将其放在这里:

UPDATE {$user_table_name}
    SET status = :mail_status1
WHERE ({$mail_column_name} LIKE :mail_address)
    AND ((status IS NULL)  OR  (status != :mail_status2))
我忘了提到另一个小缺点:我的脚本过去常常计算更新的行数,但现在可能不止一次计算几行,因为同一行可以通过两个请求更新。这是一个小细节,但仍然令人讨厌


无论如何,我希望这篇文章能帮助别人

好的,这是我问题的替代答案。 请注意,欢迎使用更简单的解决方案(如果存在…)

从技术上讲,它解决了我的需求,但它相当难看,需要我额外提出3个请求,而不是一个

  • 一个更新邮件和有错误邮件的行的状态,一旦邮件被修复就不会产生重复
  • 仅更新具有已正确电子邮件的行的状态
  • 一个是只更新由于约束而无法修复邮件的行的状态

这有点重,但性能不是问题。让我感到困扰的是,这会降低代码的可读性,需要详细解释为什么需要3个请求

以下是我的(PDO)请求,仅更新不会创建重复的行:

UPDATE prospect p1
    SET email = :mail_fixed1
    ,status = :mail_status1
WHERE 
    p1.email = :mail_address
    AND NOT EXISTS (
        SELECT site_id FROM (SELECT site_id, email, origin  FROM  prospect cpy) as p2
        WHERE 
            email = :mail_fixed2
            AND p1.site_id = p2.site_id
            AND p1.origin = p2.origin
        )
  • 唯一性约束在三元组上(
    站点id、电子邮件、来源
  • :mail\u fixed1
    :mail\u fixed2
    这样的占位符具有相同的绑定值。我之所以必须使用不同的占位符,是因为我的脚本还连接到SQL Server数据库,并且当占位符被多次使用时,驱动程序会因无法理解的错误而崩溃
  • 我的第三个请求(仅更新邮件修复程序将创建副本的行)是相同的,只是“不存在”被替换为“存在”(此外,邮件未修改,状态为“已修复”,但这些是详细信息)

中间的2rd请求没有什么特别之处,但出于完整性考虑,我将其放在这里:

UPDATE {$user_table_name}
    SET status = :mail_status1
WHERE ({$mail_column_name} LIKE :mail_address)
    AND ((status IS NULL)  OR  (status != :mail_status2))
我忘了提到另一个小缺点:我的脚本过去常常计算更新的行数,但现在可能不止一次计算几行,因为同一行可以通过两个请求更新。这是一个小细节,但仍然令人讨厌


无论如何,我希望这篇文章能帮助别人

>我只想看到异常,看看它是否在复制键上,然后启动一个更新查询。@你的常识我想到了,但是如果我考虑我的例子,我不仅要执行一个新的状态请求,我还需要更新鲍伯的错误电子邮件,而不想更新爱丽丝的。第二次更新将只需要修复那些与引起约束冲突的其他值没有等效值的行。我试着使用子选择,但是