-1

我在 SQL 数据库中有大量列,我需要它们。而不是在选择查询中指定它们,我只想使用SELECT *.

查询运行良好,但我得到未定义的索引错误:

注意:未定义的索引:第 66 行 /var/www/backup/backupoverview.php 中的服务器名称

<?php
while($row = mssql_fetch_array($result)) {
    extract($row);
?>
    <tr>
        <td><?=$row["servername"]?></td>
        <td><?=$row["criticality"]?></td>
        <td><?=$row["actioned"]?></td>
    </tr>
<?php
}
?> 

我的谷歌搜索将我指向提取功能,但这似乎没有任何作用。

任何想法表示赞赏!

4

5 回答 5

2

首先,由于您正在阅读$row['fieldname'],因此您根本不必提取 $row 。

然后是实际错误:如果使用select *,您将获得所有列,但显然servername不是其中之一。这就是错误告诉你的。

由于您似乎确定存在这样一个字段(我们没有查询,所以我不得不相信您的话),请注意数组索引区分大小写,因此如果该列SERVERNAME在数据库中命名,你找不到它,因为它在数据库中有它的情况下被返回。这是指定确切列而不是指定列的一个优点*:您知道选择了哪些列,并且可以指定它们的大小写。

实际上,使用select *通常被认为是不好的做法,所以也许你可以重新考虑指定你需要的确切列。

于 2013-08-02T11:25:40.957 回答
2

注意:未定义索引:服务器名表示$row 数组中没有索引 servername

您必须先在要查询的表中定义这样一个字段

虽然extract()实际上与缺少索引无关。

于 2013-08-02T11:26:03.090 回答
1

查看通知,您可能需要仔细查看字段名称,因为它只是说没有servername索引 in $row,这表明表中没有servername字段
Tryvar_dump(array_keys($row));在循环内,并更正您的错字,或者只是检查你的tbl。

另外:默认情况下mssql_fethc_array将结果作为数字索引数组关联数组获取,因为您只在 assoc 数组之后,我建议您使用mssql_fetch_assoc,或者mssql_fetch_object,如果对象不吓到您;)
来自文档:

返回对应于获取的行的关联数组,并将内部数据指针向前移动。mssql_fetch_assoc() 等效于使用 MSSQL_ASSOC 为可选的第二个参数调用 mssql_fetch_array()。

所以要么:

while($row = mssql_fetch_assoc($result)){}
//or
while($row = mssql_fetch_array($result, MSSQL_ASSOC)){}

将导致$row作为 assoc 数组 您现在拥有的东西也可以使用,但我认为它没有意义(您不需要数字索引,因为您没有使用它们)。 虽然看到你只是在构建一个包含值的表:

while($row = mssql_fetch_array($result,MSSQL_NUM))
{
    echo vprintf('<tr>'. str_repeat('<td>%s</td>', count($row)).'</tr>', $row);
}

无论如何都这样做,但是在数组键中没有错字的风险。
注意:小心我在这里使用的单行语句,在这种情况下,语句不会太长,并且仍然非常可读,但是如果你使用太多这样的东西,同事会诅咒并建议你去改写mindfuck

于 2013-08-02T11:23:28.137 回答
1

甚至更好

<?php
echo '
<table cellpadding="0" cellspacing="0" border="0" width="600" class="myTable">
    <tr>
        <th>Servername</th>
        <th>Criticality</th>
        <th>Actioned</th>';
while($row = mysql_fetch_assoc($result))
 {
    echo '
    <tr>
        <td>'.$row['servername'].'</td>
        <td>'.$row['criticality'].'</td>
        <td>'.$row['actioned'].'</td>
    </tr>';
}

echo '
</table>';
于 2013-08-02T11:38:18.020 回答
-1

如果您查看 extract 函数的文档,您会发现它所做的是将数组的值提取到当前范围内。所以,如果你有一个数组:

array('servername' => 'localhost', 'criticality' => 1, 'actioned' => 'no);

这将创建 $servername、$criticality 和 $actioned。不是你想要的。

确保列名匹配(区分大小写!)方括号之间的内容。

于 2013-08-02T11:23:42.697 回答