00001 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 class CI_Validation {
00028
00029 var $CI;
00030 var $error_string = '';
00031 var $_error_array = array();
00032 var $_rules = array();
00033 var $_fields = array();
00034 var $_error_messages = array();
00035 var $_current_field = '';
00036 var $_safe_form_data = FALSE;
00037 var $_error_prefix = '<p>';
00038 var $_error_suffix = '</p>';
00039
00040
00041
00042
00043
00044
00045
00046 function CI_Validation()
00047 {
00048 $this->CI =& get_instance();
00049
00050 if (function_exists('mb_internal_encoding'))
00051 {
00052 mb_internal_encoding($this->CI->config->item('charset'));
00053 }
00054
00055 log_message('debug', "Validation Class Initialized");
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 function set_fields($data = '', $field = '')
00073 {
00074 if ($data == '')
00075 {
00076 if (count($this->_fields) == 0)
00077 {
00078 return FALSE;
00079 }
00080 }
00081 else
00082 {
00083 if ( ! is_array($data))
00084 {
00085 $data = array($data => $field);
00086 }
00087
00088 if (count($data) > 0)
00089 {
00090 $this->_fields = $data;
00091 }
00092 }
00093
00094 foreach($this->_fields as $key => $val)
00095 {
00096 $this->$key = ( ! isset($_POST[$key])) ? '' : $this->prep_for_form($_POST[$key]);
00097
00098 $error = $key.'_error';
00099 if ( ! isset($this->$error))
00100 {
00101 $this->$error = '';
00102 }
00103 }
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 function set_rules($data, $rules = '')
00120 {
00121 if ( ! is_array($data))
00122 {
00123 if ($rules == '')
00124 return;
00125
00126 $data = array($data => $rules);
00127 }
00128
00129 foreach ($data as $key => $val)
00130 {
00131 $this->_rules[$key] = $val;
00132 }
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 function set_message($lang, $val = '')
00149 {
00150 if ( ! is_array($lang))
00151 {
00152 $lang = array($lang => $val);
00153 }
00154
00155 $this->_error_messages = array_merge($this->_error_messages, $lang);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 function set_error_delimiters($prefix = '<p>', $suffix = '</p>')
00171 {
00172 $this->_error_prefix = $prefix;
00173 $this->_error_suffix = $suffix;
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 function run()
00187 {
00188
00189 if (count($_POST) == 0 OR count($this->_rules) == 0)
00190 {
00191 return FALSE;
00192 }
00193
00194
00195 $this->CI->lang->load('validation');
00196
00197
00198 foreach ($this->_rules as $field => $rules)
00199 {
00200
00201 $ex = explode('|', $rules);
00202
00203
00204 if ( ! in_array('required', $ex, TRUE))
00205 {
00206 if ( ! isset($_POST[$field]) OR $_POST[$field] == '')
00207 {
00208 continue;
00209 }
00210 }
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 if ( ! isset($_POST[$field]))
00222 {
00223 if (in_array('isset', $ex, TRUE) OR in_array('required', $ex))
00224 {
00225 if ( ! isset($this->_error_messages['isset']))
00226 {
00227 if (FALSE === ($line = $this->CI->lang->line('isset')))
00228 {
00229 $line = 'The field was not set';
00230 }
00231 }
00232 else
00233 {
00234 $line = $this->_error_messages['isset'];
00235 }
00236
00237
00238 $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
00239 $message = sprintf($line, $mfield);
00240
00241
00242 $error = $field.'_error';
00243 $this->$error = $this->_error_prefix.$message.$this->_error_suffix;
00244 $this->_error_array[] = $message;
00245 }
00246
00247 continue;
00248 }
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 $this->_current_field = $field;
00259
00260
00261 foreach ($ex As $rule)
00262 {
00263
00264 $callback = FALSE;
00265 if (substr($rule, 0, 9) == 'callback_')
00266 {
00267 $rule = substr($rule, 9);
00268 $callback = TRUE;
00269 }
00270
00271
00272
00273 $param = FALSE;
00274 if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))
00275 {
00276 $rule = $match[1];
00277 $param = $match[2];
00278 }
00279
00280
00281 if ($callback === TRUE)
00282 {
00283 if ( ! method_exists($this->CI, $rule))
00284 {
00285 continue;
00286 }
00287
00288 $result = $this->CI->$rule($_POST[$field], $param);
00289
00290
00291 if ( ! in_array('required', $ex, TRUE) AND $result !== FALSE)
00292 {
00293 continue 2;
00294 }
00295
00296 }
00297 else
00298 {
00299 if ( ! method_exists($this, $rule))
00300 {
00301
00302
00303
00304
00305
00306
00307
00308 if (function_exists($rule))
00309 {
00310 $_POST[$field] = $rule($_POST[$field]);
00311 $this->$field = $_POST[$field];
00312 }
00313
00314 continue;
00315 }
00316
00317 $result = $this->$rule($_POST[$field], $param);
00318 }
00319
00320
00321 if ($result === FALSE)
00322 {
00323 if ( ! isset($this->_error_messages[$rule]))
00324 {
00325 if (FALSE === ($line = $this->CI->lang->line($rule)))
00326 {
00327 $line = 'Unable to access an error message corresponding to your field name.';
00328 }
00329 }
00330 else
00331 {
00332 $line = $this->_error_messages[$rule];
00333 }
00334
00335
00336 $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
00337 $mparam = ( ! isset($this->_fields[$param])) ? $param : $this->_fields[$param];
00338 $message = sprintf($line, $mfield, $mparam);
00339
00340
00341 $error = $field.'_error';
00342 $this->$error = $this->_error_prefix.$message.$this->_error_suffix;
00343
00344
00345 $this->_error_array[] = $message;
00346 continue 2;
00347 }
00348 }
00349
00350 }
00351
00352 $total_errors = count($this->_error_array);
00353
00354
00355
00356
00357
00358
00359
00360
00361 if ($total_errors > 0)
00362 {
00363 $this->_safe_form_data = TRUE;
00364 }
00365
00366 $this->set_fields();
00367
00368
00369 if ($total_errors == 0)
00370 {
00371 return TRUE;
00372 }
00373
00374
00375 foreach ($this->_error_array as $val)
00376 {
00377 $this->error_string .= $this->_error_prefix.$val.$this->_error_suffix."\n";
00378 }
00379
00380 return FALSE;
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 function required($str)
00393 {
00394 if ( ! is_array($str))
00395 {
00396 return (trim($str) == '') ? FALSE : TRUE;
00397 }
00398 else
00399 {
00400 return ( ! empty($str));
00401 }
00402 }
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 function matches($str, $field)
00415 {
00416 if ( ! isset($_POST[$field]))
00417 {
00418 return FALSE;
00419 }
00420
00421 return ($str !== $_POST[$field]) ? FALSE : TRUE;
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 function min_length($str, $val)
00435 {
00436 if (preg_match("/[^0-9]/", $val))
00437 {
00438 return FALSE;
00439 }
00440
00441 if (function_exists('mb_strlen'))
00442 {
00443 return (mb_strlen($str) < $val) ? FALSE : TRUE;
00444 }
00445
00446 return (strlen($str) < $val) ? FALSE : TRUE;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459 function max_length($str, $val)
00460 {
00461 if (preg_match("/[^0-9]/", $val))
00462 {
00463 return FALSE;
00464 }
00465
00466 if (function_exists('mb_strlen'))
00467 {
00468 return (mb_strlen($str) > $val) ? FALSE : TRUE;
00469 }
00470
00471 return (strlen($str) > $val) ? FALSE : TRUE;
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484 function exact_length($str, $val)
00485 {
00486 if (preg_match("/[^0-9]/", $val))
00487 {
00488 return FALSE;
00489 }
00490
00491 if (function_exists('mb_strlen'))
00492 {
00493 return (mb_strlen($str) != $val) ? FALSE : TRUE;
00494 }
00495
00496 return (strlen($str) != $val) ? FALSE : TRUE;
00497 }
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508 function valid_email($str)
00509 {
00510 return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
00511 }
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522 function valid_emails($str)
00523 {
00524 if (strpos($str, ',') === FALSE)
00525 {
00526 return $this->valid_email(trim($str));
00527 }
00528
00529 foreach(explode(',', $str) as $email)
00530 {
00531 if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)
00532 {
00533 return FALSE;
00534 }
00535 }
00536
00537 return TRUE;
00538 }
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549 function valid_ip($ip)
00550 {
00551 return $this->CI->input->valid_ip($ip);
00552 }
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563 function alpha($str)
00564 {
00565 return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
00566 }
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 function alpha_numeric($str)
00578 {
00579 return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
00580 }
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591 function alpha_dash($str)
00592 {
00593 return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;
00594 }
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605 function numeric($str)
00606 {
00607 return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
00608
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620 function is_numeric($str)
00621 {
00622 return ( ! is_numeric($str)) ? FALSE : TRUE;
00623 }
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634 function integer($str)
00635 {
00636 return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);
00637 }
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 function is_natural($str)
00649 {
00650 return (bool)preg_match( '/^[0-9]+$/', $str);
00651 }
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662 function is_natural_no_zero($str)
00663 {
00664 if ( ! preg_match( '/^[0-9]+$/', $str))
00665 {
00666 return FALSE;
00667 }
00668
00669 if ($str == 0)
00670 {
00671 return FALSE;
00672 }
00673
00674 return TRUE;
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689 function valid_base64($str)
00690 {
00691 return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);
00692 }
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707 function set_select($field = '', $value = '')
00708 {
00709 if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
00710 {
00711 return '';
00712 }
00713
00714 if ($_POST[$field] == $value)
00715 {
00716 return ' selected="selected"';
00717 }
00718 }
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733 function set_radio($field = '', $value = '')
00734 {
00735 if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
00736 {
00737 return '';
00738 }
00739
00740 if ($_POST[$field] == $value)
00741 {
00742 return ' checked="checked"';
00743 }
00744 }
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 function set_checkbox($field = '', $value = '')
00760 {
00761 if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
00762 {
00763 return '';
00764 }
00765
00766 if ($_POST[$field] == $value)
00767 {
00768 return ' checked="checked"';
00769 }
00770 }
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784 function prep_for_form($data = '')
00785 {
00786 if (is_array($data))
00787 {
00788 foreach ($data as $key => $val)
00789 {
00790 $data[$key] = $this->prep_for_form($val);
00791 }
00792
00793 return $data;
00794 }
00795
00796 if ($this->_safe_form_data == FALSE OR $data == '')
00797 {
00798 return $data;
00799 }
00800
00801 return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));
00802 }
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813 function prep_url($str = '')
00814 {
00815 if ($str == 'http://' OR $str == '')
00816 {
00817 $_POST[$this->_current_field] = '';
00818 return;
00819 }
00820
00821 if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')
00822 {
00823 $str = 'http://'.$str;
00824 }
00825
00826 $_POST[$this->_current_field] = $str;
00827 }
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838 function strip_image_tags($str)
00839 {
00840 $_POST[$this->_current_field] = $this->CI->input->strip_image_tags($str);
00841 }
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852 function xss_clean($str)
00853 {
00854 $_POST[$this->_current_field] = $this->CI->input->xss_clean($str);
00855 }
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866 function encode_php_tags($str)
00867 {
00868 $_POST[$this->_current_field] = str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);
00869 }
00870
00871 }
00872
00873
00874
00875