从php数组中插入表中的错误值

时间:2014-07-22 09:13:28

标签: php mysql mysqli

从网站抓取的代码:

<?php
require_once("db.php");
$url = 'http://www.indianrail.gov.in/mail_express_trn_list.html';
$ch = curl_init($url);

set_time_limit(600);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
//echo $result;
error_reporting(E_ERROR | E_PARSE);
$dom    = new DOMDocument('1.0', 'UTF-8');  
$dom->loadHTML($result);
if($dom)
{
        $xpath = new DOMXPath($dom);


        $q = '///*[contains(concat(" ", normalize-space(@class), " "), " table_border ")]/tr';


        $nodes = $xpath->query($q);
        foreach($nodes as $tr){ // DOMNodesList implements traversable 
            echo "<br>";
            $tds = $tr->childNodes;
            $i = 0;
            foreach($tds as $td){
                $arr[$i]=$td->nodeValue;
                $i++;
            }
            var_dump($arr);
            //echo"<br><=====><br>";
            //echo ""
            mysqli_query($con,"INSERT INTO `irl`.`trains` (`TrainNo`, `TrainName`, `Origin`, `DepartureTime`, `Destination`, `ArrivalTime`) 
                                VALUES ('$arr[0]', '$arr[1]', '$arr[2]', '$arr[3]', '$arr[4]', '$arr[5]');") or die(mysqli_error($con));
        }

}
else
echo "invalid DOMDocument <br>";

这会在数据库的第一个位置(TrainNo。)中插入'0',即使arr [0]包含正确的值(我检查了var_dump($ arr)),发生了什么? arr []在每次迭代中填充正确的值。database field is int with size 8

将字段更改为varchar会修复它,但如果datatyoe出现问题,为什么第一行(列号2696)会正确插入

示例:

arr[0]=> 09705
arr[1]=>JP DEE AC EXP 
arr[2]=>JAIPUR 
arr[3]=>07:55
arr[4]=>DELHI S ROHILLA    
arr[5]=>13:20

忽略第一行,它包含表头,因此可以理解它包含0:0表示时间,0表示列车编号。但是下面的行应该没问题,在突出显示的行中第一个位置应该已经9705,但它保持0: 编辑:为方便起见,包括截图:
循环中$ arr的var_dump的截图,然后是phpmyadmin中的db行:
var_dump($arr)

screenie of db rows

3 个答案:

答案 0 :(得分:0)

$arr[0]变量中,从屏幕截图中,整数值09705前面有一个空格。如果它是数据库中的整数类型,请尝试intval($arr[0])

如果要保留前导0,则必须将此类型的类型更改为VARCHAR,并插入trim($arr[0])以删除空格字符。

答案 1 :(得分:0)

在插入db。

之前尝试trim($arr[0]);

答案 2 :(得分:0)

删除查询中$ arr [0]周围的引号?并在您的代码中执行此操作:

if ($i > 0) {
$arr[$i]=$td->nodeValue;
}
else {
 $arr[$i]=intval($td->nodeValue);
}

因为 nodeValue 始终为 String 类型。

有些奇怪,你的第一个插入转换为字符串(6),其他插入转换为字符串(8)。你有没有修改过你的代码?