2

我的数据库中有一个 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;
        }
    }
}

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

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

我想我理解为什么会出现问题 - 由于 $result 在 while 循环之外声明,因此在第一次迭代/或以某种方式更改后永远不会再次设置它。

或者

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

谢谢你尽你所能的帮助!

4

4 回答 4

1

当你这样做时:

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

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

这是第一次正确:

$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>';

瞧,它应该工作......

于 2012-12-19T08:15:12.847 回答
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()返回一个整数或 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 扩展。

于 2012-12-19T02:14:17.783 回答
0

您应该重新访问PHP 语言参考

foreach循环语法是

foreach($array as $element)

或者

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

但是您似乎还有其他弱点,我担心不在 Stackoverflow 的范围内修补。例如,您自己的代码只需将}第 11 行中的一个代码向下移动几行即可。

于 2012-12-19T02:29:07.817 回答
0

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

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

代替:

$link = $query_row['Link'];

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

$link = $query_row($link);

另外,尝试去掉$query_runif 语句。它应该看起来像这样:

$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;
    }
}
于 2012-12-19T02:13:55.453 回答