我试图编写一些代码来抓取CSV文件,拉出相关的邮政编码列,然后在具有经度和纬度字段的MySql数据库中查找该邮政编码,然后将它们保存到XML文件中,以便在不同的程序中使用。
我认为这段代码都正常工作,但出于某种原因,它只输出查询的最后一个字段:
//Open the file.
$fileHandle = fopen("test.csv", "r");
$postcode = array();
while (($row = fgetcsv($fileHandle, 0, ",")) !== FALSE) {
array_push($postcode, $row[40]);
}
$postcodefil = (array_unique($postcode));
$postcodefil = str_replace(' ', '', $postcodefil);
$postcodefil = preg_replace('/\s+/', '', $postcodefil);
//print_r($postcodefil);
foreach ($postcodefil as $value) {
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT postcode, latitude, longitude FROM postcode WHERE postcode='$value' ";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$myfile = fopen("test.xml", "w") or die("Unable to open file!");
$lat = $row["latitude"];
$lng = $row["longitude"];
fwrite($myfile, $lat."testss".$lng."\n");
echo $lat;
echo $lng;
echo "<br />";
}}
} // end of foreach
$conn->close();然而,当我运行它时,它的回声是正确的
50.822398-0.139938
51.444908-1.295341
50.841951-0.842508
51.308504-0.551835
etc.... etc...但是Fwrite只输出最后一行
51.120916testss-0.599545我完全被这事搞糊涂了。如果这是我事先看过的最基本的东西,请原谅。
发布于 2018-10-03 15:44:16
问题是在每个循环中打开文件,这会覆盖以前的数据.
$myfile = fopen("test.xml", "w") or die("Unable to open file!");
while($row = $result->fetch_assoc()) {所以把打开的东西移到回路外面。
第二个问题是您根本没有编写XML。你需要做些像..。
$xml = simplexml_load_string("<coords />");
while($row = $result->fetch_assoc()) {
$newCoord = $xml->addChild("coord");
$newCoord->addChild("latitude", $row["latitude"]);
$newCoord->addChild("longitude", $row["longitude"]);
}
$xml->saveXML("test.xml");这将生成一个简单的XML文件,您需要酌情设置元素名称。
发布于 2018-10-03 15:47:25
第一件事是将连接放在foreach循环之外,而fopen放在while循环之外。
根据doc,以“w”模式打开xml文件意味着
打开仅供写入;将文件指针放在文件的开头,并将文件截断为零长度。如果文件不存在,请尝试创建它。
你需要附加模式'a‘
打开仅供写入;将文件指针放在文件的末尾。如果文件不存在,请尝试创建它。在这种模式下,fseek()没有任何效果,写总是附加在后面。
这对你有用。但是,您仍然对每个邮政编码提出db请求,我建议您收集查询所需的所有邮政编码,并使用sql 在……里面操作符向数据库发出一个db请求。
https://stackoverflow.com/questions/52630810
复制相似问题