2015-12-02 300 views
13

我正在使用UPDATE查询对我的数据库进行更改。我对一行中的特定单元格所做的更新将插入到数据库中。发生了什么是该单元格输入为0000-00-00后出现的空白日期空间。sql更新更新在更改列后的行中的每一列

例如,当我更新的最后审查日期,这是我应该得到什么

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> 
+0

什么是$的值_POST [datedelivered]和$ _POST [dateaccepted]? – momouu

+0

在数据库中,这些列默认设置为NULL。 – Tony

+0

尽量不要在sql脚本中包含这两个。 – momouu

回答

13

问题:

The updates I make to a particular cell in a row get inserted into the database. What's happening though is any blank date spaces that come after that cell get entered as 0000-00-00.

解决方案:

从您的意见,

The database already has those columns set to default as NULL . The only one that doesn't is the DateReceived column.

我假设ProjectClientLastNameDateReceived已经组。因此,解决办法是插入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 

下面是完整的代码:(tested

<?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> 
+0

你的代码工作完美,我沿着这些线尝试了一些东西,但是我没有正确格式化,并且一直存在错误,我非常感谢你的帮助, – Tony

+0

给这个人带来了丰厚的回报。 –

1

如果你没有得到输入到DATATIME字段中的任何数据,则默认为0000-00-00

如果要更改默认值,你可以在表中设置。

,或者你可以确保数据总是做标准的验证检查

要回答你的问题输入到数据库中,检查表和字段,检查它们的它们是什么类型。我相信那些空白的不是日期时间,默认设置为0000-00-00的日期时间设置。

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

+0

数据库字段都设置为日期字段而不是日期时间字段。如果某些内容格式不正确,我在INSERT查询中验证错误。我没有在这张表上添加任何内容,因为我更专注于让它先行工作。 – Tony

2

这是您的代码中的一小段代码,但它是负责输入数据的部分。如果日期字段为空,则会得到一个指定的值'' (empty string),这应该有助于防止更新为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); 
    } 
}; 
+0

$ SQL =“SELECT * FROM项目”:来了$ SQL后=“更新项目... – Tony

+0

我更新了我的代码来试试你的建议,但我收到此错误:在第68行项目中的任何:未定义的变量想法? – Tony

5

这可能会发生,因为在创建表你给列类型为DATE并插入值作为不具有价值列空字符串。因此,在更新值时,其他列的值为0000-00-00。 DATE列不能将空字符串作为默认值。您可以根据数据类型here检查默认值。

你可以做的最好的事情是改变列取默认值NULL并同时插入值表第一次给定值,为NULL列的不具有任何价值。因此,在更新那些列不会取得值作为0000-00-00,他们将有价值作为NULL。

例如,考虑表名是测试和列名DATE1DATE2DATE3date4

CREATE TABLE test (date1 DATE DEFAULT NULL, date2 DATE DEFAULT NULL, date3 DATE DEFAULT NULL, date4 DATE DEFAULT NULL)

您还可以修改现有列使用下面的查询

ALTER TABLE test MODIFY COLUMN date1 DATE DEFAULT NULL

an d,同时插入值第一次,当你只有对第一列值,插入这样

INSERT INTO test VALUES ('2015-12-07', NULL, NULL, NULL)

所以以后当你更新任何其他列,只有该值将得到更新等栏目不会把价值0000- 00-00。他们将有价值为NULL

我测试了这个,它为我工作。

+0

数据库已经拥有的那些列设置为默认为NULL。这不只有一个是datereceived列。 – Tony

+0

@Tony比同时插入值首次行中,插入一个空值对于不具有列然后它不会在更新时使用0000-00-00 –

+0

初始条目是通过一个只有前四个字段的表单,Project,Client,Date Received和Last Name。您是否建议我将额外的列添加到我的INSERT表单还没有设置它们的值为NULL? – Tony

5

更改保存日期的字段的数据类型。然后当你在更新时离开空字段时,如果你的数据库字段也是空的,它将分配给'0000-00-00',否则它将保持不变。 现在要更改数据库数据类型 - > oto“structure”标签顶部 - >找到我们需要更改数据类型并单击该字段的更改操作的行。 - >在下拉式选择数据类型。