【问题标题】:html form with white fields to mysql带有白色字段的html表单到mysql
【发布时间】:2020-04-19 17:07:31
【问题描述】:

如果其中一个字段为空,我不明白将 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 都设置为时间戳类型,默认为 null。

如果 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);的问题,但我不知道如何解决。

谢谢 福斯科

【问题讨论】:

  • 您正在尝试使用三元运算符,但没有以正确的方式使用它。查阅手册php.net/manual/en/language.operators.comparison.php
  • 嗯,错误消息告诉了所有人......它清楚地表明您没有为您的日期时间字段提供正确的值。显然 NULL 是无效的,因此是错误的。那么你的表中 datetime1 和 datetime2 的架构设置是什么?
  • 对不起@TimBrownlaw,我编辑了这个问题。 datetime1 和 datetime2 都设置为时间戳类型,默认为 null。
  • @FunkFortyNiner 我刚看到你看到的……有时需要一段时间……
  • 只是想知道当您直接在 phpmyadmin 中尝试以下操作或您使用的任何内容时得到了什么结果... 1. SET datetime1='2020-04-17 11:06:00', datetime2 ='NULL' WHERE id=5 和 2。SET datetime1='2020-04-17 11:06:00', datetime2=NULL WHERE id=5。 1. 引号中有 NULL 而 2 没有。您可以填写其余的 SQL 语句以使其正确。

标签: php html mysql sql


【解决方案1】:

好的,根据您提供的代码/问题,这是“一个答案”,而不是一个漂亮的答案。

我个人不会这样编码,但我们不能在这里提供教程。 这更像是一个关于如何解决问题的演示,而不需要所有的中间位。

这是一个例子。测试代码(我们应该学会写的东西),我用来测试获取正确的 SQL 语句。

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 '</pre>';

    echo '<pre>';
    echo 'LINE: '. __LINE__. ' Module '.__CLASS__.'<br>';
    var_dump($datetime2);
    echo '</pre>';

    $id = 5;

    $sql = "UPDATE table SET 
                datetime1 = $datetime1,
                datetime2 = $datetime2, 
                    WHERE id=$id";

    var_dump($sql); // What SQL do we get

}

通过生成 SQL 并对其进行测试来尝试一下。

注意它对三元和 SQL 语句的更改 - 请注意 datetime1 和 datetime2 在 $sql 中缺少 '',因为它们是在三元中生成的。

这里发生的情况是,如果它是一个“非空”值,它会被包裹在 '' 中以使其成为一个字符串。 NULL 也一样

我强烈建议您将其复制并粘贴到某处,然后试一试看看会发生什么。

在您的原始代码中,当您将 $datetime1 设置为 NULL 时,它在您的 SQL 中显示为 $datetime1 = '' 而不是 $datetime1 = NULL(不是字符串 'NULL' )。

【讨论】:

  • 感谢 TimBrownlaw,这行得通。我可以要求您提供一个链接,我可以在其中了解编写此代码的正确方法吗?我想以最好的方式写出来。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多