<repo_name>eb01/jeanlorem.io<file_sep>/README.md
# jeanlorem.io

## Présentation
<NAME> est un générateur de texte aléatoire ... sauf qu'en lieu et place du classique lorem ipsum, il utilise les blagues et citations de Jean, le doyen de ma promotion à la 3WA qui nous a toujours épaté par ses envolées lyriques (bon certes, ce n'est pas toujours très fin et ce ne sera pas au goût de tous mais bon !).

L'utilisateur peut générer du texte rapidement en fonction de ses propres choix (nombre de paragraphes, type de titres (h1, h2 ...), balises **p**, contenu tous publics ou adulte).
L'administrateur (Jean, moi-même ou un tiers) peut accéder aux fonctionnalités de visualisation, d'ajout, d'édition et de suppression de blagues/citations.

## Technique
* Côté générateur :
Je voulais que l'utilisateur puisse cliquer autant de fois qu'il le souhaite sur le bouton "Générer" sans que cela génère un rechargement de page.
J'ai donc décidé de récupérer les blagues et citations contenues dans la DB dans un fichier JSON via la fonction native PHP *json_encode()*.
J'ai ensuite travaillé en JS (avec de l'AJAX) pour récupérer les blagues/citations dans le fichier *jokes.json* en fonction des choix utilisateur.
La construction du textarea dynamique se fait avec la fonction *buildRandomJeanLorem()*.

* Côté panel admin :
Je me suis entraîné à travailler avec la variable globale *$_SESSION*. 
J'ai fait un maximum de traitement PHP afin de vérifier les entrées utilisateur.

* Librairies :
J'ai choisi de m'entraîner avec jQuery sur ce projet afin de mesurer les différence avec du JS vanilla et j'ai fait des essais avec des plugins notamment pour la validation des formulaires en temps réel afin d'améliorer l'expérience utilisateur (avant les "purs" traitements PHP s'exécutant en validant les formulaires).
J'ai utilisé Bootstrap 3 pour avoir un site responsive de manière efficace et rapide ainsi que pour la mise en forme du menu, des formulaires et du tableau admin.

## Dump DB MySQL
Le fichier .sql contenant les données publiques de la DB est disponible à l'emplacement *resources/dump_db_sql*.

## Site web online
https://jeanlorem.io/<file_sep>/index.php
<?php

session_start();

// DB Connect
require_once __DIR__.'/application/bdd_connection.php';

// Query returning jokes
$query = $pdo->prepare
(
	'SELECT
		joke_content,
		joke_audience,
		joke_tagType
	 FROM 
	 	jokes
	'
);

$query->execute();

$jokes = $query->fetchAll(PDO::FETCH_ASSOC);

// Encode all jokes in json for manage them with JS
$jokesJson = fopen('jokes.json', 'w');
fwrite($jokesJson, json_encode($jokes));
fclose($jokesJson);

// Page details (for the head)
$title = "Générateur de Lorem Ipsum (ou faux-texte) | <NAME>";
$description = "Un générateur de Lorem Ipsum (ou faux-texte) pas comme les autres. <NAME> met à disposition du lorem au langage fleuri. Du faux-texte humoristique en langue française pour changer du texte latin.";

// Routing
$template = "index";
include 'layout.php';<file_sep>/login.php
<?php

session_start();

// If user is already logged, redirect to admin panel
if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) {
	header('Location: admin');
	exit;
};

// If the form is filled
if(!empty($_POST)) {
	
	// DB Connect
	require_once __DIR__.'/application/bdd_connection.php';
	
	// Query used for check the identification (username and password)
	$query = $pdo->prepare('SELECT * FROM users WHERE user_username = ?');

	// Give the username entered by user
	$query->execute(array($_POST['username']));

	// This returns false if username doesn't exist in DB
	$user = $query->fetch(PDO::FETCH_ASSOC);

	/* Compare the password entered by user and the password stocked in DB
	* Use of password_verify PHP function (encrypted with password_hash)
	*/
	$checkedPassword = password_verify($_POST['password'], $user['user_password']);

	// If user doesn't exist or password doesn't match, display error message
	if (!$user || !$checkedPassword) {
	    $errorLoginMessage = 'Mauvais identifiant ou mot de passe !';
	} 
	// Else, start a user session, prepare flashbag msg
	else {
	    session_start();
	    $_SESSION['user_ID'] = $user['user_ID'];
	    $_SESSION['username'] = $user['user_username']; 
	    $_SESSION['successLoginMessage'] = ", tu t'es bien connecté !";

	    // Query for update the user last login datetime in DB
	    $query = $pdo->prepare('UPDATE users SET user_dateLastLogin = NOW() WHERE user_ID = ?');

	    // Give the user_ID
	    $query->execute(array($_SESSION['user_ID']));

	    // Redirect to admin panel
	    header('Location: admin');
		exit;
	};
};

// Page details (for the head)
$title = "Se connecter | <NAME>";
$description = "Formulaire de connexion au panneau d'administration de Jean Lorem";

// Routing
$template = "login";
include 'layout.php';<file_sep>/delete-joke.php
<?php

session_start();

if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) {

	// DB Connect
	require_once __DIR__.'/application/bdd_connection.php';

	// If $_GET has a value, , we retrieve all the jokes IDs for check if $_GET value exists in DB
	if(!empty($_GET["joke_ID"])) {
		// Query for retrieve all the jokes IDs
		$query = $pdo->prepare
		(
			'SELECT
				joke_ID
			 FROM jokes'
		);

		$query->execute();

		$jokes = $query->fetchAll(PDO::FETCH_COLUMN, 0);

		// We check if the joke exists in DB before query process
		if(in_array($_GET["joke_ID"], $jokes)) {

			// Query for delete THE joke
			$query = $pdo->prepare
			(
				'DELETE FROM jokes
				 WHERE joke_ID = ?'
			);	 

			$query->execute(array($_GET["joke_ID"]));

			// Prepare flashbag success message and redirect to admin panel
			$_SESSION['successDeleteJokeMessage'] = "Blague/citation correctement supprimée";
			header("Location: admin");
			exit;
		};
	}

	//Else redirect to admin panel
	else {
		header("Location: admin");
		exit;
	};

// Else, redirect to homepage
} else {
	header('Location: /');
	exit;
};

// No routing because this is a "trigger page"

?><file_sep>/edit-joke.php
<?php

session_start();

// If user is logged
if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) {

	// DB Connect
	require_once __DIR__.'/application/bdd_connection.php';

	// ***CASE 1*** : If the form is empty, first we retrieve all the jokes IDs for check if $_GET value exists in DB
	if(empty($_POST)) {

		// Query for retrieve all the jokes IDs
		$query = $pdo->prepare
		(
			'SELECT
				joke_ID
			 FROM jokes'
		);

		$query->execute();

		$jokes = $query->fetchAll(PDO::FETCH_COLUMN, 0);
	
		// We check if the joke exists in DB before query process. In the view, we will pre-filled the inputs with these datas.
		if(in_array($_GET["joke_ID"], $jokes)) {

			// Query for retrieve THE joke
			$query = $pdo->prepare
			(
				'SELECT 
					joke_content, 
					joke_audience,
					joke_tagType 
				 FROM jokes
				 WHERE joke_ID = ?'
			);

			$query->execute(array($_GET["joke_ID"]));

			// This returns false if joke doesn't exist in DB
			$joke = $query->fetch(PDO::FETCH_ASSOC);

		// Else, redirect to admin panel
		} else {
			header('Location: admin');
			exit;
		};
	}

	// ***CASE 2*** : Else, this is the case where the form is filled so we update the DB (after form data treatments)
	else {

		// For more lisibility 
		$jokeTagType = $_POST["joke-tagtype"];
		$jokeAudience = $_POST["joke-audience"];
		$jokeContent = $_POST["joke-content"];

		// Prepare form data treatment on characters length range
		switch ($jokeTagType) {
			case 'paragraph':
			$charMinLength = 101;
			$charMaxLength = 700;
			break;
			case 'header':
			$charMinLength = 8;
			$charMaxLength = 100;
			break;
		};

		// First query : we retrieve all the jokes IDs for check if $_POST value exists in DB
		// Query for retrieve all the jokes IDs
		$query = $pdo->prepare
		(
			'SELECT
				joke_ID
			 FROM jokes'
		);

		$query->execute();

		$jokes = $query->fetchAll(PDO::FETCH_COLUMN, 0);

		// We check if the joke exists in DB + Form data treatments on selected options and characters length range
		// *Info* : here $_POST["joke-id"] returns the value of an input hidden which returns the $_GET["joke_ID"] value
		if(in_array($_POST["joke-ID"], $jokes) &&	
		($jokeTagType === "paragraph" || $jokeTagType === "header") && 
		($jokeAudience === "all" || $jokeAudience === "adult") &&
		strlen($jokeContent) >= $charMinLength && strlen($jokeContent) <= $charMaxLength) {
		
			// Query for update THE joke in DB
			$query = $pdo->prepare
			(
				'UPDATE 
					jokes
				 SET joke_content = ?,
					 joke_audience = ?,
					 joke_tagType = ?,
					 joke_dateLastEdit = NOW()
				 WHERE joke_ID = ?
				'		
			);

			$query->execute(array($jokeContent, $jokeAudience, $jokeTagType, $_POST["joke-ID"]));

			// Prepare flashbag success message and redirect to admin panel
			$_SESSION["successEditJokeMessage"] = "Blague/Citation éditée avec succès";
			header("Location: admin");
			exit;
		} 
		// Else, user data is incorrect, so display error message
		else {
			$errorAddEditJokeMessage = "Merci de renseigner correctement le formulaire";
		};
	};

// Else, redirect to homepage
} else {
	header('Location: /');
	exit;
};

// Page details (for the head)
$title = "Éditer une blague/citation | <NAME>";
$description = "Formulaire d'édition d'une blague ou d'une citation";

// Routing
$template = 'edit-joke';
include 'layout.php';<file_sep>/admin.php
<?php

session_start();

// If user is logged
if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) {

    // DB Connect
	require_once __DIR__.'/application/bdd_connection.php';

	// Query used for retrieve all the jokes and their respectives usernames
	$query = $pdo->prepare
	(
		'SELECT
			joke_ID,
			joke_content,
			joke_audience,
			joke_tagType,
			joke_dateCreation,
			joke_dateLastEdit,
			user_username
		 FROM 
		 	jokes
		 INNER JOIN users
		 ON jokes.user_ID = users.user_ID
		 ORDER BY joke_ID
		'
	);

	$query->execute();

	$jokes = $query->fetchAll(PDO::FETCH_ASSOC);

	// Page details (for the head)
	$title = "Admin | <NAME>";
	$description = "Panneau d'administration de <NAME>";

	// Routing
	$template = "admin";
	include 'layout.php';

// Else, redirect to homepage
} else {
	header('Location: /');
	exit;
};<file_sep>/application/bdd_connection.php
<?php 

// DB config
$dsn = "mysql:host=localhost;dbname=";
$user = "";
$password = "";

// DB safe connection
try {
	$pdo = new PDO($dsn, $user, $password);
	// Characters type
	$pdo->exec("SET NAMES UTF8");
}
catch (PDOException $e) {
	echo $e->getMessage();
}<file_sep>/layout.php
<?php $currentPage = $_SERVER['REQUEST_URI']; ?>
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title><?= $title ?></title>
        <meta name="description" content=<?= '"' . $description . '"' ?> />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta name="author" content="<NAME>" />
        <?php if($currentPage != "/" && $currentPage != "/story") : ?>
        <meta name="robots" content="noindex, nofollow" />
        <?php endif; ?>
        <?php if($currentPage == "/" || $currentPage == "/story") : ?>
        <meta property="og:site_name" content="<NAME>">
        <meta property="og:title" content=<?= '"' . $title . '"' ?> />
        <meta property="og:type" content="website" />
        <meta property="og:url" content="https://jeanlorem.io/" />
        <meta property="og:image" content="https://jeanlorem.io/img/jeanlorem-logo.png" />
        <meta property="twitter:card" content="summary" />
        <meta property="twitter:site" content="@jeanlorem" />
        <meta property="twitter:title" content=<?= '"' . $title . '"' ?> />
        <meta property="twitter:description" content=<?= '"' . $description . '"' ?> />
        <meta property="twitter:image" content="https://jeanlorem.io/img/jeanlorem-logo.png" />
        <meta property="twitter:url" content="https://jeanlorem.io/" />
        <?php endif; ?>
        <link rel="icon" type="image/png" href="img/jeanlorem-favicon.png" />
        <link rel="stylesheet" href="css/bootstrap.min.css" />
        <link href="https://fonts.googleapis.com/css?family=Anonymous+Pro:400,700" rel="stylesheet" />
        <link href="https://fonts.googleapis.com/css?family=Josefin+Slab:700" rel="stylesheet" />
        <link rel="stylesheet" href="css/font-awesome.min.css" />
        <link rel="stylesheet" type="text/css" href="css/jssocials.css" />
        <link rel="stylesheet" type="text/css" href="css/jssocials-theme-flat.css" />
        <link rel="stylesheet" href="css/style.css" />
        <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
         <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
            <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    <body>
        <header>
            <nav class="navbar navbar-default" role="navigation">
                <div class="container">
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse">
                            <span class="sr-only">Afficher le menu</span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="/"><NAME></a>
                    </div>
                    <div class="collapse navbar-collapse" id="navbar-collapse">
                        <ul class="nav navbar-nav">
                            <li><a href="/">Générateur</a></li>
                            <li><a href="story">The story</a></li>
                            <?php if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) : ?>
                            <li class="dropdown">
                                <a href="admin" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Admin <span class="caret"></span></a>
                                <ul class="dropdown-menu">
                                    <li><a href="admin">Gestion des blagues</a></li>
                                    <li><a href="add-joke">Ajouter une blague</a></li>
                                    <li role="separator" class="divider"></li>
                                    <li><a href="disconnect">Déconnexion <?= "(" . $_SESSION['username'] .")"  ?></a></li>
                                </ul>
                            </li>
                            <?php endif; ?>
                        </ul>
                    </div>
                    <!-- /.navbar-collapse -->
                </div>
                <!-- /.container -->
            </nav>
            <div class="brand"><a href="/"><NAME></a></div>
            <p><strong>Le générateur de langage fleuri</strong></p>
        </header>
        <main>
            <div class="container">
                <?php include $template.'.phtml' ?>
            </div>
        </main>
        <footer>
            <div class="container">
                <div class="row">
                    <div class="col-lg-12 text-center">
                        <p>Copyright &copy; <NAME> <?= date("Y"); ?></p>
                    </div>
                </div>
            </div>
        </footer>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="<KEY> crossorigin="anonymous"></script>
        <script src="js/bootstrap.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
        <script src="js/jssocials.min.js"></script>
        <script src="js/jquery-charactercounter.js"></script>
        <script src="js/bootstrap-confirmation.min.js"></script>
        <script src="js/main.js"></script>
    </body>
</html><file_sep>/add-joke.php
<?php

session_start();

// If user is logged
if(isset($_SESSION['user_ID']) && isset($_SESSION['username'])) {

	// If the form is filled
	if(!empty($_POST)) {
		// For more lisibility 
		$jokeTagType = $_POST["joke-tagtype"];
		$jokeAudience = $_POST["joke-audience"];
		$jokeContent = $_POST["joke-content"];

		// Prepare form data treatment on characters length range
		switch ($jokeTagType) {
			case 'paragraph':
			$charMinLength = 101;
			$charMaxLength = 700;
			break;
			case 'header':
			$charMinLength = 8;
			$charMaxLength = 100;
			break;
		};

		// Form data treatments on selected options and characters length range
		if(	($jokeTagType === "paragraph" || $jokeTagType === "header") && 
		($jokeAudience === "all" || $jokeAudience === "adult") &&
		strlen($jokeContent) >= $charMinLength && strlen($jokeContent) <= $charMaxLength) {

			// DB Connect
			require_once __DIR__.'/application/bdd_connection.php';

			// Query for insert a new joke in DB
			$query = $pdo->prepare
			(
				'INSERT INTO
					jokes(
						joke_content,
						joke_audience,
						joke_tagType,
						joke_dateCreation,
						user_ID
					)

				 VALUES(
				   	?,
			  		?,
			  		?,
			  		NOW(),
			  		?
			  	 )
				'
			);

			$query->execute(array($jokeContent, $jokeAudience, $jokeTagType, $_SESSION["user_ID"]));

			// Prepare flashbag success message and redirect to admin panel
			$_SESSION["successAddJokeMessage"] = "Blague/Citation ajoutée avec succès";
			header('Location: admin');
			exit;
		}
		// Else, user data is incorrect, so display error message
		else {
			$errorAddEditJokeMessage = "Merci de renseigner correctement le formulaire";
		};
	};

// Else, redirect to homepage
} else {
	header('Location: /');
	exit;
};

// Page details (for the head)
$title = "Ajouter une blague/citation | <NAME>";
$description = "Formulaire d'ajout d'une blague ou d'une citation";

// Routing
$template = "add-joke";
include 'layout.php';<file_sep>/story.php
<?php

session_start();

// Page details (for the head)
$title = "The Story | <NAME>";
$description = "L'histoire de <NAME>. <NAME>, c'est quoi ? Pour qui ?  Pourquoi ? Les réponses sont sur cette page !";

// Routing
$template = "story";
include 'layout.php';<file_sep>/resources/dump_db_sql/admin_jeanlorem.sql
-- phpMyAdmin SQL Dump
-- version 4.2.12deb2+deb8u2
-- http://www.phpmyadmin.net
--
-- Client :  localhost
-- Généré le :  Jeu 26 Octobre 2017 à 17:02
-- Version du serveur :  5.5.57-0+deb8u1
-- Version de PHP :  5.6.30-0+deb8u1

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données :  `Private content`
--

-- --------------------------------------------------------

--
-- Structure de la table `jokes`
--

CREATE TABLE IF NOT EXISTS `jokes` (
`joke_ID` int(11) NOT NULL,
  `joke_content` text NOT NULL,
  `joke_audience` varchar(200) NOT NULL,
  `joke_tagType` varchar(200) NOT NULL,
  `joke_dateCreation` datetime NOT NULL,
  `joke_dateLastEdit` datetime DEFAULT NULL,
  `user_ID` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `jokes`
--

INSERT INTO `jokes` (`joke_ID`, `joke_content`, `joke_audience`, `joke_tagType`, `joke_dateCreation`, `joke_dateLastEdit`, `user_ID`) VALUES
(1, 'Pour que ça marche en PHP, il faut avoir des echo logiques hein !', 'all', 'header', '2017-08-25 17:22:27', NULL, 1),
(2, 'Les requêtes SQL, on appelle ça un cercle vicelard', 'all', 'header', '2017-08-25 17:23:00', NULL, 1),
(3, 'Bonjour Macha, mon mari encule mon chat ... est-ce que mon chat est normal ?', 'adult', 'header', '2017-08-25 17:23:47', NULL, 1),
(4, 'Un concentré n''est pas forcément un imbécile qui se trouve au milieu d''un cercle', 'all', 'header', '2017-08-25 17:24:05', NULL, 1),
(5, 'Aujourd''hui qui c''est qui nous apprend Silex ??? ... Bah c''est Pierre !', 'all', 'header', '2017-08-25 17:25:43', NULL, 1),
(6, 'Là on se fait Angular, jeudi on se fera encular', 'adult', 'header', '2017-08-25 17:26:22', NULL, 1),
(7, 'J''avais une faille, je me suis mal préparé, il me l''a mis dans le SQL', 'adult', 'header', '2017-08-25 17:27:10', NULL, 1),
(8, 'Y''a pas de gênes, là où il y a de l''ADN !', 'all', 'header', '2017-08-25 17:28:44', NULL, 1),
(9, 'Ne confondez pas "eau des WC" et "eau de vaisselle"', 'all', 'header', '2017-08-25 17:29:11', NULL, 1),
(10, 'Les radis c''est pas pour les radins !', 'all', 'header', '2017-08-25 17:30:39', NULL, 1),
(11, 'L''amour c''est comme le pognon, ça va ça vient et quand ça vient ça va !', 'all', 'header', '2017-08-25 17:37:23', NULL, 1),
(12, 'Si tu suis le chemin qui s''appelle "plus tard", tu arriveras à la place qui s''appelle "jamais"', 'all', 'header', '2017-08-25 17:38:12', NULL, 1),
(13, 'Avant Linux, mon ordi plantait tout le temps, je n’avais pas de vie sociale, les filles me fuyaient... maintenant, mon ordi ne plante plus !', 'all', 'paragraph', '2017-08-25 17:39:48', NULL, 1),
(14, 'Les mots de passe sont comme les sous-vêtements. On ne devrait pas les laisser traîner là où des personnes pourraient les voir. On devrait en changer régulièrement. On ne devrait pas les prêter à des inconnus', 'all', 'paragraph', '2017-08-25 17:51:55', NULL, 1),
(15, 'C''est l''histoire d''un pingouin qui respire par les fesses. Un jour il s’assoit et il meurt.', 'adult', 'header', '2017-08-27 10:18:41', '2017-09-04 15:09:30', 3),
(16, 'C''est l''histoire d''un poil. Avant il était bien maintenant il est pubien !', 'adult', 'header', '2017-08-27 10:20:12', '2017-09-04 15:00:16', 3),
(17, 'Certains hommes n''ont que ce qu''ils méritent : les autres sont célibataires.', 'all', 'header', '2017-08-27 10:21:29', NULL, 3),
(18, 'Je ne sais pas ce qui est possible ou non alors j''agis comme si tout est possible. Car est-on certain à 100% que l''on ne peut pas y arriver ? La réponse est non ! La question est donc de savoir si nous sommes ouverts à la possibilité que les choses soient totalement possibles ?', 'all', 'paragraph', '2017-08-29 08:26:47', '2017-09-19 16:25:52', 3),
(19, 'Ne prends pas la suite de ce texte comme une leçon de morale mais comme une question importante que j''ai à te poser et à laquelle je te demande surtout de ne pas me répondre... Est-ce que tu veux aller bien dans la vie ?', 'all', 'paragraph', '2017-08-29 08:30:34', '2017-10-26 15:44:18', 3);

-- --------------------------------------------------------

--
-- Structure de la table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`user_ID` int(11) NOT NULL,
  `user_username` varchar(255) NOT NULL,
  `user_password` varchar(255) NOT NULL,
  `user_dateCreation` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `users`
--

-- Private content

--
-- Index pour les tables exportées
--

--
-- Index pour la table `jokes`
--
ALTER TABLE `jokes`
 ADD PRIMARY KEY (`joke_ID`);

--
-- Index pour la table `users`
--
ALTER TABLE `users`
 ADD PRIMARY KEY (`user_ID`);

--
-- AUTO_INCREMENT pour les tables exportées
--

--
-- AUTO_INCREMENT pour la table `jokes`
--
ALTER TABLE `jokes`
MODIFY `joke_ID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=20;
--
-- AUTO_INCREMENT pour la table `users`
--
ALTER TABLE `users`
MODIFY `user_ID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
