Hi. I keep getting 1 Notice and 1 Error after I delete all the tasks from the view_tasks2.php in chapter 1 Advanced PHP Object Oriented Programming.
Here is the output after I delete all the tasks:
Current To-Do List
The task(s) have been marked as completed!
Check the box next to a task and click "Update" to mark a task as completed (it, and any subtasks, will no longer appear in this list).
Notice: Undefined offset: 0 in C:\xampp\htdocs\aqp\chp1\view_tasks2.php on line 83
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\aqp\chp1\view_tasks2.php on line 23
Can someone help me with the errors?
here is my code for the view_tasks.php file. It is the exact same code that is provided from the book source code minus my database username, password settings. I have labeled lines 83 and 23 so you can find them easier.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>View Tasks</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Current To-Do List</h2>
<?php # Script 1.6 - view_tasks2.php
/* This page shows all existing tasks.
* A recursive function is used to show the
* tasks as nested lists, as applicable.
* Tasks can now be marked as completed.
*/
// Function for displaying a list.
// Receives one argument: an array.
function make_list ($parent) {
global $tasks;
echo '<ol>'; // Start an ordered list.
foreach ($parent as $task_id => $todo) { //line 23
// Start with a checkbox!
echo <<<EOT
<li><input type="checkbox" name="tasks[$task_id]" value="done"> $todo
EOT;
// Check for subtasks:
if (isset($tasks[$task_id])) {
make_list($tasks[$task_id]);
}
echo '</li>'; // Complete the list item.
} // End of FOREACH loop.
echo '</ol>'; // Close the ordered list.
} // End of make_list() function.
// Connect to the database:
$dbc = mysqli_connect('localhost', 'root', 'password', 'my_db');
// Check if the form has been submitted:
if (($_SERVER['REQUEST_METHOD'] == 'POST')
&& isset($_POST['tasks'])
&& is_array($_POST['tasks'])
&& !empty($_POST['tasks'])) {
// Define the query:
$q = 'UPDATE tasks SET date_completed=NOW() WHERE task_id IN (';
// Add each task ID:
foreach ($_POST['tasks'] as $task_id => $v) {
$q .= $task_id . ', ';
}
// Complete the query and execute:
$q = substr($q, 0, -2) . ')';
$r = mysqli_query($dbc, $q);
// Report on the results:
if (mysqli_affected_rows($dbc) == count($_POST['tasks'])) {
echo '<p>The task(s) have been marked as completed!</p>';
} else {
echo '<p>Not all tasks could be marked as completed!</p>';
}
} // End of submission IF.
// Retrieve all the uncompleted tasks:
$q = 'SELECT task_id, parent_id, task FROM tasks WHERE date_completed="0000-00-00 00:00:00" ORDER BY parent_id, date_added ASC';
$r = mysqli_query($dbc, $q);
$tasks = array();
while (list($task_id, $parent_id, $task) = mysqli_fetch_array($r, MYSQLI_NUM)) {
$tasks[$parent_id][$task_id] = $task;
}
// Make a form:
echo <<<EOT
<p>Check the box next to a task and click "Update" to mark a task as completed (it, and any subtasks, will no longer appear in this list).</p>
<form action="view_tasks2.php" method="post">
EOT;
make_list($tasks[0]); //line 83
// Complete the form:
echo <<<EOT
<input name="submit" type="submit" value="Update" />
</form>
EOT;
?>
</body>
</html>