2015-12-02 304 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」標籤頂部 - >找到我們需要更改數據類型並單擊該字段的更改操作的行。 - >在下拉式選擇數據類型。