php mysql查询没有在for循环中更新数据库

时间:2012-10-26 16:18:03

标签: php mysql for-loop screen-scraping

我正在使用我想在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循环中echo的复制查询正在phpmyadmin中运行。为什么不在我的for循环中?

2 个答案:

答案 0 :(得分:2)

事实证明这与&amp; n b s p;空白。由于这个解释,html_entity_decode没有摆脱它:

  

你可能想知道为什么修剪(html_entity_decode(''));不会将字符串缩减为空字符串,这是因为'&amp; n b s p;'实体不是ASCII代码32(由trim()剥离),而是默认ISO 8859-1编码中的ASCII代码160(0xa0)。

来源:php docs htmlentitydecode

以下是我要做的事情:

  1. 我mada一个带有doctype声明和charset meta的完整html页面 标签
  2. 我选择了mysql_encoding来utf-8
  3. 我在有效的html段落中回应了查询。这向我展示了这一点 它们是值的空间内的奇数字符 查询
  4. 我在cleanSiteVal函数
  5. 中添加了return utf8_encode($siteval);
  6. 我添加了$siteval = str_replace('&nbsp;', ' ', $siteval);
  7. 所有这些步骤最终清理了来自已删除站点的值,并在我的循环中获取了查询。欢呼!!!!这对我来说是一个很大的教训。我将始终为我的连接设置mysql_encoding,这会在动态生成的html代码中围绕回显值保存大量的utf8_encode。它显示了html&amp; n b s p;数据中留有空格。

    所以最后这里是完整的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);
    }
    

答案 1 :(得分:0)

你的sql中的变量在引号之间,试试这个

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