2011-05-04 71 views
2

这可能是一个愚蠢的问题,但我可能藏汉因为它:)PHP强制VAR有一定类型

是有没有去强行

$tel1 = '05';// string 
settype($tel1,'string'); 
$tel1 = 06;//either throw error, or convert it to string automatically. 
var_dump($tel1);//(string [2]) 05 

上面的代码的顶部我的头可能不准确,但我需要保留一个变量作为字符串不是数字,因为我做了一些愚蠢的事情,现在我的电话号码丢失了前导0 :-(

n我不能重写这是因为它会混淆其他数字类型,b4请问这是一个自动化服务,让db检查它是否是数字埃里克值与否,

UPDATE 这是问题

function escape($str){ 
    if(is_numeric($str)){ 
     return $str; 
    }else{ 
     return "'".mysql_real_escape_string($str).'\''; 
    } 
} 
$tel1 = "06"; 
$sql = 'SELECT * FROM blabla WHERE id = '.escape($tel1).''; 
//above is same as below 
$sql = 'SELECT * FROM blabla WHERE id = 06 '; 

因为其他inputes thruout的网站正在使用这个功能,我不能改变的景观功能中做任何事,我不想惹他们的验证。

+0

铸字/类型戏法。 '(int)$ tel1'或者'(string)$ tel1' http://php.net/manual/en/language.types.type-juggling.php – James 2011-05-04 14:33:36

回答

1

您使用的is_numeric测试为数字内容,而不是一个整数类型。但是接下来你需要一个叫做$str的变量,这意味着你要想要它是一个字符串。

也许使用:

function escape($val) { 
    if (is_numeric($val) && !is_string($val)) { 
     return $val; 
    } 
    else{ 
     return "'" . mysql_real_escape_string($val) . '\''; 
    } 
} 

现在字符串将被转义和引用,但是如果它们只包含数字内容。

+0

这就是问题,因为这是写在猴子[年龄]前,这就是问题,我不知道如果我改变'逃生'它可能会影响其他投入,如果这是有道理的,他们在不同的页面, – Val 2011-05-04 14:50:48

+0

,但这是东西我可能会考虑:) – Val 2011-05-04 14:51:09

+0

@Val:除此之外,我并不真正理解这个问题。 – 2011-05-04 14:52:43

1

,你可以这样做:

$string = (string) $int; 

,或者使用功能

$string = strval($int); 
+0

其中有点复杂,我知道(字符串)06,请再看第3行,我想'$ tel1'为'$ tel =“06”; //字符串不是06整数, – Val 2011-05-04 14:35:46

0

要投你可以使用类似的变量:

$i = 1; 
$s = (string) $i; 

根据该数据库适配器您可能无法检测到从数据库返回的类型。我相信它是PDO,它以字符串形式返回所有内容(即使是INT值)。

number_format()功能可使用在你身上。

1

不能变力,以在全球范围内的特定类型。

您可以强制Array S和Object S IN的功能。

function getElementsByClassName(DOMNode $parentElement, Array $classNames) { 
... 
} 

如果传递的对象不是DOMNode一个实例(或子类),或者如果你没有通过Array作为第二个参数,你会得到一个错误。

你当然可以施放任何变量,例如, (string) $tel1

你不应该处理的电话号码作为Int小号无论如何,因为前导零和可能的括号和破折号。另外,一旦你的电话号码是Int,它不会再知道它0填充,因为它会被丢弃,所以铸造回来不会给你原来的String

+0

这就是我需要做的事情来保留电话号码作为一个字符串,但它会自动转换为整数时,因为转义函数插入数据库[查看更新回答] – Val 2011-05-04 14:45:53

+0

@Val你可以[将其更改为'is_int()'](http://codepad.org/RrMdtniu)。或者,删除条件,并通过'mysql_real_escape_string()',引号分隔来传递所有内容。 – alex 2011-05-04 14:48:40

0

如果一个变量声明为:

$var = 06; 

它立刻变得没有6前导零,因为前导零,当涉及到整数是没有意义的,因此它的切出。

换句话说,你的变量必须被创建为字符串,这就是你自己可能推导出来的。

快速修复将如下:你可以添加另一个参数到你的escape()函数。

例如:

function escape($str, $force_str = false) 
{ 
    if($force_str) 
    { 
     // do your conversion, the rest of the site will by default pass false so nothing will be broken 
    } 
} 
0

亚历克斯说,通过确保该电话号码永远不会从字符串转换在自己的代码为int开始。然后,您需要确保将它发送到SQL DB时不会进行转换。 它应该,如果你做这样的工作:

$sql = "SELECT * FROM blabla WHERE id = '" . mysql_real_escape_string($tel1) . "'"; 

这是一样的

$sql = "SELECT * FROM blabla WHERE id = '06'";