Pheasant\Database\Binder::_bindInto PHP Method

_bindInto() public method

Bind parameters into a particular pattern, skipping quoted strings which might have question marks in them.
public _bindInto ( $pattern, $sql, $params, $func )
    public function _bindInto($pattern, $sql, $params, $func)
    {
        $result = NULL;
        // http://stackoverflow.com/questions/5695240/php-regex-to-ignore-escaped-quotes-within-quotes
        // this could be done with back refs, but this is much faster
        $regex = "/('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'|\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|{$pattern})/";
        foreach (preg_split($regex, $sql, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $token) {
            if ($token == '?' || $token[0] != '"' && $token[0] != "'" && preg_match("/{$pattern}/", $token)) {
                if (!count($params)) {
                    throw new \InvalidArgumentException("Not enough parameters to bind({$sql})");
                }
                $result .= $func($this, array_shift($params), $token);
            } else {
                $result .= $token;
            }
        }
        if (count($params)) {
            $exception = new \InvalidArgumentException("Parameters left over in bind({$sql})");
            $exception->leftOverParams = $params;
            throw $exception;
        }
        return $result;
    }