2016-12-28 3 views
-2

私はデータベースに挿入するスクリプトを持っています。このスクリプトは2つのcronジョブから同時に呼び出されるため、同じデータを同時に(時、分、秒) 。 実際に私はcronジョブを制御することはできませんが、私はそれをスクリプト上に持っています。 行の重複を防ぐ方法はありますか?2つのcronsジョブから重複行を防止する

コード:

function checkDuplicate($email) { 
    $return = 0; 
    if($email != ""){ 
     $sql = "SELECT d.id_data as nbre FROM data d WHERE d.email = '" . $email . "' "; 
     $nbreEmails = $db->run($sql); 
     $return = (sizeof($nbreEmails) > 0) ? 1 : 0; 
    } 
    return $return; 
} 

if(!checkDuplicate($email)){ 
    $insert = array(
     "id_client" => $id_client, 
     "email" => $email, 
     "valide" => 1, 
     "stat" => "valide", 
     "date_insert" => date("Y-m-d H:i:s"), 
     "date_refus" => null 
    ); 

    $db->insert("data", $insert); 
} 

感謝。

+0

あなたはdb時間と他の列でチェックし、行時間と他の列を挿入することができます。両方が同じ場合は、新しいデータの挿入を停止できます。 –

+0

一意のインデックスを作成する – e4c5

+0

同じ瞬間に行うことはできません。データが存在し、偽を返すかどうかを確認しています。 – user3911183

答えて

0

タイムスタンプフィールドを一意に設定する必要があります。

あなたが同じ時間に(この表または何でも)挿入しないでください決してそのSCRIPT1 &スクリプト2をcofirmする必要があり、より複雑な条件を、それを設定するか、または存在しない場合、あなたは、ロック・テーブルを使用する必要がありますすなわち:

MySQL用)
// not sure waht do you use as $db 
$db->execute('LOCK TABLES data WRITE;'); 
...// inserts 
$db->execute('UNLOCK TABLES;'); 

または使用取引

は、あなたがPDO(PDO::beginTransaction

を使用するか、使用フレームワーク名を使用して記事を更新するためにそれらのほとんどを提案しますそれを行う方法を持っている必要があります。

+0

私は 'none'フレームワークがACIDトランザクションをサポートしているとは思っていません。 – YvesLeBorg

+0

@ YvesLeBorg、確かにあなたは正しいと思いますが、ACIDはMySQL自体でさえ完結していませんが、挿入に関しては少なくともPDOで動作します。 – 2oppin

関連する問題