Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Variable Handling Functions : settype

settype

Set the type of a variable (PHP 4, PHP 5)
bool settype ( mixed &var, string type )

Example 2600. settype() example

<?php
$foo
= "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)
?>

Related Examples ( Source code ) » settype





Code Examples / Notes » settype

nospamplease

you must note that this function will not set the type permanently! the next time you set the value of that variable php will change its type as well.

djworld

Usually it won't be necessary to use this function, but some times you need to be sure the variables are of some kind. For example, if you send a number to a database query from a variable passed by GET or POST, you may get sure it's a number by doing SetType ($var, 'integer'); so you can avoid security holes if it isn't a number and you don't need to addslashes() it, or for example, if you need to be sure that a number won't have any decimals after rounding it, you may do the same and as it will be an integer, it won't contain decimals.
(ed: change to reflect deleted of other notes)


sdibb

Using settype is not the best way to convert a string into an integer, since it will strip the string wherever the first non-numeric character begins.  The function intval($string) does the same thing.
If you're looking for a security check, or to strip non-numeric characters (such as cleaning up phone numbers or ZIP codes),  try this instead:
<?
    $number=ereg_replace("[^0-9]","",$number);
?>


matt

using (int) insted of the settype function works out much better for me. I have always used it. I personally don't see where settype would ever come in handy.

r dot schechtel

To: neoja@hotmail.com
I believe in this case testing the $id using is_numeric() would be the better solution.
E.g something like this:
<?php
if (is_numeric($id)) {
 $db->query($sql);
}
?>
Roman Schechtel


ludvig dot ericson gmail.dot com

To matt:
This function accepts a paremeter, which does not imply you using hardcoded stuff, instead you can let the user choose! \o/
As a part of a framework or something.
Plus, you can probably call this with call_user_func


ns

This settype() behaviour seems consistent to me. Quoting two sections from the manual:
"When casting from a scalar or a string variable to an array, the variable will become the first element of the array: "
<pre>
2 $var = 'ciao';
3 $arr = (array) $var;
4 echo $arr[0];  // outputs 'ciao'
</pre>
And if (like your code above) you do a settype on an empty variable, you'll end up with a one element array with an empty (not unset!) first element. So appeanding to it will start appending at index 1. As for why reset() doesn't do anything:
"When you assign a value to an array variable using empty brackets, the value will be added onto the end of the array."
It doesn't matter where the array counter is; values are added at the end, not at the counter.


tboothby

settype() for some reason increases the initial internal counter for the index of an array if you use
settype($foo, "array");$foo[]='bar';
'bar' will be stored in $foo[1].  furthermore, if you use
reset($foo);$foo[]='barr';
'barr' will be stored in $foo[1] again!
i'm using version 3.0.12 on linux 2.2.5-22


andrey

Possible value is "unicode" starting PHP6.

michael benedict

note that settype() will initialize an undefined variable.  Therefore, if you want to preserve type and value, you should wrap the settype() call in a call to isset().
<?php
settype($foo, "integer");
echo("|$foo|");
?>
prints "|0|", NOT "||".
To get the latter, use:
<?php
if(isset($foo)) settype($foo, "integer");
echo("|$foo|");
?>


support

Note that settype($string, "integer") will set $string to 0 if $string contains any lettery, but the function call will be TRUE

25-oct-2005 02:30

James Reiher (IL) writes:
23-Feb-2005 06:50
$agentnum = "007";
$agentnum = settype($agentnum, "int");
echo $agentnum; // will show up as 1 instead of 7!
James, the return value of settype function is boolean, 1 if succsess.
Correct code: $success=settype($agentnum, "int");
The $agentnum is now 7 (not 007 or not 1)!


jeffg

It's worth noting that one can neither <I>settype()</i> nor type-cast a variable as a long.  The workaround for this seems to be to use <I>pack()</i>.

neoja

It is always good to validate all the variables that are given in the url and would cause an error if they are of wrong type. For example, if your page is products.php?id=123 then run settype($id, "integer") in the script, before getting the product info from the database. If the user enters a non-numeric value in the url -- either pasting it wrong or intentionally :) -- the $id will be set to zero and database query will have no errors.

reinier_deblois

Instead of settype you could use:
<?php
$int=593;  // $int is a integer
$int.="";   // $int is now a string


sneskid

In response to the guy who was having troubles with leading zeros and wrote the convertToInt function.
I benchmarked it and it is faster to just use base_convert than ltrim & friends.
base_convert also has a lower "first time call" cost than ltrim (this could be related to server settings).
It's about 2/3 that of ltrim.
If you only use this type of conversion once per script then it's far more beneficial to use base_convert.
The average values listed are ignoring the first time call costs.
<?php
$t = '0100';
// avg: 0.0000025 (0.0000036 wrapped as a function)
$x = base_convert($t, 10, 10);
// avg: 0.0000028 (0.0000039 wrapped as a function)
$x = 0+ltrim($t,'0');
?>


25-sep-2005 09:24

In response to the comment by Neoja regarding validating every variable in the URL using settype -- that is wrong.
All value passed in the URL are strings, even if they are numbers. (Remember, they are passed in the header, which is a specially formatted string).


slushpupie

in PHP3 converting a string to any number results in the value becoming 0.  To check if a string represents a number try this:
<PRE>
$test = "0001";
$testcp = $test;
settype($testcp,"double");
if (strval($testcp) == $test) {
echo("\$test is a number");
} else {
echo ("\$test is not a number");
}
</PRE>


23-nov-2004 09:34

in PHP3 converting a string to any number results in the value becoming 0.  To check if a string represents a number try this:
<PRE>
$test = "0001";
$testcp = $test;
settype($testcp,"double");
if (strval($testcp) === $test) {
  echo("\$test is a number");
} else {
  echo ("\$test is not a number");
}
</PRE>


16-may-2005 08:22

I needed to pull a zerofilled integer out of a MySQL table and increment it by a certain amount.  Unfortunately, PHP treated this integer as if it were a string when I tried to add an amount to it.  For instance:
<?php
$a = '0100';
$b = $a + 1;
print $b;
// This would print 64 instead of 101.
?>
To fix this I created a simple function:
<?php
function convertToInt($string) {
$y = ltrim($string, '0');
$z = 0 + $y;
return $z;
}
// Now I can add any integer to my converted integer
$a = '0100';
$b = 2 + convertToInt($a);
print $b;
// This prints 102
?>


james reiher il

I had a problem with PHP destroying the value of my integer with leading zeros as follows:
$agentnum = "007";
$agentnum = settype($agentnum, "int");
echo $agentnum; // will show up as 1 instead of 7!
Oddly enough, this works fine, (at least for PHP 4.3):
$agentnumber = "007";
$agentnumber += 0; // convert $number to numeric type
echo $agentnumber; // will now show up as 7!
If you do this for gods sake leave a comment on the line because its definitely not by-the-book coding. Another commentor here has used regular expressions to weed out the leading zeros, so I know its not the only solution.
I also tried the equivelant of:
$agentnum = "007";
$agentnum = (int)$agentnumber;
echo $agentnum;
But the result is a nonsense number, probably by using the concatenation of the ASCII codes as the integer.


memandeemail

/**
* @return bool
* @param array[byreference] $values
* @desc Convert an array or any value to Escalar Object [not tested in large scale]
*/
function setobject(&$values) {
$values = (object) $values;
foreach ($values as $tkey => $val) {
if (is_array($val)) {
setobject($val);
$values->$tkey = $val;
}
}
return (bool) $values;
}


Change Language


Follow Navioo On Twitter
debug_zval_dump
doubleval
empty
floatval
get_defined_vars
get_resource_type
gettype
import_request_variables
intval
is_array
is_binary
is_bool
is_buffer
is_callable
is_double
is_float
is_int
is_integer
is_long
is_null
is_numeric
is_object
is_real
is_resource
is_scalar
is_string
is_unicode
isset
print_r
serialize
settype
strval
unserialize
unset
var_dump
var_export
eXTReMe Tracker