2011-08-08 2 views
1

이메일 목록을 txt 파일에서 가져 와서 데이터베이스에 삽입하는 코드가 있습니다. 이미 데이터베이스에있는 경우 전자 메일을 추가하지 않도록합니다. 내가 지금하고있는 일은 txt 파일에서 전자 메일을 필터링하고 $ filter 배열 내의 문자열에 정확히 일치하거나 부분 일치하는 경우 삽입하지 않기 때문입니다. 즉, 이메일에 'gmail', '.ru'또는 'exec'이있는 이메일 주소가 있으면 추가하지 않을 것입니다.부분 일치 (또는 완전 일치)를위한 배열 검색

내 머리를 벽에 두드려서 피가 흘리는 것을 막는 데 도움이 될 것입니다!

코드 : 유효성 검사 기능에

$TheFile = "emails.txt"; 

$handle = fopen($TheFile, 'r'); 

$good_count = 0; 
$bad_count = 0; 

$filter= array("gmail",".ru","exec"); 

while (!feof($handle)) 
{ 
    $Data = fgets($handle, 1024); 
    $output = explode (",",$Data); 

    $exist = mysql_query("SELECT * FROM table WHERE email='$output[0]'"); 

    if (mysql_num_rows ($exist) == 0) { 
     $email = strtolower($output[0]); 
     $sql = "INSERT INTO table SET email='$email'"; 
     mysql_query($sql); 
     $good_count = $good_count + 1; 
    } 
    else { 
     $bad_count = $bad_count + 1; 
    } 
} 
+0

참고 사항 [mysql에 다중 값을 삽입하고 중복을 피하는 방법] (http://stackoverflow.com/q/5986137/161052) – JYelton

+0

['INSERT IGNORE' 또는'INSERT REPLACE' ] (http://dev.mysql.com/doc/refman/5.1/en/insert.html)에서 중복 값을 건너 뛰거나 덮어 쓰게됩니다. – JYelton

+0

고마워요.하지만 그게 내가 진짜로하는 것이 아닙니다. 나는 이미 중복 된 것들에 대해 문질러 사용하고있다. $ filter 배열에 대해 각 항목을 일치시키고 일치 항목이 있으면 삽입하지 않아야합니다. – 86Stang

답변

1

사용 stripos : 또한

function validate_email($input, array $needles) { 
    foreach ($needles as $needle) { 
     if (stripos($input, $needle) === false) return false; 
    } 
    return true; 
} 

// ... 

if (mysql_num_rows ($exist) == 0 && 
    validate_email($output[0], $filter)) 
{ 
    $email = strtolower($output[0]); 
    $sql = "INSERT INTO table SET email='$email'"; 
    mysql_query($sql); 
    $good_count = $good_count + 1; 
} 
else { 
    $bad_count = $bad_count + 1; 
} 

, 당신의 테이블 정의에 UNIQUE index을 사용하는 것이 좋습니다. 이메일이 이미 존재하면 (catchable) MySQL 오류가 발생하고 파일에있는 모든 이메일에 대해 SELECT 쿼리를 수행하지 않도록 스크립트를 오프로드합니다.

+0

답변의 논리에서 멍청한 찌르기를 실례지만 실제로이 문제를 배우고 대답을 복사/붙여 넣기하는 것이 아니라 배우고 싶습니다. 함수에서 일치하는 것이 하나라도 있으면 false를 반환하고 함수를 끝내고 그렇지 않으면 true를 반환합니다. 맞습니까? 그것이 맞다고 가정하면 함수가있는 IF 문은 "전자 메일이 존재하지 않고 함수가 false를 반환하면 중괄호를 실행합니다"라고 말합니다. 가까운가요? – 86Stang

+0

@ 86Stang : if 문 (중괄호)을 실행하려면 함수가 true를 반환해야합니다 (즉,'$ needles '가'$ input'에서 발견되지 않음). BTW, "noobiness"에 대해 나쁘다고 생각하지 마라 :) 우리 모두는 어느 시점에서 그것을 통과했다. 나는 당신이 복사/붙여 넣기보다 뭔가를 배우는 것을 선호합니다! 지옥, 뭔가를 배우면 직접 StackOverflow에 대한 질문에 대답 할 수 있습니다. :디 – netcoder