html форма с белыми полями до mysql - PullRequest
0 голосов
/ 19 апреля 2020

Я не понимаю, как правильно передать поля формы html в базу данных mysql, если одно из полей пусто.

У меня есть html:

<form name="formName" method="POST" action="" onsubmit="registra();">
  <label for="datetime1">datetime one</label>
  <input type="datetime-local" id="datetime1" name="datetime1">
  <label for="datetime2">datetime two</label>
  <input type="datetime-local" id="datetime2" name="datetime2">
  <button type="submit">Salva</button>
</form>

<script>
function registra() {
  var datetime1 = document.forms['formName']['datetime1'].value;
  datetime1 = new Date(datetime1).toISOString().slice(0, 19).replace('T', ' ');
  var datetime2 = document.forms['formName']['datetime2'].value;
  datetime2 = new Date(datetime1).toISOString().slice(0, 19).replace('T', ' ');
  jQuery.ajax({
    type: "POST",
    url: "./functions.php",
    data: {
      action: 'registraForm',
      id: <?php echo $id; ?>,
      datetime1: datetime1,
      datetime2: datetime2
    }
  }).done(function( response ) {
    alert( response );
  });
}
</script>

И это php:

<?php
/* AJAX */
if(isset($_POST['action']) && !empty($_POST['action'])) {
  $action = $_POST['action'];
  switch($action) {
    case 'registraForm' : registra_form();break;
  }
}


function registra_form() {
  $dbhost = "localhost";
  $dbuser = "user";
  $dbpass = "pass";
  $db = "db";
  $conn = new mysqli($dbhost, $dbuser, $dbpass,$db) or die("Connect failed: %s\n". $conn -> error);

  $id = $_POST['id'];
  $datetime1 = ($_POST['datetime1']?$_POST['datetime1']:NULL);
  $datetime2 = ($_POST['datetime2']?$_POST['datetime2']:NULL);

  if ( /* update mysql row */ ) {
    $sql = "UPDATE table SET datetime1='$datetime1', datetime2 = '$datetime2', WHERE id=$id";
  } else {
    $sql = "INSERT INTO table (id, datetime1, datetime2) VALUES ($id, '$datetime1', '$datetime2')";
  }
  if ($conn->query($sql) === TRUE) {
    echo 'done!';
  } else {
    echo "Error: " . $sql . "<br>" . $conn->error;
  }
  die();
  $conn -> close();
}

В базе данных и datetime1, и datetime2 задаются как тип отметки времени с нулевым значением по умолчанию.

Если и datetime1, и datetime2 имеют значение заполнено, регистрация прошла успешно. Если вместо этого одно из двух полей формы не заполнено, я получаю синтаксическую ошибку sql. Что-то вроде error: UPDATE table SET datetime1='2020-04-17 11:06:00', datetime2='' WHERE id=5 Incorrect datetime value:'' for column db.table.datetime2 at row 2

Я думаю, что это проблема $datetime2 = ($_POST['datetime2']?$_POST['datetime2']:NULL);, но я не знаю, как ее решить.

Спасибо Fosco

1 Ответ

0 голосов
/ 19 апреля 2020

Хорошо, это "ответ", а не симпатичный, в зависимости от предоставленного вами кода / проблемы.

Лично я бы не стал так кодировать, но мы не можем дать здесь уроки. Это больше демонстрация того, как go проработать что-либо без промежуточных битов.

Это пример. Тестовый код (то, что мы должны научиться писать), я использовал для проверки получения правильных SQL операторов.

<code>function test_datetime_sql()
{
    $_POST['datetime1'] = '';
    $_POST['datetime2'] = '2020-04-17 11:06:00';

    // There must be a more elegant way to do this    
    $datetime1 = $_POST['datetime1']?"'".$_POST['datetime1']."'":'NULL';
    $datetime2 = $_POST['datetime2']?"'".$_POST['datetime2']."'":'NULL';

    echo '<pre>';
    echo 'LINE: '. __LINE__. ' Module '.__CLASS__.'<br>';
    var_dump($datetime1);
    echo '
'; echo '
';
    echo 'LINE: '. __LINE__. ' Module '.__CLASS__.'<br>';
    var_dump($datetime2);
    echo '
'; $ id = 5; $ sql = "ОБНОВЛЕНИЕ таблицы SET SET datetime1 = $ datetime1, datetime2 = $ datetime2, WHERE id = $ id"; var_dump ($ sql); // Что SQL мы получаем}

Сделайте попытку, сгенерировав SQL и протестировав его.

Обратите внимание, что это изменение на троичный И оператор SQL - обратите внимание на отсутствие '' в $sql для datetime1 и datetime2, поскольку они генерируются в троичной форме.

Что здесь происходит, если это "Не Пустое значение, оно заключено в '', чтобы сделать его строкой. То же самое происходит с NULL

Я настоятельно рекомендую вам скопировать и вставить это куда-нибудь и поиграть с ним, чтобы посмотреть, что произойдет.

В исходном коде, когда вы устанавливаете $datetime1 как NULL, оно появляется в вашем SQL как $datetime1 = '', а НЕ как $datetime1 = NULL (не строка 'NULL').

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