복붙노트

나는 정수 배열을 가지고 있는데, 각각을 (PHP에서) mysql 질의에 어떻게 사용합니까?

PHP

나는 정수 배열을 가지고 있는데, 각각을 (PHP에서) mysql 질의에 어떻게 사용합니까?

배열에 임의의 콘텐츠 항목 ID가 가득 찼습니다. 배열에있는 각 ID를 사용하여 mysql 쿼리 (배열의 id는 WHERE 절에 있음)를 실행해야합니다. 배열의 순서대로 나타납니다. 어떻게하면 좋을까요?

배열의 각 개별 ID에 대한 UPDATE 쿼리입니다.

해결법

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

    1.거의 모든 "PHP 내에서 SQL을 수행하는 방법"과 마찬가지로 - 준비된 문을 사용해야합니다. 그다지 어렵지 않습니다.

    거의 모든 "PHP 내에서 SQL을 수행하는 방법"과 마찬가지로 - 준비된 문을 사용해야합니다. 그다지 어렵지 않습니다.

    $ids  = array(2, 4, 6, 8);
    
    // prepare an SQL statement with a single parameter placeholder
    $sql  = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
    $stmt = $mysqli->prepare($sql);
    
    // bind a different value to the placeholder with each execution
    for ($i = 0; $i < count($ids); $i++)
    {
        $stmt->bind_param("i", $ids[$i]);
        $stmt->execute();
        echo "Updated record ID: $id\n";
    }
    
    // done
    $stmt->close();
    

    또는 다음과 같이 할 수 있습니다.

    $ids    = array(2, 4, 6, 8);
    
    // prepare an SQL statement with multiple parameter placeholders
    $params = implode(",", array_fill(0, count($ids), "?"));
    $sql    = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
    $stmt   = $mysqli->prepare($sql);
    
    // dynamic call of mysqli_stmt::bind_param                    hard-coded eqivalent
    $types = str_repeat("i", count($ids));                        // "iiii"
    $args = array_merge(array($types), $ids);                     // ["iiii", 2, 4, 6, 8]
    call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)
    
    // execute the query for all input values in one step
    $stmt->execute();
    
    // done
    $stmt->close();
    echo "Updated record IDs: " . implode("," $ids) ."\n";
    
    // ----------------------------------------------------------------------------------
    // helper function to turn an array of values into an array of value references
    // necessary because mysqli_stmt::bind_param needs value refereces for no good reason
    function ref($arr) {
        $refs = array();
        foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
        return $refs;
    }
    

    필요에 따라 다른 필드에 대한 매개 변수 자리 표시자를 더 추가하십시오.

    어느 것을 골라야합니까?

    왜 준비된 진술입니까?

    긴 루프에서는 준비된 명령문을 사용하고 일반 SQL을 보내는 것 사이의 실행 시간 차이가 눈에 띄게됩니다.

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

    2.네가 쫓아 온 것일 수도있어.

    네가 쫓아 온 것일 수도있어.

    $ids = array(2,4,6,8);
    $ids = implode($ids);
    $sql="SELECT * FROM my_table WHERE id IN($ids);";
    mysql_query($sql);
    

    그렇지 않으면 무엇이 잘못 되었습니까?

    $ids = array(2,4,6,8);
    foreach($ids as $id) {
        $sql="SELECT * FROM my_table WHERE ID = $id;";
        mysql_query($sql);
    }
    
  3. ==============================

    3.아멘, 진술에 대한 Tomalak의 의견.

    아멘, 진술에 대한 Tomalak의 의견.

    그러나 mysqli를 사용하지 않으려는 경우 intval ()을 사용하여 주입을 방지 할 수 있습니다.

    $ids  = array(2, 4, 6, 8);
    for ($i = 0; $i < count($ids); $i++)
    {
        mysql_query("UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = " . intval($ids[$i]));
    }
    
  4. ==============================

    4.

    $values_filtered = array_filter('is_int', $values);
    if (count($values_filtered) == count($values)) {
        $sql = 'update table set attrib = 'something' where someid in (' . implode(',', $values_filtered) . ');';
        //execute
    } else {
        //do something
    }
    
  5. ==============================

    5.당신은 다음과 같은 것을 할 수있다. 그러나 배열에 정수 만이 들어 있어야한다는 것을주의해야한다. 그렇지 않으면 SQL 인젝션으로 끝날 수있다.

    당신은 다음과 같은 것을 할 수있다. 그러나 배열에 정수 만이 들어 있어야한다는 것을주의해야한다. 그렇지 않으면 SQL 인젝션으로 끝날 수있다.

    도움이 될만한 콘텐츠를 얻으려면 여러 쿼리를 수행하고 싶지는 않습니다. 이 같은 것은 당신이 겪은 것이 될 수 있습니다.

    foreach ($array as $key = $var) {
       if ((int) $var <= 0) {
           unset($array[$key]);
       }
    }
    
    
    $query = "SELECT * 
    from content 
    WHERE contentid IN ('".implode("','", $array)."')";
    
    $result = mysql_query($query);
    
  6. from https://stackoverflow.com/questions/330268/i-have-an-array-of-integers-how-do-i-use-each-one-in-a-mysql-query-in-php by cc-by-sa and MIT license