Php sql更新更改列之后的行中的每一列
我正在使用更新查询对数据库进行更改。我对行中特定单元格所做的更新将插入到数据库中。但是现在发生的是,在该单元格之后的任何空白日期空间都被输入为0000-00-00 例如,当我更新最终审核日期时,这是我应该得到的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
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>