복붙노트

[SQL] 어떻게 SQL에서 연산자 PHP 배열을 사용 하는가?

SQL

어떻게 SQL에서 연산자 PHP 배열을 사용 하는가?

나는이 두 개의 값으로 배열 내가 선택 쿼리 연산자에서의 SQL 함께 사용하고 싶습니다.

여기 내 테이블의 구조는

id comp_id
1   2
2   3
3   1

I는 두 값의 배열을 배열 $의 도착이 ([0] => 1 [1] => 2)

나는 comp_id 1의 기록을 가져 싶어 나는 다음과 같은 쿼리를 쓴 그래서 2 comp_id.

SELECT * from table Where comp_id IN ($arr)

그러나 결과를 반환하지 않습니다.

해결법

  1. ==============================

    1.당신이 가지고있는 일반 정수는 할 수 있습니다 ...

    당신이 가지고있는 일반 정수는 할 수 있습니다 ...

    $sql = "SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")";
    

    (이오고 계속 같은 몇 가지 추가 정보 ...)

    문자열 (특히 신뢰할 수없는) 입력이 작업을하면 할 수있다

    $sql = "SELECT * FROM table WHERE comp_id IN 
            ('".implode("','",array_map('mysql_real_escape_string', $arr))."')";
    

    하지만 NULL처럼 값을 대처하지 않습니다. 그리고 엄격한 MySQL의 모드를 사용하는 경우 작동하지 않는, 무조건 따옴표로 숫자 값을 추가합니다. https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056 정말, (VARCHAR 같은) 문자열을 숫자 NOT 열을 작업하는 경우 ... 즉 만이 사용합니다.

    mysql_real_escape_string를 같은 통화 뭔가 할 필요는 문자열에있는 따옴표가 제대로 처리되도록합니다! (뿐만 아니라 SQL 주입을 방지!)

    DO는 '신뢰할 수없는'숫자 작업 할 경우 ... 사용할 수 있습니다 INTVAL 또는 floatval

    $sql = "SELECT * FROM table WHERE comp_id IN (".implode(",",array_map('intval', $arr)).")";
    

    입력을 살균한다. 입력 주변 (따옴표 없습니다.

  2. ==============================

    2.당신은 쉼표로 구분 된 문자열로 배열을 변환해야합니다 :

    당신은 쉼표로 구분 된 문자열로 배열을 변환해야합니다 :

    $condition = implode(', ', $arr);
    

    그리고, 또한, 당신은 (당신이 입력 모르는 경우) 먼저 값을 탈출 할 수 있습니다 :

    $condition = implode(', ', array_map('mysql_real_escape_string', $arr));
    
  3. ==============================

    3.$ 편곡은 SQL 서버, PHP는 배열입니다 당신은 구문 분석됩니다 문자열을 보낼 필요 당신은 등 1, 2, 같은 목록에서 배열을 설정해야합니다 ..

    $ 편곡은 SQL 서버, PHP는 배열입니다 당신은 구문 분석됩니다 문자열을 보낼 필요 당신은 등 1, 2, 같은 목록에서 배열을 설정해야합니다 ..

    이 작업을 수행 할 수는 함수 http://php.net/implode을 사용할 수 있습니다

    그래서 쿼리 시도를 실행하기 전에

    $arr = implode ( ', ', $arr);
    
  4. ==============================

    4.당신은 ','쉼표로 배열을 내파 필요

    당신은 ','쉼표로 배열을 내파 필요

    $imploded_arr = implode(',', $arr);
    
    SELECT * from table Where comp_id IN ($imploded_arr)
    
  5. ==============================

    5.만 쿼리로 MySQL에 문자열을 전달하므로이 시도 할 수 있습니다

    만 쿼리로 MySQL에 문자열을 전달하므로이 시도 할 수 있습니다

    mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
    
  6. ==============================

    6.다음 IN SQL 연산자를 들어, 같은 형식이 필요합니다 - 당신은 PHP와 SQL을 혼합하고

    다음 IN SQL 연산자를 들어, 같은 형식이 필요합니다 - 당신은 PHP와 SQL을 혼합하고

    SELECT * from table WHERE comp_id IN (1,2)
    

    그래서 PHP에서 당신이 좋아하는 일을 할 필요가 얻을 :

    $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"
    

    마음에 곰이는 정수의 배열 포함하면 작동합니다. 당신은 그들이 문자열이있는 경우 각 요소를 탈출해야합니다.

  7. ==============================

    7.여기 모든 사람들이 같은 일을 제안하는하지만 난 때문에 간단한 오류 워드 프레스에 경고를 얻었다. 당신은 당신의 내파 문자열에 쉼표를 추가해야합니다. 이 같은 정확한 뭔가합니다.

    여기 모든 사람들이 같은 일을 제안하는하지만 난 때문에 간단한 오류 워드 프레스에 경고를 얻었다. 당신은 당신의 내파 문자열에 쉼표를 추가해야합니다. 이 같은 정확한 뭔가합니다.

    $query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";
    

    희망은 나 같은 사람을 도움이됩니다. :)

  8. ==============================

    8.당신은 뭔가를해야합니다 :

    당신은 뭔가를해야합니다 :

    $sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
    
  9. ==============================

    9.당신은 실제로 문자열에 $의 편곡을 변환해야합니다. 당신이 내파를 사용하는 것입니다 무슨 일을하는지와 가장 간단한 방법 ()

    당신은 실제로 문자열에 $의 편곡을 변환해야합니다. 당신이 내파를 사용하는 것입니다 무슨 일을하는지와 가장 간단한 방법 ()

    $query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';
    

    지금 당신은 당신의 쿼리를 에코 경우는 IN 문에있는 배열, 그냥 단어가 "배열"것보다는 그것을 볼 수 있습니다

  10. ==============================

    10.당신은 쿼리에 사용할 문자열로 배열을 변환해야합니다 :

    당신은 쿼리에 사용할 문자열로 배열을 변환해야합니다 :

    $list = implode(',', $arr);
    

    그 다음은 IN 절에서 사용할 수 있습니다 :

    SELECT * from table Where comp_id IN ($list)
    
  11. ==============================

    11.정수에만있는 경우에만 배열에서 작동의 '@barryhunter에 따라 답 :

    정수에만있는 경우에만 배열에서 작동의 '@barryhunter에 따라 답 :

    $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
    

    나는 그것이 문자열의 배열에 대해 작동하도록 일부 개조하면 되겠했습니다 :

    $sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
    
  12. ==============================

    12.이전 답변의 일부에서 SQL 인젝션의 몇 가지 위험이있다. 당신이 소각되고 편곡 $에 대해 완전히 확신 (그 상태를 유지한다) 경우는 잘 될 수 있습니다. 완전히 확실하지 않은 경우, 당신은 $ stmt-> bindValue를 사용하여 이러한 위험을 완화 할 수 있습니다. 여기에 그 일을하는 한 가지 방법은 다음과 같습니다

    이전 답변의 일부에서 SQL 인젝션의 몇 가지 위험이있다. 당신이 소각되고 편곡 $에 대해 완전히 확신 (그 상태를 유지한다) 경우는 잘 될 수 있습니다. 완전히 확실하지 않은 경우, 당신은 $ stmt-> bindValue를 사용하여 이러한 위험을 완화 할 수 있습니다. 여기에 그 일을하는 한 가지 방법은 다음과 같습니다

    # PHP
    $in_list = array();
    for ($i = 0; $i < count($arr); $i++) {
        $key = 'in_param_' . i;
        $in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
    }
    $keys = implode(', ', array_keys($in_list));
    
    // Your SQL ...
    $sql = "SELECT * FROM table where id IN ($keys)";
    
    
    foreach ($in_list as $item) {
        $stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
    }
    $stmt = $this->getConnection()->prepare($sql)->execute();
    
  13. ==============================

    13.배열은 정수의 경우 :

    배열은 정수의 경우 :

    $searchStringVar = implode(",",$nameIntAryVar);
    $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";
    

    배열은 문자열의 경우 :

    $searchStringVar = implode("','",$nameStringAryVar);
    $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";
    
  14. from https://stackoverflow.com/questions/9618277/how-to-use-php-array-with-sql-in-operator by cc-by-sa and MIT license