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;
        }
    }
}

このコードは1回の反復で機能します。つまり、DBに格納されている最初のリンクを見つけ、それを$link一番下のforeach()ステートメントで使用して、目的の結果を出力します。ループの最初の反復後、次のようなエラーが発生します。

「mysqli_fetch_assoc()はパラメーター1がmysqlの結果であると想定しています」

問題が発生している理由を理解していると思います-$resultはwhileループの外側で宣言されているため、最初の反復後または何らかの方法で変更された後、再び設定されることはありません。

また

私はmysqli_free_result()おそらく使用する必要があります。その場合、コードのどこに配置されるかわかりません。

あなたが提供できるどんな助けにも感謝します!

4

4 に答える 4

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

そして出来上がり、それはうまくいくはずです...

于 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行目から数行下に1つ移動するだけで非常にうまく機能します。

于 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 に答える