PHP / MySQL查询删除数据但不重新插入

时间:2014-05-27 23:28:31

标签: php mysql

我有这个PHP代码:

$stmt = $pdo_conn->prepare("DELETE from tickets_extra_emails where ticketnumber = :ticketnumber ");
    $stmt->execute(array(':ticketnumber' => $ticket["ticketnumber"]));
    $cc_contact_line = '';
    foreach(explode("\n", $_POST["cc_contacts"]) as $cc_contact_line) {
        //then insert new if its not blank
        if(filter_var($cc_contact_line, FILTER_VALIDATE_EMAIL)) {
            //see if it currently exists
            $stmt = $pdo_conn->prepare("SELECT * from tickets_extra_emails where ticketnumber = :ticketnumber and email_address = :email_address ");
            $stmt->execute(array(':ticketnumber' => $ticket["ticketnumber"], ':email_address' => $cc_contact_line));
            $records = $stmt->fetchAll(PDO::FETCH_ASSOC);
            if(count($records) == 0) {
                echo 'insert '.$ticket["ticketnumber"].' - '.$cc_contact_line.'<br>';
                $stmt = $pdo_conn->prepare("INSERT into tickets_extra_emails (ticketnumber, email_address) values (:ticketnumber, :email_address) ");
                $stmt->execute(array(':ticketnumber' => $ticket["ticketnumber"], ':email_address' => $cc_contact_line));
            }
        }
    }

使得textarea的每一行都成为foreach循环中的一个变量。

如果我在textarea中添加行并提交表单,它会保存数据但是如果已经存在数据并且我提交了表单,则会将其删除。

我的代码中有什么问题?我已经评论了它所做的一切

2 个答案:

答案 0 :(得分:0)

MySQL INSERTUPDATE之间存在显着差异。

您需要检查要插入的数据库并使用查询来检查该行中是否存在数据。根据该查询,您可以将insert语句重构为条件语句,并从INSERT切换为UPDATE

删除现有数据不允许您重新插入行,行是现有的,因此需要UPDATE。但是,如果要删除整行,则可以重新插入行。我认为这不是完全有效的,因为你可以在这里利用UPDATE的效率。

答案 1 :(得分:0)

AFAIK,如果有0行,fetchAll将失败,因此您将无法对记录运行计数。您是否启用了错误或已记录错误?

我看到你想要做什么以及为什么要删除然后重新插入,尽管可能不是最好的方法。

更新:显然不应该依赖rowCount()作为选择,所以我认为最好的选择是更改您的选择查询以选择计数。只要查询有效,这将始终返回一个值,因此您不必担心获取失败。正如您在下面注意到的那样,我只是将SELECT *更改为SELECT计数(*),因此这将计算与您的约束匹配的行数。然后使用fetchColumn()选择第一行的第一列(计数)。

$stmt = $pdo_conn->prepare("SELECT count(*) from tickets_extra_emails where ticketnumber = :ticketnumber and email_address = :email_address ");
$stmt->execute(array(':ticketnumber' => $ticket["ticketnumber"], ':email_address' => $cc_contact_line));
$records = $stmt->fetchColumn();