Welcome Guest, Not a member yet? Register   Sign In
Validation Placeholders being ignored for is_unique
#1

https://codeigniter4.github.io/CodeIgnit...aceholders

PHP Code:
protected $validationRules = [
 
   'email' => 'required|valid_email|is_unique[users.email,id,{id}]'
]; 

looking at the is_unique method in Rules.php it does not appear {id} is being converted to it's corresponding value in $data.

Thanks,
Kyle
Reply
#2

Something like this?

PHP Code:
    public function is_unique(string $str nullstring $field, array $data): bool
    
{
        
// Grab any data for exclusion of a single row.
        
list($field$ignoreField$ignoreValue) = array_pad(explode(','$field), 3null);

        
// Break the table and field apart
        
sscanf($field'%[^.].%[^.]'$table$field);

        
$db Database::connect();
        
        
$row $db->table($table)
                 
 ->select('1')
                 
 ->where($field$str)
                 
 ->limit(1);

        if ( ! empty(
$ignoreField) && ! empty($ignoreValue))
        {
            if (
$ignoreValue[0] == '{') {
                
$key substr($ignoreValue1, -1);
                
                if (isset(
$data[$key]))
                    
$ignoreValue $data[$key];
            }
            
            
$row $row->where("{$ignoreField} !="$ignoreValue);
        }

        return (bool) (
$row->get()
                        ->
getRow() === null);
    } 
Reply
#3

Any updates on this? This comes in to play when post data needs validating and you call a validation rule set by name... instead of by array... so you can't actually pass {$id}:

$this->validate('user')

The is_unique rule does not check for post data... it only looks if the value was passed in the check.

Look at my example to see how I worked around this... but I'm not sure if there is a better way?
Reply




Theme © iAndrew 2016 - Forum software by © MyBB