PHP mysqli_fetch_assoc将数据存储在数组中

时间:2012-12-19 01:59:36

标签: php mysql arrays simple-html-dom

我的数据库中有一个url(链接)列表,可以将数据回显到页面,但不是输出它,我需要将该信息(我正在考虑一个数组)存储到变量中以执行php任务使用提供的链接。我还没弄明白怎么做。

代码已更新我删除了使用即将弃用的mysql_ *函数的任何引用,并选择了mysqli版本。

继承我的代码

$query = "SELECT `Link` FROM `Table1` WHERE `Image` ='' AND `Source`='blah'";

if ($result = mysqli_query($dblink, $query)) {

while ($row = mysqli_fetch_assoc($result)) {  
    $link = $row['Link'];
    // echo ''.$link.'<br>';
        $html = file_get_html($link);
        foreach ($html->find('div.article') as $e) {
            $result = $e->find('img', 0);
            $imgsrc = $result->src . '<br>';
            echo $imgsrc;
        }
    }
}

此代码正在进行一次迭代:它将找到存储在数据库中的第一个链接,在底部$link语句中使用foreach()并输出所需的结果。在循环的第一次迭代之后,出现错误:

“mysqli_fetch_assoc()期望参数1是mysql结果”

我想我明白为什么会出现这个问题 - 因为$ result是在while循环之外声明的,所以在第一次迭代后它永远不会再次设置/或以某种方式改变。

我应该可能使用mysqli_free_result(),如果是这种情况,我不确定代码中的位置。

感谢您提供任何帮助!

4 个答案:

答案 0 :(得分:1)

您的代码段中充满了潜在错误:

1)不检查查询是否成功

$query_run = mysql_query($query)

您执行查询,但是从不通过验证$query_run是否是实际资源而不是FALSE来检查您的查询是否成功。

2)验证返回的行

您对查询返回的行数的验证是无用的:

if (mysql_num_rows($query_run)==NULL) { 
    echo 'No results found.';
}

这是永远不会的,因为mysql_num_rows()返回一个inte或FALSE,永远不会为NULL。

3)使用可能无效值的变量

使用

while ($query_row = mysql_fetch_assoc($query_run)) { ... }

存在风险,因为您从不检查$query_run是否是mysql_fetch_assoc()所需的实际资源。

4)对while循环的误解

以下几行也可能是错误的:

while ($query_row = mysql_fetch_assoc($query_run)) {
    $link = $query_row['Link'];
    // echo ''.$link.'<br>';

}
$html = file_get_html($link);

迭代查询返回的所有行。 while循环退出后,$ link仅包含最后一行的值,因为单个变量不能包含多行的值。

<强>结论

我强烈建议您改进错误检查并提高代码的整体质量。另外考虑使用mysqli或PDO之类的新扩展,不推荐使用mysql扩展。

答案 1 :(得分:1)

执行此操作时:

$result = mysqli_query($dblink, $query);

这些函数返回您存储在$result中的链接标识符。我们需要传递给提取函数的这个标识符,以便能够从中获取结果。在完成所需的所有结果后,不应更改它。

这是第一次:

$row = mysqli_fetch_assoc($result)

但是,在foreach中,您用其他信息覆盖该变量:

$result = $e->find('img', 0);

因此,当下一次迭代出现时,它不再是有效的结果标识符,因此MySQL不知道如何处理它。

修复实际上相当简单,您需要更改您在foreach中使用的变量的名称:

$result = $e->find('img', 0);
$imgsrc = $result->src . '<br>';

变为:

$found= $e->find('img', 0);
$imgsrc = $found->src . '<br>';

瞧,它应该有用......

答案 2 :(得分:0)

如果要将所有链接添加到数组,请尝试:

$link[] = $query_row['Link'];

而不是:

$link = $query_row['Link'];

你很接近,但你没有使用方括号,你使用括号,如下所示:

$link = $query_row($link);

另外,尝试从if语句中取出$query_run。看起来应该是这样的:

$query = "SELECT `Link` FROM `Table1` WHERE `Value1` ='' AND `Source`='blah'";
$query_run = mysql_query($query);
if ($query_run) {
    echo 'Query Success!<br><br>';
    if (mysql_num_rows($query_run) == NULL) {
        echo 'No results found.';
    }
    while ($query_row = mysql_fetch_assoc($query_run)) {
        $link[] = $query_row['Link'];
        // echo ''.$link.'<br>';

    }
    $html = file_get_html($link);
    foreach ($html->find('div.article') as $e) {
        $result = $e->find('img', 0);
        $imgsrc = $result->src . '<br>';
        echo $imgsrc;
    }
}

答案 3 :(得分:0)

您应该重新访问PHP Language Reference

foreach循环语法是

foreach($array as $element)

foreach($array as $key=>$value)

但是您似乎还有其他弱点,我担心这些弱点不在Stackoverflow的范围内进行修复。例如,只需将第11行中的单个}向下移动几行,您自己的代码就能很好地工作。