php mysql查询不是';t在for循环中更新数据库

php mysql查询不是';t在for循环中更新数据库,php,mysql,for-loop,screen-scraping,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 b

我正在屏幕上抓取一个页面,其中包含我想在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);
$url=”http://example.com/index.jsp";
$raw=文件内容($url);
$newlines=数组(“\t”、“\n”、“\r”、“\x20\x20”、“\0”、“\x0B”);
$content=str_replace($newlines,“,$raw);
$start=strpos($content,“”);
$end=strpos($content,,$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 
                    );
    }
}
函数cleanSiteVal($siteval){ $repl=array('value=','”); $siteval=带标签($siteval); $siteval=str_replace($repl,,$siteval); $siteval=html\u entity\u decode($siteval); 返回$siteval; } foreach($rows[0]作为$row){
如果((strpos($row,sql中的变量在引号之间,请尝试以下操作

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

由于以下原因,&n b s p;whitespace.html_entity_decode没有删除它:

您可能想知道为什么trim(html_entity_decode(“”))没有将字符串减少为空字符串,这是因为“&n b s p;”实体不是ASCII代码32(由trim()剥离),而是默认ISO 8859-1编码中的ASCII代码160(0xa0)

资料来源:

以下是我所做的发现:

  • 我用doctype声明和字符集meta创建了一个完整的html页面 标签
  • 我选择将mysql_编码转换为utf-8
  • 我在有效的html段落中重复了这些查询,这表明 它们是在值的空格内的奇数字符 质疑
  • 我在cleanSiteVal函数中添加了
    返回utf8\u编码($siteval);
  • 我添加了
    $siteval=str_replace('',$siteval);
  • 所有这些步骤最终清理了来自被刮取站点的值,并触发了我循环中的查询。万岁!!!!这对我来说是一个很大的教训。我将始终为我的连接设置mysql\u编码,这将在动态生成的html代码中围绕回显值保存大量utf8\u编码。它显示了html&n b s p;WhitePA在数据中留下了ces

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

    查询是否产生错误(这会打印错误和一些德语),或者它们看起来运行但没有任何效果?提供的错误文本是什么?尝试添加
    $siteval=mysql\u real\u escape\u字符串($siteval);
    在函数cleansiteval中。这些查询没有产生任何错误,但它们也有任何影响。@Blazemonger:我不确定你的答案是什么意思。尝试回显mysql错误:$res=mysql\u query($sql)或die(mysql\u error());这可能会显示任何错误(不仅仅是sql错误)。这可能与您的mysql连接有关。你好,goodmood,我之前也尝试过您的版本,但它不起作用。这里是我尝试过的版本:
    $sql=“UPDATE some_table SET val1=”“$stat.”,val2=”“$term.”,val3=“$abr.”,WHERE(datetime_字段介于“.$sfrom.”和“.$till.”之间)和val4=“$nrfli.”“;$sql=“更新
    一些表格`SET
    val1
    ='”、
    val2
    ='”、
    val3
    ='”、
    val3
    ='”、“$abr.”、WHERE(
    datetime”字段
    介于“.$sfrom.”和“.$till.”)和
    val4
    ='“$nrfli.”";`val4是数据库中行的标识符,我仔细观察了该值是否与数据库中的值匹配,似乎匹配。简而言之,我尝试在列名周围加上反勾,但没有。是否有防止屏幕刮屏的机制?这可能是原因吗,因为我刮屏了数据,但它似乎不匹配使用数据库中的数据进行ch,虽然它看起来是相同的,例如forloop中的
    val4='some_value'
    ,并且在我的表中是
    val4='some_value'
    ,但它仍然不会触发查询。我没有主意。您希望数据库如何更新?使用$stat的5个值?还是只有一个值?您能进一步解释一下吗?还有什么错误et?使用此
    if($fliarr[$i][3]!=”
    而不是
    if($fliarr[$i][3]!=”
       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);
    }