我在SQL数据库中有大量的列,我需要它们。我只想使用SELECT *
,而不是在选择查询中指定它们。
查询运行良好,但我得到了未定义的索引错误:
注意:中未定义的索引:servername/第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
}
?>
我的谷歌搜索将我指向了提取功能,但这似乎没有任何作用。
任何想法都值得赞赏!
首先,由于您正在阅读$row['fieldname']
,因此根本不必提取$row。
然后是实际的错误:如果使用select *
,您将获得所有列,但显然servername
不是其中之一。这就是错误告诉你的。
由于您似乎确信存在这样一个字段(我们没有查询,所以我不得不相信您的话),请注意,数组索引是区分大小写的,因此如果列在数据库中命名为SERVERNAME
,则无法找到它,因为它是以数据库中的大小写返回的。这是指定精确列而不是*
的一个优点:您知道选择了哪些列,并且可以指定它们的大小写。
实际上,使用select *
通常被认为是一种不好的做法,所以也许您可以重新考虑指定所需的确切列。
注意:未定义的索引:servername表示$row数组中没有索引servername
。
您必须在查询第一个的表中定义这样一个字段
而extract()
实际上与缺失索引无关。
更好的
<?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>';
查看通知,您可能需要仔细查看字段名称,因为它所说的只是$row
中没有servername
索引,这表明表中没有servername
字段
在循环中尝试var_dump(array_keys($row));
,纠正你的拼写错误,或者只检查你的tbl。
此外:默认情况下,mssql_fethc_array
以数字索引数组和关联数组的形式获取结果,因为您只在assoc数组之后,如果对象不会吓到您,我建议使用mssql_fetch_assoc
或mssql_fetch_object
;)
来自文档:
返回与提取的行相对应的关联数组,并向前移动内部数据指针。mssql_fetch_assoc()等效于使用mssql_assoc为可选的第二个参数调用mssql_feach_array()。
所以要么:
while($row = mssql_fetch_assoc($result)){}
//or
while($row = mssql_fetch_array($result, MSSQL_ASSOC)){}
将导致$row
仅为关联数组
您现在所拥有的也可以,但我认为这毫无意义(您不需要数字索引,因为您没有使用它们)
尽管您只是在构建一个包含值的表:
while($row = mssql_fetch_array($result,MSSQL_NUM))
{
echo vprintf('<tr>'. str_repeat('<td>%s</td>', count($row)).'</tr>', $row);
}
无论如何都是这样,但数组键中没有拼写错误的风险
注意:要小心像我在这里使用的一句话,在这种情况下,语句不会太长,而且仍然很可读,但如果你使用了太多这样的东西,同事会诅咒并建议你去写mindbuck,而不是
如果您查看extract函数的文档,您会发现它所做的是将数组的值提取到当前范围中。所以,如果你有一个数组:
数组('servername'=>'localhost','criticality'=>1,'actioned'=>'no);
这将创建$servername、$criticality和$actioned。不是你想要的。
请确保列名与方括号之间的列名相匹配(区分大小写!)。