PHP - возникают проблемы при вставке даты из столбца даты с нулевыми значениями. Значения находятся внутри массива - PullRequest
1 голос
/ 26 апреля 2019

Я делаю программу SQL Server to MySQL, которая позволяет синхронизировать содержимое между двумя одинаковыми таблицами.Однако у меня возникли проблемы со вставкой значений даты из столбца даты, в некоторых ячейках которого установлено значение NULL.Это должно работать так, что каждое значение из столбца даты должно преобразовываться в строку с использованием функции форматирования.Поскольку я генерирую каждую строку из массива и запускаю ее через цикл, я не могу вручную выбрать строки с пустыми значениями.Вот код (он довольно длинный, поэтому я вырезал некоторые части, поэтому, пожалуйста, потерпите меня):

//SELECT FROM SQL SERVER DB
$mssql_array = array();
$ms_sql = "SELECT * FROM health";
$mssql_query = sqlsrv_query($conn_mssql, $ms_sql);

while($row = sqlsrv_fetch_array($mssql_query))
{
  //turn individual rows into array    
  $mssql_array[] = array(
  'id' => $row['id'], 
  'period' => $row["period"], //date column; has NULLs in it that prevent insert
  'BP' => $row['BP'], 
  'pulserate' => $row['pulserate'],
  'temperature' => $row['temperature'],
  'labresult' => $row['labresult'],
  'waistline' => $row['waistline'],
  'weight' => $row['weight'],
  'BMI' => $row['BMI'],
  'findings' => $row['findings'],
  'diagnosis' => $row['diagnosis'],
  'plano' => $row['plano'] ... );
}

foreach($mssql_array as $key => $value)
{
  //SELECT FROM MySQL DB
  $my_sql = $conn_mysql->prepare(" SELECT * FROM health  
  WHERE id = ? 
  AND period = ?
  AND `BP` = ?
  AND pulserate = ?
  AND temperature = ? 
  AND labresult = ? 
  AND waistline = ? 
  AND weight = ? 
  AND BMI = ? 
  AND findings = ? 
  AND diagnosis = ? 
  AND plano = ? ... ");

  $my_sql->bind_param("issssssssssssssiissssssssiiiiss", $id, $period, $BP, $pulserate, $temperature, $labresult, $waistline, $weight, $BMI, $findings, $diagnosis, $plano ... );

  $id = $value["id"]; 
  $period = $value["period"]->format('Y-m-d H:i:s'); //prevents me from converting all date values to string...

  if(is_null($period))
  {
    unset($period);
  }

  $BP = $value["BP"]; 
  $pulserate = $value["pulserate"];
  $temperature = $value["temperature"];
  $labresult = $value["labresult"];
  $waistline = $value["waistline"];
  $weight = $value["weight"];
  $BMI = $value["BMI"];
  $findings = $value["findings"];
  $diagnosis = $value["diagnosis"];
  $plano = $value["plano"]; ...

  $my_sql->execute();
  $num_rows = $my_sql->num_rows();

  $my_sql->close();

  //PREPARE INSERT INTO MySQL DB
  $sql = $conn_mysql->prepare("INSERT INTO `health` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");//31 total

  $sql->bind_param("issssssssssssssiissssssssiiiiss", $id, $period, $BP, $pulserate, $temperature, $labresult, $waistline, $weight, $BMI, $findings, $diagnosis, $plano ... );

  $id = $value["id"]; 
  $period = $value["period"]->format('Y-m-d H:i:s'); //...because it stops the process when it encounters a NULL value

  if(is_null($period))
  {
    unset($period);
  }

  $BP = $value["BP"]; 
  $pulserate = $value["pulserate"];
  $temperature = $value["temperature"];
  $labresult = $value["labresult"];
  $waistline = $value["waistline"];
  $weight = $value["weight"];
  $BMI = $value["BMI"];
  $findings = $value["findings"];
  $diagnosis = $value["diagnosis"];
  $plano = $value["plano"]; ...

    if($num_rows == 0)
      {
        $sql->execute();
      }
}

echo 'Table health from MS SQL DB and table health from MySQL DB are now synced!'."<br>";
echo "<a href='table_updater.php'>Go back to updater</a>";

Ошибка, которую он мне дает: «Неустранимая ошибка: ошибка Uncaught: вызов формата функции-члена () на null ", который в значительной степени говорит мне, что он не может использовать функцию форматирования для значений NULL, с которыми сталкивается.Однако, с помощью функции форматирования вместо этого она выдаст ошибку «Объект DateTime не может быть преобразован в строку».Есть ли способ для меня обойти это?Я не могу изменить значения базы данных, потому что она не моя.

Ответы [ 4 ]

3 голосов
/ 26 апреля 2019

Перед вызовом format():

вам нужно проверить и убедиться, что переменная является объектом DateTime.

$period = ($value["period"] instanceof DateTime) ? $value["period"]->format('Y-m-d H:i:s') : null;

3 голосов
/ 26 апреля 2019

Вы можете легко опустить пустые строки, используя запрос выбора MySQL. Попробуйте этот запрос: SELECT * FROM health, где column_name НЕ NULL;

1 голос
/ 26 апреля 2019

$ period = $ value ["period"] -> формат ('Y-m-d H: i: s');

В одной строке кода очень много ошибок. Для начала, либо используйте фабрику для перевода значения, которое представлено в PHP в виде строки или nulll, или просто продолжайте обрабатывать его как строку / null. Тогда остальные проблемы просто уйдут:

$period = $value["period"];

Но вам нужно убедиться, что вы извлекаете данные в согласованном и известном формате. Из MS-SQL вы должны CONVERT(period, 20), чтобы получить дату ISO 8601. MySQL будет автоматически анализировать это как строку и возвращает время даты в этом формате.

К сожалению, SQL-сервер несколько ограничен в обработке дат. Хотя вы можете использовать SET DATEFORMAT, это работает только для некоторых типов данных. Таким образом, если вы хотите получить большую часть логики в PHP, попытка перехватить формат (и нулевое состояние) всего, что вы напишите, будет привязана к сконфигурированной локали на вашем сервере MSSQL. Я не буду предлагать пример, потому что, если вы вырезаете и вставляете мой код, и он не работает, вы будете думать, что с кодом что-то не так, а не просто ожидать, что он отличается от того, который вы настроили.

Из головы не знаю, возвращается ли значение NULL в виде пустой переменной PHP или пустой строки расширением MSSQL. Но оба - строки нулевой длины, поэтому общее решение будет ...

$bindable=strlen($avalue) ? null : $avalue;
1 голос
/ 26 апреля 2019

Вы можете попробовать проверить, если значение is_null () , а затем сбросить его из массива.

<?php

$period = $value["period"]->format('Y-m-d H:i:s');

if( is_null($period) ){
unset($period);
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...