0

我从另一个问题转向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 给了我一个警告“可能的意外分配,应避免在条件下分配”。...所以我立即将其从 更改===当然打破了脚本,呵呵。

想一想,我猜这只是另一个错误检查$res,这次是为了确保确实返回了一些数据?

最后,这是奇怪的 PHP 还是我太幼稚而无法理解它?

谢谢老兄(tte)!

4

3 回答 3

1

问题领域 1 正是您认为的那样。它检查查询是否成功运行。查看mysql_query的文档(由于您使用 Netbeans,您还可以在编辑器中突出显示函数名称并按 F2 以获取内联弹出窗口)。您正在寻找“返回值”部分。在那里它说它会在任何错误时返回 FALSE(布尔值 FALSE)。

检查

if (!$res)

与检查相同

if ($res == false)

理想情况下,您应该检查

if ($res === false)

因为它更安全,因为 PHP 对变量 == false 非常放松,但我现在不想让你混淆。如果您愿意,可以从阅读强类型开始。

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

于 2010-08-12T09:21:17.013 回答
0

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

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

于 2010-08-12T09:10:56.693 回答
0
if (!$res) { // problem area 1 

如果 mysql_query 未能执行 SQL 查询,则返回 false。这基本上是一个测试 not (!) 除 false 之外的任何值,因此如果 mysql_query 中有错误,if 测试将匹配并执行代码的打印错误分支

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

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

于 2010-08-12T09:13:27.407 回答