0

基本的に、フォルダー内の mp3 ファイルを調べてから、存在しないinsert場合は mysql データベースを調べます。number

問題はINSERT、(mysql) が複数回挿入されていますがmember_id、同じnumber. これは起こるべきではありません。

4 人のスタッフがこのスクリプトを実行しています。これの原因と修正方法は?

if ($handle = opendir($audioPath)) {
    while (false !== ($entry = readdir($handle))) {
        $file = pathinfo($entry);
        if ($entry != "." && $entry != ".." && !is_dir($audioPath . "/" . $entry) && $file['extension'] == 'mp3') {
            $number = $file['filename'];
            $SQL = "SELECT mobile, status, member_id, count(*) as Total from result WHERE number = :number";
            $query = $this->db->prepare($SQL);
            $query->bindValue(":number", $number);
            $query->execute();

            $row = $query->fetch(PDO::FETCH_ASSOC);

            // Check if number is exist in the table
            if ($row['Total'] == 0) {
                $SQL = "INSERT INTO result (number, status, status_date, member_id) VALUES ('$number', 'pending', now(), '$memberId')";
                $queryInsert = $this->db->prepare($SQL);
                $queryInsert->execute();
                break;
            } 
        }
    }
}

breakメディアプレーヤープラグインを介してmp3を再生した後。

4

2 に答える 2

2

2 人が同時にスクリプトを実行するという競合状態に陥っている可能性があります。選択が実行されると、エントリは存在しません。

これを解決する最善の方法は、MySQL の数値フィールドに UNIQUE 制約を追加することです。これにより、挿入時に条件が一致することが保証されます。クエリは失敗するため、エラーを処理する必要があります。

于 2012-07-16T11:57:03.080 に答える
0

最初の選択クエリもメンバー ID でフィルタリングする必要があります...

$SQL = "SELECT mobile, status, member_id, count(*) as Total from result WHERE number = :number AND member_id = :memberid";
于 2012-07-16T11:56:34.970 に答える