我有这个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中添加行并提交表单,它会保存数据但是如果已经存在数据并且我提交了表单,则会将其删除。
我的代码中有什么问题?我已经评论了它所做的一切
答案 0 :(得分:0)
MySQL INSERT
和UPDATE
之间存在显着差异。
您需要检查要插入的数据库并使用查询来检查该行中是否存在数据。根据该查询,您可以将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();