질문/조언질답게시판

in_array 관련 질문

Extra Form
PHP PHP 7.3

in_array 함수를 사용하면 

 

$비교리스트 =  array("내용1", "내용2");

if(in_array($비교할대상, $비교리스트))

 

이렇게 비교할 수 있는걸로 기억합니다.

그렇다면 만약에 $_GET을 사용하는 거랑

SELECT * from modnfile where id= 이렇게 사용하는 것중에

어느게 더 나을까요?

 

지금 후자쪽을 하려다가 막혀서 물어봅니다 ㅠ



 

  • profile
    질문이 이해가 쉽지 않네요.
    $비교리스트 = array();
    array 값을 담았다면 그대로 이용을 하면 되는데 무엇이 문제인지 왜 갑자기 $_GET, 쿼리문이 등장하는지 둥절입니다.
  • profile profile
    설명이 부족한점 죄송합니다.

    array값에 담을때 db양이 많을수록 처리시간이 늘어나지 않나요? 라는 질문이었습니다.

    그래서 $db->query로(select * from board where) 값이 존재하는지 검색하는 것이랑
    둘중에 어느게더 나을지 몰라서 물어보았습니다.
  • profile profile
    댓글을 달다보니 바보같은 질문이었네요;;
    왜 굳이 이렇게 하는지 ....
    해결이 된것 같습니다 감사합니다.
  • profile profile

    db에 값을 풀스캔해서 array에 담아야 하는 경우가 왜 있는지 모르겠지만 꼭 그렇게 해야 한다면 쿼리를 통해 array로 모든 값을 담아서 저장한 후 해당 array에 내가 비교하고 싶은 값이 있는지 확인하는 php 코드를 쓸 수 있겠죠.

    그런데 왜 이렇게 하는지도 모르겠고요.

    일단 특정 값이 있는지 확인하는 경우 해당 값의 유무만 확인하는 쿼리를 하는게 일반적이지 않나요?
    이전 질문에서도 답변을 받으신 해당 컬럼이 index 처리가 되어 있다면 풀스캔 해서 값을 찾는게 아닌 인덱싱된 데이터를 근거로 아주 몇개의 컬럼만 조회해서 값 유무를 확인해 줄 수도 있을 겁니다.

    $_GET 이 왜 등장하는지도 모르겠습니다.

  • profile profile

    제가 아직 db에 입문한지 별로 안되서 헷갈리는게 많네요 ㅠ
    $db = new mysqli($host, $user, $pw, $database);

    // Create database
    $sql = "SELECT * FROM table where id = 'ddd';";
    if ($db->query($sql) === TRUE) {
    echo "1";
    } else {
    echo "2";
    }
    인덱스를 사용하지 않고 이렇게 해도 작동하지 않을까요?

  • profile profile
    값이 디비에 저장되어있다면 디비 쿼리를 사용하는게 맞고, 그것이 아닌 일반적인 상황에서 비교한다면 in_array만으로도 간단하게 구현하는 것으로 마무리해도 됩니다.

    무슨상황에서 어떤 값을 어떻게 비교해야할지부터 설명하시죠..
  • profile profile
    앗 상황 설명이 부족했네요
    죄송합니다 ㅠ
    이미 해결은 했지만, 중복이 안뜰떄까지 계속 난수를 만드는거였습니다.
  • profile profile

    전 아직도 $_GET, in_array 가 왜 나오는지 모르겠습니다.

    일단 기존의 이미 저장된 값이 있다면 회피하려고 db에 조회를 하고 있다면 무언가 다시 하고 없다면 또 어떤 작업을 하고 하는 것이 왜 문제가 되는지 잘 이해하지 못하구 있구요.

    쿼리 조회시 인덱스 사용 유무에 따라 쿼리 응답의 시간이 대폭 차이가 날수도 있고 아닐 수도 있고 그건 데이터의 양이나 쿼리 구조에 따라 다를겁니다.

    보통 이미 db에 값이 있는 것을 확인후 뭔가 다음 작업이 이루어질때 보통 지금 생각하시는 방식의 db 조회 후 해당 값 유무 또는 해당 값을 확인후 하는 것이 일반적입니다.

    이게 질문인게 조금 이해가 가진 않지만
    먼저 질문하신 것과 연결되어서 그냥 select 쿼리를 할때 결과가 나오는 속도가 걱정스럽다?? 이런 질문이지 아리송하네요.

    인덱스가 걸리지 않는 컬럼에서 값을 조회할때도 데이터 양이 굉장히 많지 않다면 별 문제는 없습니다.

     

    제가 경험한 것 중에 새로 만든 데이터가 기존 db 테이블에 있는지 확인하기 위해 해당 데이터를 전부 조회해서 그걸 배열 데이터에 담아 놓은 후 그 배열을 활용하여 새로 만든 데이터가 있는지 확인하고 하는 경우를 거의 보지 못했습니다.

     - 아마 계속 중복이 될 경우를 대비해서 쿼리해와 배열에 담으려고 하시는건지 모르겠지만 확율상 중복 데이터가 있을 경우가 극히 적을 텐데 전체 데이터를 항상 미리 다 불러 온다는게 조금 비효율 아닌가 하는 생각입니다. 제가 이해한게 맞나 모르겠네요.

     

    참고로 저는 db나 php에 많은 것을 알지 못하는 일반 사용자라 경험에 의한 제 사견이니 제가 틀렸을 가능성이 매우 높습니다.

     

    그리고 중복 자체가 안되게 만들고 중복확인 쿼리 자체를 하지 않는게 어떨지 생각을 해봤습니다. 매번 바뀌는 유닉스타임을 붙여준다던지...

  • profile profile
    그런식으로 난수를 넣지말고 아에 auto_increment 를 적용한 칼럼을 사용하세요. 자동 인덱싱되어있고, 난수가 아니라 빈값으로 디비값을 지정하면 자동으로 1부터 올라가게 됩니다.

    그럼 절대 붙어지지 않고요. 난수로 계속 채크하면 무한대로 계속 디비 쿼리 하는 방식의 비효율성 코드만 나올 뿐입니다.

    절대로 중복되지 않아야 하지만, 단방향으로 난수를 생성해야한다면 인스타그램의 주소뒤 난수처럼 특정한 숫자에 따라 문자들이 바뀌는 방식으로 추가하는 방법도 알아보시고요.
  • profile profile
    이때 db에 대해 이해가 잘못되어서 $_GET가 나왔습니다ㅠ
    조언 감사합니다
  • profile
    반복문이 얼마나 들어가느냐에 따라 틀리지만 성능을 고민하고 계시다면 lookup테이블을 만들어서 in_array대신 쓸 수 있습니다.
    https://xetown.com/tips/1594733

    다만, 단지 구현 난이도를 따진다면 DB보단 $_get 으로 가져오는 것이 좀 더 빠르고 쉽겠지요. 다만 get을 사용시 주소 파라미터로 잘 넘겨줘야 하므로 넘겨받은 값을 리스트로 만든 문자열들 중에서 비교하는 비교문을 사용하고 싶으신 것 같네요. 하지만 주의점은 주소파라미터로 정확한 스트링값을 재대로 넘겨줘야 정상적으로 작동할 수 있고 해당 주소파라미터에 잘못된 값이 들어갈 경우 문제가 발생될 수 있다는 여지도 같이 생각해보셔야할 것입니다.

    디비에서 가져온값은 가져온 디비값들을 그대로 또 특정칼럼키를 잡아 들어가야 하므로.. 그 값이 있을때 없을때 등등 유의해보실 상황이 있겠지요. 다만 입력시 보통 타입별로 지정된 형태의 값들만 넣을것이고, 해당 디비 쿼리를 만드는 조건들이 $_get 일테니 디비쿼리에서 인젭션 공격에만 잘 방어한다면 원하는 데이터를 고정적으로 받아 비교할 수 있는 대상을 만들 수 잇다는 점입니디다.

    어느것을 쓰던 결론은 $비교리스트 에 대한 값을 문자열 array으로 잘 만들어졌다면 앞 부분을 어느걸 가져오는 것이던 문제 없으나, 이런 상담을 받을 때, 정말 중요한건 내가 어떤 페이지에서 어떤 값을 어떻게 비교 하고 싶다라는 의사표현이 굉장히 중요합니다.

    그 의사 표현이 없다면 답변자 입장에서는 아니 왜 저걸 쓰려고 하지? 왜 저걸 디비에 가져올려고 하지? 라는 의문만 가지고 정확한 답변을 드리지 못합니다. 위에 말씀드린 것 과 같은 문제점이 있으니 해당 문제점을 어떻게 해결해나갈 것인지에 대한 깊은 고민이 필요하실 것 같네요.
  • profile
    while (true) {
    $chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    // 시드 할 문자 목록을 반복 할 최소 / 최대 횟수
    $chrRepeatMin = 1; // 시드 문자열을 반복하는 최소 시간
    $chrRepeatMax = 100; // 시드 문자열을 반복하는 최대 횟수
    // 반환 된 임의 문자열의 길이
    $chrRandomLength = 20;
    // 위의 변수를 가진 ONE LINE 랜덤 명령.
    $chrresult = substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))), 1, $chrRandomLength);
    $sql = "SELECT * FROM modnfile_data where id = '".$chrresult."'";
    $result = mysqli_query($db, $sql);
    if (mysqli_num_rows($result)) {
    // 1 같은 값이 있으니 반복
    } else {
    // 0 같은 값이 없으니 탈출
    break;
    }
    }
    echo "탈출"

    이렇게 해결했습니다

    상황 설명이 부족했던 점 죄송합니다
    다음부터 상황설명에 집중을 해보도록 하겟습니다.