RE: [PHP] how do i get a variable type? - not that simple

From: Date: Tue, 20 Mar 2001 00:31:47 +0000
Subject: RE: [PHP] how do i get a variable type? - not that simple
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-44656@lists.php.net to get a copy of this message
You could take advantage of the type conversion performed by php as demonstrated in this snippet (the trick is in multiplying $value by 1). if you need to distinguish further between doubles and floats you can do a regex on $value once you've established it's type: <?php $a[] = "1234"; $a[] = "1234.567"; $a[] = "1.234e-8"; $a[] = "3oranges"; foreach($a as $value) { print($value.": "); if(is_numeric($value)) { $tmp = 1 * $value; printf("is %s<BR>\n", gettype($tmp)); } else print("is not a number"); } ?> Moody -----Original Message----- From: Johnson, Kirk [mailto:kjohnson@zootweb.com] Sent: 19 March 2001 15:55 To: php-general@lists.php.net Subject: RE: [PHP] how do i get a variable type? - not that simple Jim, Thanks for sharing all your hard work. Have you seen checkdate()? http://www.php.net/manual/en/function.checkdate.php Kirk > -----Original Message----- > From: Ide, Jim [mailto:jide@lgb-inc.com] > Sent: Monday, March 19, 2001 6:38 AM > To: 'phpman'; php-general@lists.php.net > Subject: RE: [PHP] how do i get a variable type? - not that simple > > > These are the functions I use to determine if > a string value is a valid integer, real, date, etc. > Hope this helps. > > ps - please let me know if you find any errors. thanx. > > <?php > > function IsValidBoolean($p) { > if ( isset($p) ) { > if ((strtolower($p) == "true") or (strtolower($p) == > "false")) return TRUE; > } > return FALSE; > } > > function IsValidMemo($p) { > > // If $p contains any characters other than printable ascii, > // or \r or \n, return FALSE. > > if (trim($p) == "") return TRUE; > if ( ereg("[^\r\n\x20-\x7E]", $p) ) return FALSE; > return TRUE; > } > > function IsValidString($p) { > > // If $p contains any characters other than printable ascii, > // return FALSE. > > if (trim($p) == "") return TRUE; > if ( ereg("[^\x20-\x7E]", $p) ) return FALSE; > return TRUE; > } > > function IsValidInteger($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p consists of 1 or more digits, optionally preceded by a > minus sign > > if ( isset($p) ) return ereg("^\-?[0-9]+$",$p); > return FALSE; > } > > function IsValidReal($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p begins with optional minus sign, followed by 1 or more > digits, followed by a decimal point, > // followed by 1 or more digits > // 3. $p can be optionally preceded by a minus sign > > if ( isset($p) ) return ereg("^\-?[0-9]+\.[0-9]+$",$p); > return FALSE; > } > > function IsLeapYear($y) { > if ( (($y % 4) == 0) && (($y % 100) != 0) || (($y % 400) == 0)) > return TRUE; > return FALSE; > } > > function IsValidDate($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p consists of 4 digits followed by minus sign, > followed by 2 > digits, followed by > // minus sign, followed by 2 digits > // example 1995-02-03 > > if ( ! isset($p) ) > return FALSE; > if ( ! ereg("^([0-9]{4})\-([0-9]{2})\-([0-9]{2})$",$p) ) > return FALSE; > > $t = explode("-",$p); > if ( count($t) != 3 ) return FALSE; > $y = $t[0]; > $m = $t[1]; > $d = $t[2]; > > return IsValidDate2($y,$m,$d); > } > > function IsValidDate2($y,$m,$d) { > > if ( ($m < 1) or ($m > 12) ) return FALSE; > if ( ($d < 1) or ($d > 31) ) return FALSE; > > // 30 days has sept, apr, jun, and nov (all the rest > have 31 [except > for feb]) > // 9 4 6 11 > > if ( ($m == 4) or ($m == 6) or ($m == 9) or ($m == 11) ) { > if ($d > 30) return FALSE; > } elseif ($m == 2) { > if ( IsLeapYear($y) ) { > if ( $d > 29 ) return FALSE; > } else { > if ( $d > 28 ) return FALSE; > } > } > return TRUE; > } > > function IsValidTime($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p consists of 2 digits in the range 00 to 23, > // followed by a colon, > // followed by 2 digits in the range 00 to 59, > // followed by a colon, > // followed by 2 digits in the range 00 to 59. > // example 14:45:02 > > if ( ! isset($p) ) > return FALSE; > if ( ! ereg("^([0-9]{2})\:([0-9]{2})\:([0-9]{2})$",$p) ) > return FALSE; > > $t = explode(":",$p); > if ( count($t) != 3 ) return FALSE; > $h = $t[0]; > $m = $t[1]; > $s = $t[2]; > > return IsValidTime2($h,$m,$s); > } > > function IsValidTime2($h,$m,$s) { > > if ( ($h < 0) or ($h > 23) ) return FALSE; > if ( ($m < 0) or ($m > 59) ) return FALSE; > if ( ($s < 0) or ($s > 59) ) return FALSE; > > return TRUE; > } > > function IsValidDateTime($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p consists of a valid date (validated by > IsValidDate() above) > // followed by a space > // followed by a valid time (validated by > IsValidTime() above) > // example: 1998-04-21 22:01:34 > > if ( ! isset($p) ) return FALSE; > > $temp = explode(" ",$p); > if ( count($temp) != 2 ) return FALSE; > $d = $temp[0]; > $t = $temp[1]; > if ( ! IsValidDate($d) ) return FALSE; > if ( ! IsValidTime($t) ) return FALSE; > > return TRUE; > } > > function IsValidTimeStamp($p) { > > // return TRUE if: > // 1. $p is not equal to "" > // 2. $p consists of a datetime in YYYYMMDDHHMMSS format > // example: 19980421220134 > > if ( ! isset($p) ) return FALSE; > if ( ! ereg("^([0-9]{14})$",$p) ) return FALSE; > > $y = substr($p,0,4); > $m = substr($p,4,2); > $d = substr($p,6,2); > $h = substr($p,8,2); > $min = substr($p,10,2); > $s = substr($p,12,2); > > if ( ! IsValidDate2($y,$m,$d) ) return FALSE; > if ( ! IsValidTime2($h,$min,$s) ) return FALSE; > > return TRUE; > } > > function TestVF($type,$fn,$v,$p) { > > // TestVF = TestValidationFunction > > // example 1: > TestVF("integer","IsValidInteger",TRUE,"15"); // > ok, 15 is a valid integer, so print nothing > // example 2: > TestVF("integer","IsValidInteger",FALSE,"15"); // > error, 15 *is* a valid integer, so print error > // example 3: > TestVF("integer","IsValidInteger",FALSE,"abc"); // > ok, "abc" is NOT a valid integer, so print nothing > // example 4: > TestVF("integer","IsValidInteger",TRUE,"abc"); // > error, "abc" is NOT a valid integer, so print error > > $IsValid = $fn($p); > if ( $v ) { > if ( $IsValid ) return; > echo "error, is NOT a valid $type: " . $p . "<BR>\n"; > } else { > if ( ! $IsValid ) return; > echo "error, *is* a valid $type: " . $p . "<BR>\n"; > } > } > > function TestDatesNumbers() { > > echo "The test is sucessful if nothing else gets printed below > this.<BR>\n"; > > // x1F = cc > // x20 = space > // x21 = ! > // ... > // x7D = } > // x7E = ~ > // x7F = cc > > TestVF("string","IsValidString",TRUE, ""); > TestVF("string","IsValidString",TRUE, "asdfasdf"); > TestVF("string","IsValidString",FALSE, "asdf\nasdf"); > // contains \n > TestVF("string","IsValidString",FALSE, "abcd" . chr(0) > . "asdf"); > // contains chr(0) > TestVF("string","IsValidString",FALSE, "abcd\x1Fasdf"); > // contains cc > TestVF("string","IsValidString",TRUE, "abcd asdf"); > TestVF("string","IsValidString",TRUE, "abcd~asdf"); > TestVF("string","IsValidString",FALSE, "abcd\x7Fasdf"); > // contains cc > > TestVF("memo","IsValidMemo",TRUE, ""); > TestVF("memo","IsValidMemo",TRUE, "asdfasdf"); > TestVF("memo","IsValidMemo",TRUE, "asdf\nasdf"); > TestVF("memo","IsValidMemo",TRUE, "asdf\rasdf"); > TestVF("memo","IsValidMemo",TRUE, "asdf\r\nnasdf"); > TestVF("memo","IsValidMemo",FALSE, "abcd" . chr(0) > . "asdf"); > // contains chr(0) > TestVF("memo","IsValidMemo",FALSE, "abcd\x1Fasdf"); > // contains cc > TestVF("memo","IsValidMemo",TRUE, "abcd asdf"); > TestVF("memo","IsValidMemo",TRUE, "abcd~asdf"); > TestVF("memo","IsValidMemo",FALSE, "abcd\x7Fasdf"); > // contains cc > > // digits / 0-9 : > > TestVF("integer","IsValidInteger",FALSE, ""); > // > blank > TestVF("integer","IsValidInteger",TRUE, "0"); > TestVF("integer","IsValidInteger",FALSE, " 0"); > // > leading space not allowed > TestVF("integer","IsValidInteger",FALSE, "+0"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",TRUE, "-0"); > TestVF("integer","IsValidInteger",FALSE, "0+"); > // > trailing plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "0-"); > // > trailing minus sign not allowed > TestVF("integer","IsValidInteger",TRUE, "1"); > TestVF("integer","IsValidInteger",FALSE, "+1"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",TRUE, "-1"); > TestVF("integer","IsValidInteger",FALSE, "1+"); > // > trailing plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "1-"); > // > trailing minus sign not allowed > TestVF("integer","IsValidInteger",TRUE, "11"); > TestVF("integer","IsValidInteger",FALSE, "+11"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",TRUE, "-11"); > TestVF("integer","IsValidInteger",FALSE, "11+"); > // > trailing plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "11-"); > // > trailing minus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "+-1"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "-+1"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "1+-"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "1-+"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "1+1"); > // > plus sign not allowed > TestVF("integer","IsValidInteger",FALSE, "1-1"); > // > minus sign must be leftmost character > TestVF("integer","IsValidInteger",FALSE, "1o1"); > // o > not allowed > TestVF("integer","IsValidInteger",TRUE, > "243095230982340982360923460972362356236"); > TestVF("integer","IsValidInteger",TRUE, > "-243095230982340982360923460972362356236"); > TestVF("integer","IsValidInteger",FALSE, " > -243095230982340982360923460972362356236"); // leading > space not allowed > TestVF("integer","IsValidInteger",FALSE, > "3214532.43"); // > decimal point not allowed in an integer > TestVF("integer","IsValidInteger",FALSE, "/32"); > // > contains / > TestVF("integer","IsValidInteger",TRUE, "0"); > TestVF("integer","IsValidInteger",TRUE, "9"); > TestVF("integer","IsValidInteger",FALSE, ":"); > // > contains : > > TestVF("real","IsValidReal",FALSE, ""); // blank > TestVF("real","IsValidReal",FALSE, "0"); // no > decimal point > TestVF("real","IsValidReal",FALSE, "1"); // no > decimal point > TestVF("real","IsValidReal",TRUE, "1.1"); > TestVF("real","IsValidReal",FALSE, "1."); > // no digit > to the right of decimal point > TestVF("real","IsValidReal",FALSE, ".1"); > // no digit > to the left of decimal point > TestVF("real","IsValidReal",FALSE, "-1"); // no > decimal point > TestVF("real","IsValidReal",TRUE, "-1.1"); > TestVF("real","IsValidReal",FALSE, " -1.1"); > // leading > space not allowed > > TestVF("date","IsValidDate",FALSE, ""); // blank > TestVF("date","IsValidDate",TRUE, "2000-05-24"); > TestVF("date","IsValidDate",FALSE, "sdghsdh"); > // contains > alpha characters > TestVF("date","IsValidDate",FALSE, "4/5/98"); > // contains > slashes > TestVF("date","IsValidDate",FALSE, "2000-9-7"); // not > YYYY-MM-DD format > TestVF("date","IsValidDate",TRUE, "2000-09-07"); > TestVF("date","IsValidDate",FALSE, "2000-09-31"); > // 30 days > has september > TestVF("date","IsValidDate",FALSE, "2000-09-00"); > // day must > be 01 thru 31 > TestVF("date","IsValidDate",FALSE, "2000-19-07"); // month > must be 01 thru 12 > TestVF("date","IsValidDate",FALSE, "2000-00-00"); > // non-valid > month and day > TestVF("date","IsValidDate",FALSE, "2000-01-32"); > // day must > be 01 thru 31 > TestVF("date","IsValidDate",TRUE, "2000-02-28"); > TestVF("date","IsValidDate",TRUE, "2000-02-29"); > TestVF("date","IsValidDate",FALSE, "2000-02-30"); > // days in > feb must be 01 thru 29 > TestVF("date","IsValidDate",TRUE, "1999-02-28"); > TestVF("date","IsValidDate",FALSE, "1999-02-29"); > // 1999 was > not a leap year > TestVF("date","IsValidDate",FALSE, "1999-02-30"); > // days in > feb must be 01 thru 29 > > TestVF("time","IsValidTime",FALSE, ""); // blank > TestVF("time","IsValidTime",TRUE, "20:05:24"); > TestVF("time","IsValidTime",FALSE, "sdghsdh"); > // contains > alpha characters > TestVF("time","IsValidTime",FALSE, "4/5/98"); > // contains > slashes > TestVF("time","IsValidTime",FALSE, "20:9:7"); // not > HH:MM:SS format > TestVF("time","IsValidTime",TRUE, "20:09:07"); > TestVF("time","IsValidTime",FALSE, "24:09:07"); > // hour must > be 00 thru 23 > TestVF("time","IsValidTime",FALSE, "20:60:07"); > // minute > must be 00 thru 59 > TestVF("time","IsValidTime",FALSE, "20:07:60"); > // second > must be 00 thru 59 > > TestVF("datetime","IsValidDateTime",FALSE, ""); > // blank > TestVF("datetime","IsValidDateTime",TRUE, "2000-06-06 > 20:05:24"); > TestVF("datetime","IsValidDateTime",FALSE, "2000-06-06 > 20:05:24"); // 2 spaces between date and time > TestVF("datetime","IsValidDateTime",FALSE, > "2000-06-0620:05:24"); // 0 spaces between > date and time > TestVF("datetime","IsValidDateTime",FALSE, "2000-06-6 > 20:05:24"); // non-valid date format > TestVF("datetime","IsValidDateTime",FALSE, "2000-06-06 > 20:5:24"); // non-valid time format > TestVF("datetime","IsValidDateTime",FALSE, "2000-06-06"); > // time missing > TestVF("datetime","IsValidDateTime",FALSE, "20:05:24"); > // date missing > TestVF("datetime","IsValidDateTime",FALSE, "20:05:24 > 2000-06-06"); // date and time order reversed > > TestVF("timestamp","IsValidTimeStamp",FALSE, ""); > // blank > TestVF("timestamp","IsValidTimeStamp",TRUE, > "20000606200524"); > TestVF("timestamp","IsValidTimeStamp",FALSE, > "2000066200524"); > // non-valid date format > TestVF("timestamp","IsValidTimeStamp",FALSE, > "2000060620524"); > // non-valid time format > TestVF("timestamp","IsValidTimeStamp",FALSE, "20000606"); > // time missing > TestVF("timestamp","IsValidTimeStamp",FALSE, "200524"); > // date missing > TestVF("timestamp","IsValidTimeStamp",FALSE, > "20052420000606"); > // date and time order reversed > > TestVF("boolean","IsValidBoolean",FALSE, ""); > // > blank > TestVF("boolean","IsValidBoolean",TRUE, "true"); > TestVF("boolean","IsValidBoolean",TRUE, "false"); > TestVF("boolean","IsValidBoolean",TRUE, "TRUE"); > TestVF("boolean","IsValidBoolean",TRUE, "FALSE"); > TestVF("boolean","IsValidBoolean",FALSE, "t"); > // > must be 'true' or 'false' > TestVF("boolean","IsValidBoolean",FALSE, "f"); > // > ditto > TestVF("boolean","IsValidBoolean",FALSE, "0"); > // > ditto > TestVF("boolean","IsValidBoolean",FALSE, "1"); > // > ditto > > // uncomment the next 2 to test TestVF() > // TestVF("boolean","IsValidBoolean",TRUE, "1"); > // > ditto > // TestVF("boolean","IsValidBoolean",FALSE, > "true"); // > ditto > > echo "done testing.\n"; > } > > TestDatesNumbers(); > > ?> > > > > -----Original Message----- > From: phpman [mailto:info@graphicon.nu] > Sent: Sunday, March 18, 2001 1:44 PM > To: php-general@lists.php.net > Subject: [PHP] how do i get a variable type? - not that simple > > > No guys. that doesn't work. Take this code for example... > > $a="3"; > echo(gettype($a)); > > this returns string > i need to find it as an integer or real or float for the sql. > which by the > way is MySQL. > > thank you for responding, but I already know that gettype and > all the other > is_* don't work for this. > > > > ""phpman"" <info@graphicon.nu> wrote in message > news:99132e$ol8$1@toye.p.sourceforge.net... > > hello all, > > > > let's say i have this: > > $a="varone=hello world|vartwo=2.44|varthree=100|"; > > > > now i do this: > > > > $b=explode('|',$a); > > $z=count($b); > > for ($x=0;$x<$z;$x++) { > > $tmp=explode('=',$b[$x]); > > .... > > > > and i want to find out if $tmp[1] is a string or an integer (that's > really > > all I need to determine so i can put > > together an SQL statement that puts single quotes around > strings and none > > around integers). Obviously > > i won't know at design time all of the variables and their > values. Thank > > you. > > > > -dave > > > > > > > > -- > > PHP General Mailing List (http://www.php.net/) > > To unsubscribe, e-mail: php-general-unsubscribe@lists.php.net > > For additional commands, e-mail: php-general-help@lists.php.net > > To contact the list administrators, e-mail: > php-list-admin@lists.php.net > > > > > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, e-mail: php-general-unsubscribe@lists.php.net > For additional commands, e-mail: php-general-help@lists.php.net > To contact the list administrators, e-mail: > php-list-admin@lists.php.net > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, e-mail: php-general-unsubscribe@lists.php.net For additional commands, e-mail: php-general-help@lists.php.net To contact the list administrators, e-mail: php-list-admin@lists.php.net

« previous php.general (#44656) next »