在php中,我打开了一个.php文件,想要评估某些行。特别是当$ table_id和$ line变量赋值时。
在文本文件中我有:
...
$table_id = 'crs_class'; // table name
$screen = 'crs_class.detail.screen.inc'; // file identifying screen structure
...
等等。下面的if语句从不检测$table_id
或$screen
的出现(即使没有$ prepended)。我无法理解为什么它不起作用,因为下面的strpos语句寻找'require'工作正常。
那么,为什么这个if语句不会受到影响?
while ($line=fgets($fh)) {
//echo "Evaluating... $line <br>";
**if ((($pos = stripos($line, '$table_id')) === true) || (($pos = stripos($line, '$screen'))===true))**
{
// TODO: Not evaluating tableid and screen lines correctly fix.
// Set $table_id and $screen variables from task scripts
eval($line);
}
if (($pos=stripos($line, 'require')) === true) {
$controller = $line;
}
}
答案 0 :(得分:7)
使用!== false而不是=== true
如果找到针,stripos会将位置返回整数。这绝不是===布尔。
您可能也对梨的存储库中的PHP tokenizer module或lexer package感兴趣。
答案 1 :(得分:3)
我认为VolkerK已经有了答案 - stripos()不返回布尔值,它返回字符串中的位置,如果找不到则返回false - 所以你想要检查返回是不是假的使用!= =(不!=因为你想检查类型)。
此外,请小心使用该eval(),除非您知道可以信任您从$ fh读取的数据来源。
否则,该行上可能还有其他任何你无意中eval() - 该行可能是这样的:
$table_id = 'foo'; exec('/bin/rm -rf /');
答案 2 :(得分:3)
根据PHP docs,strpos()和stripos()将返回一个位置的整数, OR 一个布尔值为FALSE。
由于0(零)是一个有效且非常可预期的索引,因此应谨慎使用此函数。
大多数lib将此函数包装在一个更好的(或类)中,如果找不到该值,则返回-1。
e.g。喜欢Javascript的
String.indexOf(str)
答案 3 :(得分:2)
变量插值仅对“字符串”执行,而不是“字符串”(请注意引号)。即。
<?php
$foo = "bar";
print '$foo';
print "$foo";
?>
打印$ foobar。改变你的报价,一切都应该好。
答案 4 :(得分:-1)
为什么使用===参数?
如果它在行中的任何位置,它将是一个整数。您还要使用====
比较类型根据我的理解,你会问它“如果位置相同且类型与真实相同”,这将永远无效。