| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 
 | <?php
error_reporting(E_ALL);
 
ini_set('display_errors', true); // les booléens en minuscules, on est plus en 2003
ini_set('display_startup_errors', true);
                                       // on n'hésite pas à sauter des lignes 
require '../components/connect.php'; // require plutôt qu'include quand c'est indispensable, voire require_once pour ne pas insérer 2 fois la même chose
 
/* 
if (isset($_COOKIE['tutor_id'])) { // on met des espaces pour aérer
    $tutor_id = $_COOKIE['tutor_id']; // on indente avec 4 espaces pas 3
} else {
    $tutor_id = ''; // à quoi bon définir une variable avant une redirection ?
    header('location:login.php');
}
*/ // autant l'écrire de cette manière
 
if (!isset($_COOKIE['tutor_id'])) {
    header('location:login.php');
}
 
$tutor_id = $_COOKIE['tutor_id'];
 
/* à mettre aprés le test d'existence de $_POST['submit'] pas avant!
echo '<pre>', print_r($_FILES, true), '</pre>'; // Valorisé ?
echo '<pre>', print_r($_POST, true), '</pre>'; // Valorisé ?
*/
 
if (isset($_POST['submit'])) {
    // à ce stade les variables $title et $description ne sont pas définies
    //    echo "[DEBUG] tutor_id=[{$tutor_id}], title=[{$title}], description=[{$description}]"; 
 
    $id = create_unique_id(); /* où est définie cette fonction?
        De plus mieux vaut laisser le soin à MySQL de créer un id unique en plaçant la colonne id de la table content en auto_increment.
        Dans ce cas, il suffit de retirer l'id de la requête d'insertion, MySQL créera une valeur unique tout seul. */
 
    $status = $_POST['status'];
    $status = filter_var($status, FILTER_SANITIZE_STRING);
 
    $title = $_POST['title'];
    $title = filter_var($title, FILTER_SANITIZE_STRING);
 
    $description = $_POST['description'];
    $description = filter_var($description, FILTER_SANITIZE_STRING);
 
    $playlist_id = $_POST['playlist'];
    $playlist_id = filter_var($playlist_id, FILTER_SANITIZE_STRING);
 
    $thumb = $_FILES['thumb']['name'];
    $thumb = filter_var($thumb, FILTER_SANITIZE_STRING);
    $thumb_ext = pathinfo($thumb, PATHINFO_EXTENSION);
    $rename_thumb = create_unique_id() . '.' . $thumb_ext; // où est définie la fonction create_unique_id() ?
    $thumb_size = $_FILES['thumb']['size'];
    $thumb_tmp_name = $_FILES['thumb']['tmp_name'];
    $thumb_folder = '../uploaded_files/' . $rename_thumb;
 
    $video = $_FILES['video']['name'];
    $video = filter_var($video, FILTER_SANITIZE_STRING);
    $video_ext = pathinfo($video, PATHINFO_EXTENSION);
    $rename_video = create_unique_id() . '.' . $video_ext;
    $video_tmp_name = $_FILES['video']['tmp_name'];
    $video_size = $_FILES['video']['size'];
    $video_folder = '../uploaded_files/' . $rename_video;
 
/////////////////////////////////////////////////////////////////////////////////////////////
// dans cette partie on teste si un enregistrement existe déjà avant de l'insérer,
// mais il est possible de faire autrement: ajouter une contrainte d'unicité pour
// la table `content` pour l'ensemble des 3 colonnes tutor_id, title et description.
// Dans ce cas plus besoin de faire un test au préalable, on fait directement l'insertion.
/////////////////////////////////////////////////////////////////////////////////////////////
    /*$sql = "select * from content where tutor_id = ?  and title = ? and description = ?"; */ 
    // pourquoi "select *"? On se fiche des colonnes renvoyées par la requête on veut juste voir s'il est déjà présent 
 
    $query = <<<'SQL'
        SELECT 1
        FROM content
        WHERE tutor_id = ?
          AND title = ?
          AND description = ?
    SQL;
 
    // il faut choisir entre les placeholders nommés et les '?'
    // $description = [':description' => $description];
 
    $verify_content =$conn->prepare($query);
    $verify_content->execute([$tutor_id, $title, $description]);
 
    if ($verify_content->fetch_column()) {
        $message[] = 'content already created!';
    } else {
        move_uploaded_file($thumb_tmp_name, $thumb_folder); // ces opérations peuvent échouer, il faut tester leur retour et aviser
        move_uploaded_file($video_tmp_name, $video_folder);
 
        $query = "INSERT INTO content(id, tutor_id, playlist_id, title, description, video, thumb, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        $stmt = $conn->prepare($query);
        $stmt->execute([$id, $tutor_id, $playlist_id, $title, $description, $rename_video, $rename_thumb, $status]);
 
        $message[] = 'new course uploaded!';
    }
////////////////////////////////////////////////////////////////////////////////////////////
}
 
?><!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Dashboard</title>
 
   <!-- font awesome cdn link  -->
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css">
 
   <!-- custom css file link  -->
   <link rel="stylesheet" href="../css/admin_style.css">
 
</head>
<body>
 
<?php include '../components/admin_header.php'; ?>
 
    <section class="video-form">
 
        <h1 class="heading">upload content</h1>
 
        <form action="" method="post" enctype="multipart/form-data">
            <label for="status">video status <span>*</span></label>
            <select id="status" name="status" class="box" required>
                <option value="" selected disabled>-- select status</option>
                <option value="active">active</option>
                <option value="desactive">desactive</option>
            </select>
 
            <label for="title">video title <span>*</span></label>
            <input id="title" type="text" name="title" maxlength="100" required placeholder="enter video title" class="box"/>
 
            <label for="description">video description <span>*</span></label>
            <textarea id="description" name="description" class="box" required placeholder="write description" maxlength="1000" cols="30" rows="10"></textarea>
 
            <label for="playlist">video playlist <span>*</span></label>
            <select id="playlist" name="playlist" class="box" required>
                <option value="" disabled selected>--select playlist</option>
                <?php
                    $stmt_playlists = $conn->prepare('SELECT id, title FROM playlist WHERE tutor_id = ?');
                    $stmt_playlists->execute([$tutor_id]);
                    $playlists = $stmt_playlists->fetchAll(); ?>
 
                <?php foreach ($playlists as $playlist): ?>
                <option value="<?= $playlist['id'] ?>"><?= $playlist['title'] ?></option>
                <?php endforeach; ?>
 
                <?php if (empty($playlists)): ?>
                <option value="" disabled>no playlist created yet!</option>
                <?php endif; ?>
            </select>
 
            <label for="thumb">select thumbnail <span>*</span></label>
            <input id="thumb" type="file" name="thumb" accept="image/*" required class="box"/>
 
            <label for="video">select video <span>*</span></label>
            <input id="video" type="file" name="video" accept="video/*" required class="box">
 
            <input type="submit" value="upload video" name="submit" class="btn">
        </form>
    </section>
 
<?php include '../components/footer.php'; ?>
 
<script src="../js/admin_script.js"></script>
 
</body>
</html> |