需要一些简单的帮助来理解一些PHP5之前的代码

时间:2010-08-12 09:06:49

标签: php legacy-code deprecated

我从另一个问题转向 nstrees ,并且一直在处理该脚本。它最后一次更新是在2005年,依赖于一些已经被明显弃用的东西,如HTTP_POST_VARS,我不是很熟悉,因为我已经做了不到一年的PHP。

无论如何,我的菜鸟眼睛的编码风格看起来很奇怪,我想对这个函数的哪个部分做出第二个意见:

// returns the first node that matches the '$whereclause'.
// The WHERE clause can optionally contain ORDER BY or LIMIT clauses too.
function nstGetNodeWhere ($thandle, $whereclause) {
    $noderes['l'] = 0;
    $noderes['r'] = 0;
    $res = mysql_query("SELECT * FROM ".$thandle['table']." WHERE ".$whereclause);
    if (!$res) { // problem area 1
        _prtError();
    } else {
        if ($row = mysql_fetch_array($res)) { // problem area 2
            $noderes['l'] = $row[$thandle['lvalname']];
            $noderes['r'] = $row[$thandle['rvalname']];
        }
    }
    return $noderes;
}

在上面的代码中,我将我不太确定的地点标记为// problem area x,其他所有内容都是原始脚本。

关于PA1,只是检查查询是否成功运行?

并且PA2,NetBeans向我发出警告“可能意外分配,应该避免条件中的分配。” ...所以我立即将其从=更改为{{1}嘿,当然打破了剧本。

考虑一下,我想这只是==上的另一个错误检查,这次是为了确保实际返回了一些数据?

最后,这是一个奇怪的PHP还是我太绿了不能理解它?

谢谢老兄(tte)s!

3 个答案:

答案 0 :(得分:1)

问题区域1正是您的想法。它检查查询是否成功运行。查看mysql_query的文档(因为您使用Netbeans,您还可以在编辑器中突出显示函数名称,然后单击F2以获取内联弹出窗口)。您正在寻找“返回值”部分。在那里,它表示它将在任何错误上返回FALSE(布尔值为FALSE)。

检查

if (!$res)

与检查

相同
if ($res == false)

理想情况下,您应该检查

if ($res === false)

因为它更安全,因为PHP对变量非常放松== false,但我现在不想把它与你混淆。如果您愿意,可以先阅读strong typing

问题区域2很常见,但会在Netbeans中显示警告,是的。它正在做的是将mysql_fetch_array()中的值分配到$ row,并检查 现在是true还是false,同时还允许您在以下代码块中的$ row中使用相同的值if()。

答案 1 :(得分:0)

我假设这段代码可以加载文章,然后将它们排序为“左右”数组,以便可以以两列布局打印。也许。 :)

是的,PA1正在检查查询是否成功。 PA2只是获取实际的行。

答案 2 :(得分:0)

if (!$res) { // problem area 1 

如果mysql_query无法执行SQL查询,则返回false。这基本上是对非(!)除false以外的任何值的测试,因此如果mysql_query中存在错误并执行代码的打印错误分支,则if测试将匹配

if ($row = mysql_fetch_array($res)) { // problem area 2  

将结果集中的下一行分配给$ row;如果结果集中没有更多行,则将$ row设置为false,在这种情况下,“if test”将为false