Попытка написать Php fwrite XML-файл из запроса MySQL - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь написать некоторый код, который получает файл 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

Я совершенно запутался из-за этого.Пожалуйста, прости меня, если это что-то простое, что я посмотрел заранее и спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Прежде всего поместите соединение за пределы цикла foreach, а fopen - вне цикла while.

Вы открываете XML-файл в режиме 'w', значит, в соответствии с документом

Открыть только для записи;поместите указатель файла в начале файла и обрежьте файл до нулевой длины.Если файл не существует, попытайтесь его создать.

Вам необходим режим добавления 'a'

Открыть только для записи;поместите указатель файла в конец файла.Если файл не существует, попытайтесь создать его.В этом режиме fseek () не действует, записи всегда добавляются.

Это будет работать для вас.Но вы все равно делаете запрос в БД для каждого почтового индекса, я бы посоветовал собрать весь почтовый индекс, который вам нужен для запроса, и сделать один запрос в БД в базу данных с оператором sql IN .

0 голосов
/ 03 октября 2018

Проблема в том, что вы открываете файл в каждом цикле, это перезаписывает предыдущие данные ...

   $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-файл, вам нужно будет установить соответствующие имена элементов.

...