Passing an array to a query using a WHERE clause

后端 未结 18 1055
情歌与酒
情歌与酒 2020-11-21 09:03

Given an array of ids $galleries = array(1,2,5) I want to have a SQL query that uses the values of the array in its WHERE clause like:



        
18条回答
  •  失恋的感觉
    2020-11-21 09:39

    We should take care of SQL injection vulnerabilities and an empty condition. I am going to handle both as below.

    For a pure numeric array, use the appropriate type conversion viz intval or floatval or doubleval over each element. For string types mysqli_real_escape_string() which may also be applied to numeric values if you wish. MySQL allows numbers as well as date variants as string.

    To appropriately escape the values before passing to the query, create a function similar to:

    function escape($string)
    {
        // Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
        return mysqli_real_escape_string($db, $string);
    }
    

    Such a function would most likely be already available to you in your application, or maybe you've already created one.

    Sanitize the string array like:

    $values = array_map('escape', $gallaries);
    

    A numeric array can be sanitized using intval or floatval or doubleval instead as suitable:

    $values = array_map('intval', $gallaries);
    

    Then finally build the query condition

    $where  = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
    

    or

    $where  = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
    

    Since the array can also be empty sometimes, like $galleries = array(); we should therefore note that IN () does not allow for an empty list. One can also use OR instead, but the problem remains. So the above check, count($values), is to ensure the same.

    And add it to the final query:

    $query  = 'SELECT * FROM `galleries` WHERE ' . $where;
    

    TIP: If you want to show all records (no filtering) in case of an empty array instead of hiding all rows, simply replace 0 with 1 in the ternary's false part.

提交回复
热议问题