将带有白色字段的html表单转换为mysql



我不明白在其中一个字段为空的情况下,将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: %sn". $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);,但我不知道如何解决它。

谢谢Fosco

好吧,这是一个"答案",而不是一个漂亮的答案,基于您提供的代码/问题。

就我个人而言,我不会用这种方式编写代码,但我们不能在这里提供教程。这更多的是一个关于如何在没有所有中间环节的情况下解决问题的演示。

这就是一个例子。测试代码(我们应该学会写的东西(,我曾经测试获得正确的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并测试它来尝试一下

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

这里发生的情况是,如果它是一个"Not Empty"值,它会被包裹在"中,使其成为字符串。NULL 也是如此

我强烈建议你把它复制粘贴到某个地方,然后玩它看看会发生什么。

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

最新更新