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