0

Need some help with my update Ajax call. What I want my code to do is to show when on click my update form and pass the data from the form to my update via AJAX. So far the form isn't showing on click nor is the update working. Everything else seems to be working right except for that.

index.php

<?php include 'includes/header.php' ?>
<div class="main" id="maincontent">
<div class="main-section">
    <div class="add-section">
        <form action="app/add.php" method="POST" autocomplete="off">
        <?php if(isset($_GET['mess']) && $_GET['mess'] == 'error'){ ?>
            <label for="title">To Do*</label>
            <input type="text" id= "title" name="title" 
            style="border-color: #ff6666"
            placeholder="This is required" aria-label="You need to create a to do!"/> 

            <label for="month">Month</label>
            <input type="text" id="month" name="month" placeholder="Month Not Required" aria-label="Enter a month if needed"/>
            
            <label for="year">Year</label>
            <input type="text" id="year" name="year" placeholder="Year Not Required" aria-label="Enter a year if needed"/>

            <button type="submit" aria-label="Enter"> &plus; </button>

            <?php }else{ ?>
            <label for="title">To Do*</label>
                <input type="text" id= "title" name="title" placeholder="Enter a To Do" aria-label="Enter a To Do"/>
            
            <label for="month">Month</label>    
                <input type="text" id="month" name="month" placeholder="Enter Month [1-12]" aria-label="Enter month if needed for your to do"/>  
            
            <label for="year">Year</label>     
                <input type="text" id="year" name="year" placeholder="Enter Year [yyyy]" aria-label="Enter a year if needed for your to do"/>

            <button type="submit" aria-label="Enter"> &plus; </button>
                
            <?php } ?>
        </form>

    </div>  
    <?php
        $todos = $conn->query("SELECT * FROM todos  ORDER BY id DESC"); 
    ?>
    <div class="show-todo-section">
    <?php if($todos->rowCount() <= 0){?>
        <div class="todo-item">
            <div class="empty">
                <p>Enter a To Do!</p>
                <img src="img/f.jpg" alt="Notebook" width="100%" height="175px" />
                
            </div>
        </div>
    <?php } ?>  

    <?php while($todo = $todos->fetch(PDO::FETCH_ASSOC)) { ?>
        <div class="todo-item">
            <span id="<?php echo $todo['id']; ?>" class="remove-to-do" aria-label="Delete"><i class="fa fa-trash" style="font-size:18px"></i></span>
      

            <span id="<?php echo $todo['id']; ?>" class="update-to-do" aria-label="Edit">
            <i class="fa fa-pencil" style="font-size:18px"></i></span>

            <?php if($todo['checked']) { ?> 
                <input type="checkbox" data-todo-id="<?php echo $todo['id']; ?>" class="check-box" checked />

                <h2 class="checked"><?php echo $todo['title'] ?></h2>

            <?php }else{ ?>
                <input type="checkbox" data-todo-id="<?php echo $todo['id']; ?>" class="check-box">
                <h2><?php echo $todo['title'] ?></h2>

            <?php } ?>
            <br>
            <small>Created: <?php echo $todo['date_time'] ?> &nbsp; </small> 
            <div style="display:none;" class="update"><?php include 'updateForm.php'?></div> 
            <!---->
        </div>
           
        
    <?php } ?>   

jQuery

<script>
 $(document).ready(function(){
    $('.remove-to-do').click(function(){
        const id = $(this).attr('id');

        $.post("app/remove.php",
        {
            id: id
        },
        (data) =>{
            if(data){
                $(this).parent().hide(600);
            }
        }         
        );  
    });       
    $(".check-box").click(function(e){
    const id = $(this).attr('data-todo-id');  
    
    $.post("app/check.php",
        {
            id: id
        },
        (data) =>{
            if(data != 'error')
            {
                const h2 = $(this).next();
                if(data === '1'){
                    h2.removeClass('checked');
                }else{
                    h2.addClass('checked');
                }
            }
        }
        );
    }); /* */
    $(".update-to-do").click(function(e){
        const id = $(this).attr('id');
    
    $.post("app/update.php",
        {
            id: id
            
        },
        (data) =>{
            //alert(id);
            
            if(data != 'error')
            {
                var x = document.getElementsByClassName("update");

                if(form.hide()){
                    form.show();
                }else{
                    form.hide();
                }
            }
        }
        );
    });
             
});

updateForm.php

  <div class="add-section"> 
      <form action="app/update.php" method="POST" autocomplete="off">
            <?php if(isset($_GET['mess']) && $_GET['mess'] == 'error'){ ?>
                <label for="id" style="display:none;"></label>
                <input type="hidden" id= "id" name="id" value="<?php echo  $_GET['id']; ?>" aria-label=""/>

                <label for="title">To Do*</label>
                <input type="text" id= "title" name="title" 
                style="border-color: #ff6666"
                placeholder="This is required" aria-label="You need to create a to do!"/> 

                <label for="month">Month</label>
                <input type="text" id="month" name="month" placeholder="Month Not Required" aria-label="Enter a month if needed"/>
                
                <label for="year">Year</label>
                <input type="text" id="year" name="year" placeholder="Year Not Required" aria-label="Enter a year if needed"/>

                <button type="submit" aria-label="Enter"> &plus; </button>

                <?php }else{ ?>
                <label for="id" style="display:none;"></label>
                    <!--<input type="hidden" id= "id" name="id" value="<?php //echo  $_GET['id']; ?>" aria-label="id"/> -->
                
                <label for="title">To Do*</label>
                    <input type="text" id= "title" name="title" placeholder="Enter a To Do" aria-label="Enter a To Do"/>
                
                <label for="month">Month</label>    
                    <input type="text" id="month" name="month" placeholder="Enter Month [1-12]" aria-label="Enter month if needed for your to do"/>  
                
                <label for="year">Year</label>     
                    <input type="text" id="year" name="year" placeholder="Enter Year [yyyy]" aria-label="Enter a year if needed for your to do"/>
                    <div class="pad"></div>
                <button type="submit" aria-label="Enter"> &plus; </button>
                    
            <?php } ?>
        </form>
   </div> 

update.php

    <?php
if(isset($_POST['id'])){
    require '../includes/conn.php';
    include 'func.php';

    $id = $_POST['id'];
    echo $id;
    $title = $_POST['titleUp'];
    $month = $_POST['monthUp'];
    $year = $_POST['yearUp'];
    $dateMonth;
    $futureDate;
    
    if(empty($id))
    {
        header("Location: ../updateForm.php?id=" . $id . "mess=error");
    }
    else
    {
        if( (!empty($title)) &&  (empty($month)) && (empty($year)) )
        { //need to filter 0 so its registered as not empty
            $title = validTitle($title);
    
            $stmt = $conn->prepare("UPDATE todos(title) VALUE(?) WHERE id=?");
            $res = $stmt->execute([$title, $id]); 
    
            if($res)
            {
                header("Location: ../index.php");
            }
            else
            {           
                header("Location: ../updateForm.php?id=" . $id .  "mess=error");
            }
            $conn= null;
            exit();
    
        }
        else if( (!empty($title)) && (!empty($month)) && (empty($year)) )
        {
            $title = validTitle($title);
            $month = validMonth($month);
            $dateMonth = dateMonth($month);
            $year = date("Y");
    
            $futureDate = futureDate($dateMonth, $year);
            
            $stmt = $conn->prepare("UPDATE todos (title, future_datetime) VALUES (?,?) WHERE id=?");
            $res = $stmt->execute([$title ,$futureDate, $id]); 
    
            if($res)
            {
                header("Location: ../index.php");
            }
            else
            {           
            header("updateForm.php?id=" . $id .  "mess=error");
            }
            $conn= null;
            exit();
        }  
        else if( (!empty($title)) && (!empty($month)) && (!(empty($year))))
        {
            $title = validTitle($title);
            $month = validMonth($month);
            $dateMonth = dateMonth($month);
            $year = validYear($year);
    
            $futureDate = futureDate($dateMonth, $year);
            
            $stmt = $conn->prepare("UPDATE todos (title, future_datetime) VALUES (?,?) WHERE id=?");
            $res = $stmt->execute([$title ,$futureDate, $id]); 
    
            if($res)
            {
                header("Location: ../index.php");
            }
            else
            {           
            header("Location: ../updateForm.php?id=" . $id .  "mess=error");
            }
            $conn= null;
            exit();
        }     
        else 
        {
            header("Location: ../updateForm.php?id=" . $id . "mess=error");
        }       
    }
}
else
{
    header("Location: ../updateForm.php?id=" . $id .  "mess=error");
}


?>
Amy101
  • 1
  • 3
  • 1
    I see two apparent problems: 1) `document.getElementsByClassName(".update")` -- you shouldn't add dot there, class name without selector is expected, see [examples](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName#examples); 2) you put form reference into variable `x` (which will be a list of nodes, not just a single form element), but then you work with variable `form` which does not seem to be defined anywhere. – alx Apr 06 '21 at 22:54
  • @alx I fixed the .update to update. as for the variable x, its because I want the form to pop up under each 'to do' when edit is clicked. So there should be a form hidden from view on each 'to do' – Amy101 Apr 06 '21 at 23:12
  • @ikiK Can you give me an example? Or some sources? – Amy101 Apr 06 '21 at 23:20
  • @ikiK Okay I'll fix it. – Amy101 Apr 06 '21 at 23:26
  • See here for more info https://stackoverflow.com/questions/6394812/this-inside-of-ajax-success-not-working – ikiK Apr 06 '21 at 23:27
  • @ikiK The $.post callback is an arrow function so `$(this)` is valid – charlietfl Apr 06 '21 at 23:31
  • @charlietfl Whoooops As it says even in link i provided, facepalm – ikiK Apr 06 '21 at 23:32

0 Answers0