Php sql更新更改列之后的行中的每一列

Php sql更新更改列之后的行中的每一列,php,mysqli,Php,Mysqli,我正在使用更新查询对数据库进行更改。我对行中特定单元格所做的更新将插入到数据库中。但是现在发生的是,在该单元格之后的任何空白日期空间都被输入为0000-00-00 例如,当我更新最终审核日期时,这是我应该得到的 Before Update Date Received Final Review Date Date Delivered Date Accepted 2015-03-03 After Update Date Received Final Re

我正在使用更新查询对数据库进行更改。我对行中特定单元格所做的更新将插入到数据库中。但是现在发生的是,在该单元格之后的任何空白日期空间都被输入为0000-00-00

例如,当我更新最终审核日期时,这是我应该得到的

Before Update
Date Received   Final Review Date       Date Delivered         Date Accepted  
2015-03-03  

After Update
Date Received   Final Review Date       Date Delivered         Date Accepted  
2015-03-03        2015-08-05

Instead I get this:

Date Received   Final Review Date       Date Delivered         Date Accepted  
2015-03-03        2015-08-05              0000-00-00              0000-00-00
我已经尝试过解决这个问题,但我对mysqli/php还相当陌生,所以我知道我可能缺少一些简单的东西。如有任何帮助,我们将不胜感激

<?php
$servername = "localhost";
$username = "xxx";
$password = "xxx";
$dbname = "oldga740_SeniorProject";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
}

if (isset($_POST['update'])){
$UpdateQuery = "UPDATE Projects SET Project='$_POST[project]', Client='$_POST[client]', LastName='$_POST[lastname]', DateReceived='$_POST[datereceived]', FinalReviewDate='$_POST[finalreviewdate]', DateDelivered='$_POST[datedelivered]', DateAccepted='$_POST[dateaccepted]' WHERE Project='$_POST[hidden]'";
mysqli_query($conn, $UpdateQuery);
};

$sql = "SELECT * FROM Projects";
$result = $conn->query($sql);



echo "<table>

<tr>
<th>Project</th>
<th>Client</th>
<th>Last Name</th>
<th>Date Received</th>
<th>Final Review Date</th>
<th>Date Delivered</th>
<th>Date Accepted</th>
</tr>";

while($record = mysqli_fetch_array($result))
{
if ($result->num_rows > 0){

echo "<form action='mynewform.php' method='post'>";
echo "<tr>"; 
echo "<td>" . "<input type='text' name='project' value='" . $record['Project'] . "' /></td>";
echo "<td>" . "<input type='text' name='client' value='" . $record['Client'] . "'/></td>";
echo "<td>" . "<input type='text' name='lastname' value='" . $record['LastName'] . "' /></td>";
echo "<td>" . "<input type='text' name='datereceived' value='" . $record['DateReceived'] . "' /></td>";
echo "<td>" . "<input type='text' name='finalreviewdate' value='" . $record['FinalReviewDate'] . "' /></td>";
echo "<td>" . "<input type='text' name='datedelivered' value='" . $record['DateDelivered'] . "' /></td>";
echo "<td>" . "<input type='text' name='dateaccepted' value='" . $record['DateAccepted'] . "' /></td>";
echo "<td>" . "<input type='hidden' name='hidden' value='" . $record['Project'] . "' /></td>";
echo "<td>" . "<input type='submit' name='update' value='update' /></td>";
echo "<td>" . "<input type='submit' name='delete' value='delete' /></td>";
echo "</tr>";
echo "</form>";
}
}
echo "</table>";

?>



<?php
    $conn->close();
?>



</body>

</html>

如果没有将任何数据输入到datatime字段中,它将默认为0000-00-00

如果要更改默认设置,可以在“表格”设置中进行更改

或者,您可以通过执行标准验证检查来确保数据始终进入数据库

要回答您的问题,请检查表和字段,检查它们的类型。我相信空白的不是datetime,默认设置为0000-00-00的不是datetime


只需检查并确保它们都在相同的设置上。

这是代码中的一个小片段,但负责输入数据。如果日期字段为空,则它们将获得一个赋值
“”(空字符串)
,这将有望防止它们被更新为
0000-00-00

if( isset( $_POST['update'] ) ){

    /* For convenience, shorthand object notation for $_POST */
    $pd=(object)$_POST;

    /* Assign each parameter as a variable - using false or null as appropriate. There is some rudimentary filtering at least */
    $project            = isset( $pd->project ) && !empty( $pd->project ) ? strip_tags( filter_input( INPUT_POST, 'project', FILTER_SANITIZE_STRING ) ) : false;
    $client             = isset( $pd->client ) && !empty( $pd->client ) ? strip_tags( filter_input( INPUT_POST, 'client', FILTER_SANITIZE_STRING ) ) : false;
    $lastname           = isset( $pd->lastname ) && !empty( $pd->lastname ) ? strip_tags( filter_input( INPUT_POST, 'lastname', FILTER_SANITIZE_STRING ) ) : false;
    $datereceived       = isset( $pd->datereceived ) && !empty( $pd->datereceived ) ? strip_tags( filter_input( INPUT_POST, 'datereceived', FILTER_SANITIZE_STRING ) ) : false;
    $finalreviewdate    = isset( $pd->finalreviewdate ) && !empty( $pd->finalreviewdate ) ? strip_tags( filter_input( INPUT_POST, 'finalreviewdate', FILTER_SANITIZE_STRING ) ) : '';
    $datedelivered      = isset( $pd->datedelivered ) && !empty( $pd->datedelivered ) ? strip_tags( filter_input( INPUT_POST, 'datedelivered', FILTER_SANITIZE_STRING ) ) : '';
    $dateaccepted       = isset( $pd->dateaccepted ) && !empty( $pd->dateaccepted ) ? strip_tags( filter_input( INPUT_POST, 'dateaccepted', FILTER_SANITIZE_STRING ) ) : '';
    $hidden             = isset( $pd->hidden ) && !empty( $pd->hidden ) ? strip_tags( filter_input( INPUT_POST, 'hidden', FILTER_SANITIZE_STRING ) ) : false;

    /* The sql MUST have these to be processed */
    if( $project && $client && $hidden && $lastname && $datereceived ){

        /* The various date fields that were being updated with 0000-00-00 have a default value of empty string in the above vars */

        /* use the defined variables */
        $sql = "update `projects` set 
                `project`='{$project}', `client`='{$client}', `lastname`='{$lastname}', `datereceived`='{$datereceived}',
                `finalreviewdate`='{$finalreviewdate}', `datedelivered`='{$datedelivered}', `dateaccepted`='{$dateaccepted}' 
                where `project`='{$hidden}';";

        /* run the query */
        mysqli_query( $conn, $sql );
    }
};

这可能是因为在创建表时,您将列类型指定为DATE,并将值作为空字符串插入到没有值的列中。因此,在更新值时,其他列的值为0000-00-00。日期列不能将空字符串作为默认值。可以根据数据类型检查默认值

您可以做的最好的事情是将列更改为默认值为NULL,并且在第一次向表中插入值时,为没有任何值的列指定值为NULL。所以在更新时,这些列的值不会为0000-00-00,它们的值将为NULL

例如,表名称为<强>测试< /强>,列名为“强> DATE1,<强> >De2,<强> DATE3和<强> DATE4

CREATE TABLE test (date1 DATE DEFAULT NULL, date2 DATE DEFAULT NULL, date3 DATE DEFAULT NULL, date4 DATE DEFAULT NULL) 创建表测试(date1日期默认为空,date2日期默认为空,date3日期默认为空,date4日期默认为空) 您还可以使用下面的查询修改现有列

ALTER TABLE test MODIFY COLUMN date1 DATE DEFAULT NULL ALTER TABLE test修改列date1 DATE默认值为空 当第一次插入值时,当第一列只有值时,像这样插入

INSERT INTO test VALUES ('2015-12-07', NULL, NULL, NULL) 插入测试值('2015-12-07',空,空,空) 所以,稍后当您更新任何其他列时,只有该值将被更新,而其他列将不会将该值作为0000-00-00。它们的值为NULL


我对此进行了测试,它对我有效。

更改保存日期的字段的数据类型。然后,当您在更新时保留空字段时,如果您的数据库字段也为空,则它将分配给“0000-00-00”,否则它将保持不变。 现在更改数据库数据类型 ->顶部的oto“结构”选项卡 ->找到需要更改数据类型的行,然后单击该字段的更改操作。
->从下拉列表中选择数据类型。

问题:

我对行中特定单元格所做的更新将插入到数据库中。但是现在发生的是,在该单元格之后的任何空白日期空间都被输入为0000-00-00

解决方案:

从你的评论来看


数据库已将这些列设置为默认值
NULL
。唯一没有的是
DateReceived

我假设已经设置了
项目
客户
姓氏
日期接收
。因此,解决方案是在用户未指定任何要更新的数据时插入
NULL
值,如下所示:

// your code

if (isset($_POST['update'])){
    $project = trim($_POST['project']);
    $client = trim($_POST['client']);
    $lastname = trim($_POST['lastname']);
    $datereceived = $_POST['datereceived'];

    $UpdateQuery = "UPDATE Projects SET Project='{$project}', Client='{$client}', LastName='{$lastname}', DateReceived='{$datereceived}'";

    if(empty($_POST['finalreviewdate'])){
        $UpdateQuery .= ", FinalReviewDate = NULL";
    }else{
        $UpdateQuery .= ", FinalReviewDate = '{$_POST['finalreviewdate']}'";
    }

    if(empty($_POST['datedelivered'])){
        $UpdateQuery .= ", DateDelivered = NULL";
    }else{
        $UpdateQuery .= ", DateDelivered = '{$_POST['datedelivered']}'";
    }

    if(empty($_POST['dateaccepted'])){
        $UpdateQuery .= ", DateAccepted = NULL";
    }else{
        $UpdateQuery .= ", DateAccepted = '{$_POST['dateaccepted']}'";
    }

    $UpdateQuery .= " WHERE Project='{$_POST['hidden']}'";

    mysqli_query($conn, $UpdateQuery);
};

// your code
以下是完整的代码:(
已测试


数据库字段都设置为日期字段,而不是日期时间字段。我对插入查询进行了验证,如果某些内容的格式不正确,就会出错。我还没有向这个表中添加任何内容,因为我更专注于首先让它工作。我更新了我的代码以尝试您的建议,但我在第68行收到了以下错误:未定义变量:Project。有什么想法吗?数据库已经将这些列设置为默认值NULL。唯一没有的是datereceived列。@在第一次向行插入值时,将没有值的列的值作为NULL插入。然后更新时不需要0000-00-00。初始条目是通过一个只有前四个字段的表单进行的,即Project、Client、Date Received和Last Name。您是否建议我在插入表单中添加额外的列,但将它们的值设置为NULL?是的,但您可以只在插入查询中添加列,而无需在表单中添加列。在向数据库表中插入值时,若只有这些字段的值,则项目、客户、姓氏、接收日期,则在插入查询中,连同这些列的插入值一起,还将插入列“最终审核日期”、“交付日期”、“接受日期”的值为空。因此,下次更新任何其他列时,它们将不会更新为0000-00-00。请再试一次。其他字段的值正在表单中设置。如果没有通过表单插入其他日期值,如何将其设置为NULL?只需将它们添加到INSERT查询中,就会返回一个结果“无法输入记录。$u POST[datedelivered]和$u POST[dateaccepted]的值是多少?”?在数据库中,这些列默认设置为NULL。请尝试在sql脚本中不包括这两个列。我已经这样做了,但插入操作返回一个错误,表示无法添加记录。这与表单的设置有关。其他列的初始值是通过表单输入的。@Tony请参阅我的answ
<?php
$servername = "localhost";
$username = "xxx";
$password = "xxx";
$dbname = "oldga740_SeniorProject";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
}

if (isset($_POST['update'])){
    $project = trim($_POST['project']);
    $client = trim($_POST['client']);
    $lastname = trim($_POST['lastname']);
    $datereceived = $_POST['datereceived'];

    $UpdateQuery = "UPDATE Projects SET Project='{$project}', Client='{$client}', LastName='{$lastname}', DateReceived='{$datereceived}'";

    if(empty($_POST['finalreviewdate'])){
        $UpdateQuery .= ", FinalReviewDate = NULL";
    }else{
        $UpdateQuery .= ", FinalReviewDate = '{$_POST['finalreviewdate']}'";
    }

    if(empty($_POST['datedelivered'])){
        $UpdateQuery .= ", DateDelivered = NULL";
    }else{
        $UpdateQuery .= ", DateDelivered = '{$_POST['datedelivered']}'";
    }

    if(empty($_POST['dateaccepted'])){
        $UpdateQuery .= ", DateAccepted = NULL";
    }else{
        $UpdateQuery .= ", DateAccepted = '{$_POST['dateaccepted']}'";
    }

    $UpdateQuery .= " WHERE Project='{$_POST['hidden']}'";

    mysqli_query($conn, $UpdateQuery);
};

$sql = "SELECT * FROM Projects";
$result = $conn->query($sql);



echo "<table>

<tr>
<th>Project</th>
<th>Client</th>
<th>Last Name</th>
<th>Date Received</th>
<th>Final Review Date</th>
<th>Date Delivered</th>
<th>Date Accepted</th>
</tr>";

while($record = mysqli_fetch_array($result))
{
if ($result->num_rows > 0){

echo "<form action='process.php' method='post'>";
echo "<tr>"; 
echo "<td>" . "<input type='text' name='project' value='" . $record['Project'] . "' /></td>";
echo "<td>" . "<input type='text' name='client' value='" . $record['Client'] . "'/></td>";
echo "<td>" . "<input type='text' name='lastname' value='" . $record['LastName'] . "' /></td>";
echo "<td>" . "<input type='text' name='datereceived' value='" . $record['DateReceived'] . "' /></td>";
echo "<td>" . "<input type='text' name='finalreviewdate' value='" . $record['FinalReviewDate'] . "' /></td>";
echo "<td>" . "<input type='text' name='datedelivered' value='" . $record['DateDelivered'] . "' /></td>";
echo "<td>" . "<input type='text' name='dateaccepted' value='" . $record['DateAccepted'] . "' /></td>";
echo "<td>" . "<input type='hidden' name='hidden' value='" . $record['Project'] . "' /></td>";
echo "<td>" . "<input type='submit' name='update' value='update' /></td>";
echo "<td>" . "<input type='submit' name='delete' value='delete' /></td>";
echo "</tr>";
echo "</form>";
}
}
echo "</table>";

?>



<?php
    $conn->close();
?>

</body>

</html>