1

mysql データベースに書き込みたいデータを含むページをスクリーン スクレイピングしています。

$url = "http://example.com/index.jsp";

$raw = file_get_contents($url);

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");

$content = str_replace($newlines, "", $raw);

$start = strpos($content,'<table border="0" cellspacing="0" cellpadding="0" width="100%">"');

$end = strpos($content,'</table>',$start) + 8;

$table = substr($content,$start,$end-$start);

データ処理はうまく機能し、すべての html タグ、空白、および などの html 特殊文字がデータから削除されました。処理ページにエコーされると、値は正常に見えます。

function cleanSiteVal($siteval){
    $repl = array('value=', '"');
    $siteval = strip_tags($siteval);
    $siteval = str_replace($repl, '', $siteval);
    $siteval = html_entity_decode($siteval);

    return $siteval;
}

foreach ($rows[0] as $row){

    if ((strpos($row,'<td align')==true)){
                //echo $row;
                preg_match_all( '@value="([^"]*)"@', $row, $cells ) ;             
        $fln = cleanSiteVal($cells[0][0]);
        $flf = cleanSiteVal($cells[0][1]);
        $sch = cleanSiteVal($cells[0][2]);
        $est = cleanSiteVal($cells[0][3]);
        $trm = cleanSiteVal($cells[0][4]);
        $sts = cleanSiteVal($cells[0][5]);
        echo 'flnr: '.$fln.', from: '.$flf.', scheduled: '.$sch.', estimated: '.$est.', terminal: '.$trm.', status: '.$sts.'<br />';


        $fliarr[] = array(
                    0 => $fln,
                    1 => $flf,
                    2 => $sch,
                    3 => $est,
                    4 => $trm,
                    5 => $sts 
                    );
    }
}

この処理されたデータから作成しているクエリを「エコー」し、phpmyadmin 内で実行されたこのクエリは正常に動作していますが、for ループ内で実行しているクエリは正常に動作していません。

for ($i = 0; $i < count($fliarr); $i++) {

    $nrfli = $fliarr[$i][0];

    $stat = $fliarr[$i][5];
    $term = $fliarr[$i][4];
    if ($fliarr[$i][3]!='' || !empty($fliarr[$i][3])) { $abr = $today.' '.$fliarr[$i][3].':00'; } else { $abr = $today.' '.$fliarr[$i][2].':00'; }

    //echo 'estimated/sched. time: '.$abr.', flugnr: '.$fliarr[$i][0].', status: '.$stat.'<br />';

    $sql = "UPDATE `some_table` SET `val1`='$stat', `val2`='$term', `val3`='$abr' WHERE (`datetime_field` BETWEEN '$sfrom' AND '$till') AND `val4`='$nrfli'";
    echo $sql.'<br />';
    $res = mysql_query($sql);

    if(!$res) {
        echo mysql_error().' Fehler bei der Update Abfrage';
    } else {
        //echo 'Ok, Update Buchungen'.$nrfli.'<br />';
    }
}

このクエリを for ループで機能させるにはどうすればよいですか? これは悪い習慣であり、PDOレイヤーを使用してクエリを準備しようとしましたが、それもうまくいきませんでした。

ここでも、for ループのエコーからコピーされたクエリが phpmyadmin で機能しています。なぜ私のforループではないのですか?

4

2 に答える 2

2

& nbsp ; の問題であることが判明しました。空白。html_entity_decode は、この説明のためにそれを取り除きませんでした:

なぜ trim(html_entity_decode(' ')); なのか不思議に思うかもしれません。文字列を空の文字列に減らしません。これは、'& nbsp ;' エンティティは ASCII コード 32 (trim() によって除去される) ではなく、デフォルトの ISO 8859-1 エンコーディングの ASCII コード 160 (0xa0) です。

ソース: php ドキュメント htmlentitydecode

これが私が見つけたものです:

  1. doctype 宣言と charset メタ タグを含む完全な html ページを作成しました。
  2. mysql_encoding を utf-8 に選択しました
  3. 有効な html 段落でクエリをエコーし​​ましたこれにより、クエリの値のスペース内に奇妙な文字があることがわかりました
  4. return utf8_encode($siteval);cleanSiteVal 関数に追加しました
  5. 追加した$siteval = str_replace('&nbsp;', ' ', $siteval);

これらのすべてのステップは、スクレイピングされたサイトからの値を最終的にクリーンアップし、ループ内のクエリを起動しました。万歳!!!! これは私にとって大きな教訓でした。私は常に接続に mysql_encoding を設定します。これにより、動的に生成された html コードでエコーされた値の周りに多くの utf8_encode が保存されます。そして、それは html & nbsp ; を示しています。データに残された空白。

最後に、完全な cleanSiteVal() 関数を次に示します。

   function cleanSiteVal($siteval){
    $repl = array('value=', '"', '&nbsp;');
    $siteval = strip_tags($siteval);
    $siteval = str_replace($repl, '', $siteval);
    $siteval = html_entity_decode($siteval);
    $siteval = str_replace('&auml;', 'ä', $siteval);
    $siteval = mysql_real_escape_string($siteval);
    return utf8_encode($siteval);
}
于 2012-10-27T12:07:04.137 に答える
0

SQLの変数は引用符で囲まれています。これを試してください

   $sql = "UPDATE some_table SET val1='".$stat."', val2='".$term."', val3='".$abr."' WHERE (`datetime_field` BETWEEN '".$sfrom."' AND '".$till."') AND val4='".$nrfli."'";
于 2012-10-26T21:39:37.447 に答える