从网站抓取的代码:
<?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行:
答案 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)。你有没有修改过你的代码?