我的数据库中有一个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()
,如果是这种情况,我不确定代码中的位置。
感谢您提供任何帮助!
答案 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行中的单个}
向下移动几行,您自己的代码就能很好地工作。