PHP从select*中提取数组上的函数


PHP Extract function on array from a select *

我在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_assocmssql_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。不是你想要的。

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