Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de clé étrangère ?

Sujet résolu
6 septembre 2017 à 11:15:38

Bonjour, malgré de multiples lectures du forum et de tentative de compréhension, je n'arrive pas à faire fonctionner ma base de donnée avec Mysql suite à une clé étrangère

Voici ma base

drop database if exists oeuvres_vicdelubac;
create database oeuvres_vicdelubac;
	use oeuvres_vicdelubac;

create table auteur
(
	idA int UNSIGNED NOT NULL AUTO_INCREMENT,
	email varchar (255) NOT NULL,
	mdp text NOT NULL,
	PRIMARY KEY (idA),
) 	
ENGINE=InnoDB;

create table categorie 
(
	id_cat int UNSIGNED NOT NULL AUTO_INCREMENT,
	nom_cat varchar (255) NOT NULL,
	PRIMARY KEY (id_cat),
)	
ENGINE=InnoDB;

create table oeuvres 
(
	id_oeuvre int UNSIGNED NOT NULL AUTO_INCREMENT,
	nom_oeuvre varchar (255) NOT NULL,
	synopsis_oeuvre text NOT NULL,
	id_cat int UNSIGNED NOT NULL,
	commentaire_oeuvre varchar (255),
	PRIMARY KEY (id_oeuvre),
	FOREIGN KEY (id_cat) REFERENCES categorie (id_cat)
) 	
ENGINE=InnoDB;

Le schéma c'est: Une oeuvre ne peut avoir qu'une catégorie, mais une catégorie peut avoir plusieurs oeuvres, je souhaiterai avoir afficher dans la table des oeuvres, l'id de la catégorie pour ensuite pouvoir en une requête sql via un fichier php appeler l'id de l'oeuvre et l'id de la catégorie.

Ex: quand je suis sur la page de la catégorie 1 (categorie.php?id_cat=1) affiche uniquement les oeuvres de la catégorie 1.

Cependant quand je charge la base de donnée j'ai une erreur de syntaxe par rapport a l'engine et cela ne fait pas la liaison, j'ai fait d'autre test avant mais la liaison n'etait toujours pas affective. Est ce par rapport a la base de donnée ou autre ?

Merci a vous

  • Partager sur Facebook
  • Partager sur Twitter
6 septembre 2017 à 11:36:59

Bonjour,

SartVille a écrit:

j'ai une erreur de syntaxe par rapport a l'engine et cela ne fait pas la liaison

Le schéma semble correct, peux-tu nous donner l'erreur exacte complète ?
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
6 septembre 2017 à 12:12:12

mysql> source c:\wamp64\oeuvres_vicdelubac.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Database changed
ERROR 1064 (42000): Erreur de syntaxe près de ')
ENGINE=InnoDB' à la ligne 7
ERROR 1064 (42000): Erreur de syntaxe près de ')
ENGINE=InnoDB' à la ligne 6
ERROR 1215 (HY000): Impossible d'ajouter des contraintes d'index externe
mysql> show tables;
Empty set (0.00 sec)

mysql>

-
Edité par SartVille 6 septembre 2017 à 12:22:11

  • Partager sur Facebook
  • Partager sur Twitter
6 septembre 2017 à 12:53:06

En fait l'erreur pointe sur la virgule en trop après chaque fin déclaration de colonnes ...

Essayes ainsi :

drop database if exists oeuvres_vicdelubac;
create database oeuvres_vicdelubac;
    use oeuvres_vicdelubac;
 
create table auteur
(
    idA int UNSIGNED NOT NULL AUTO_INCREMENT,
    email varchar (255) NOT NULL,
    mdp text NOT NULL,
    PRIMARY KEY (idA)
)  
ENGINE=InnoDB;
 
create table categorie
(
    id_cat int UNSIGNED NOT NULL AUTO_INCREMENT,
    nom_cat varchar (255) NOT NULL,
    PRIMARY KEY (id_cat)
)  
ENGINE=InnoDB;
 
create table oeuvres
(
    id_oeuvre int UNSIGNED NOT NULL AUTO_INCREMENT,
    nom_oeuvre varchar (255) NOT NULL,
    synopsis_oeuvre text NOT NULL,
    id_cat int UNSIGNED NOT NULL,
    commentaire_oeuvre varchar (255),
    PRIMARY KEY (id_oeuvre),
    FOREIGN KEY (id_cat) REFERENCES categorie (id_cat)
)  
ENGINE=InnoDB;
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
6 septembre 2017 à 13:41:24

C'etait bien ça, maintenant le problème qui se pose c'est que mon formulaire d'ajout d’œuvre n’écrit plus dans la base de données.

Le formulaire d'inscription inscrit bien dans auteur (inscription disponible uniquement pour 1 utilisateur), le formulaire d'ajout de de catégorie inscrit bien dans catégorie (lui définie un id) mais le formulaire d'ajout d’œuvre n'inscrit plus dans la BDD (celui çi marchait avant)

Je transmet le code du formulaire d'ajout d’œuvre et de catégorie si jamais c'est du à un oubli en prévision de la clé étrangère:

Ajout Catégorie:

<?php
session_start();

require("bddconnect.php");

if(isset($_SESSION['idA']))
{
	if(isset($_POST['ajoutcat']))
	{
		$nom_cat = htmlspecialchars($_POST['nom_cat']);

		if(!empty($_POST['nom_cat']))
		{
			$reqnom_cat = $bdd->prepare("SELECT * FROM categorie WHERE nom_cat=?");
			$reqnom_cat->execute(array($nom_cat));
			$nom_catexist = $reqnom_cat->rowCount();
			if($nom_catexist == 0)
			{
				$insertcat = $bdd->prepare("INSERT INTO categorie(nom_cat) VALUES(?)");
				$insertcat->execute(array($nom_cat));
				$erreur = "Ajout réussie";
			}
			else
			{
				$erreur = "Nom catégorie non disponible !";
			}
		}
		else
		{
			$erreur = "Remplissez tout les champs";
		}
	}
?>
<html>
	<head>
		<meta charset="utf-8">
		<link rel="stylesheet" href="../style.css"/>
		<title>Ajout Catégorie</title>
	</head>
	<body>
		<div align="center">
			<br/><br/>
			<h1>Ajout Categorie</h1>
			<br/>
			<form method="POST" action="ajoutcategorie.php">
			<div class="infobox" align="center">
				<input type="text" placeholder="Nom Catégorie" id="nom_cat" name="nom_cat"/>
				<br/><br/>
				<input type="submit" name="ajoutcat" value="Ajouter Catégorie"/>
				<br/><br/><br/>
				<input type="button" name="listecat" value="Liste Catégorie"
				onclick="self.location.href='../oeuvres/liste_categories.php'"onclick>
			</div>
			</form>
		</div>
	</body>
</html>
<?php
}
else
{
	header("Location: ../index.html");
}
?>

Ajout Œuvre

<?php
session_start();

require("bddconnect.php");

if(isset($_SESSION['idA']))
{
	if(isset($_POST['execute']))
	{
        $categorie_oeuvre = htmlspecialchars($_POST['categorie_oeuvre']);
		$nom_oeuvre = htmlspecialchars($_POST['nom_oeuvre']);
		$synopsis_oeuvre = htmlspecialchars($_POST['synopsis_oeuvre']);
		$commentaire_oeuvre = htmlspecialchars($_POST['commentaire_oeuvre']);

		if(!empty($_POST['categorie_oeuvre']) AND !empty($_POST['nom_oeuvre']) AND !empty($_POST['synopsis_oeuvre']))
		{
			$reqcategorie_oeuvre = $bdd->prepare("SELECT * FROM oeuvres WHERE categorie_oeuvre=?");
			$reqcategorie_oeuvre->execute(array($categorie_oeuvre));	

			$nom_oeuvrelenght = strlen($nom_oeuvre);
			if($nom_oeuvrelenght <= 255)
			{
				$reqnom_oeuvre = $bdd->prepare("SELECT * FROM oeuvres WHERE nom_oeuvre=?");
				$reqnom_oeuvre->execute(array($nom_oeuvre));
				$nom_oeuvreexist = $reqnom_oeuvre->rowCount();
				if($nom_oeuvreexist == 0)
				{
					$reqsynopsis_oeuvre = $bdd->prepare("SELECT * FROM oeuvres WHERE synopsis_oeuvre=?");
					$reqsynopsis_oeuvre->execute(array($synopsis_oeuvre));

					$commentaire_oeuvrelenght = strlen($commentaire_oeuvre);
					if($commentaire_oeuvrelenght <= 255)
					{
						$reqcommentaire_oeuvre = $bdd->prepare("SELECT * FROM oeuvres WHERE commentaire_oeuvre=?");
						$reqcommentaire_oeuvre->execute(array($commentaire_oeuvre));

						$insertoeuvres = $bdd->prepare("INSERT INTO oeuvres(categorie_oeuvre, nom_oeuvre, synopsis_oeuvre, commentaire_oeuvre) VALUES(?, ?, ?, ?)");
						$insertoeuvres->execute(array($categorie_oeuvre, $nom_oeuvre, $synopsis_oeuvre, $commentaire_oeuvre));
						$erreur = "Œuvre ajoutée à la base de données";
					}
					else
					{
						$erreur = "Maximum 255 caractères pour le commentaire";
					}
				}
				else
				{
					$erreur = "Le nom est déjà utilisé";
				}
			}
			else
			{
				$erreur = "Le nom ne doit pas dépasser 255 caractères";
			}
		}
		else
		{
			$erreur = "Remplissez tout les champs";
		}
	}
?>
<html>
	<head>
		<meta charset="utf-8">
		<link rel="stylesheet" href="../style.css"/>
		<title>Ajout Œuvre</title>
	</head>
	<body>
		<div align="center"><br/><br/><br/>
			<h1>Ajout Oeuvre</h1><br/><br/><br/>
			<form method="POST" action="ajoutoeuvres.php" enctype="multipart/form-data" />
				<table>
					<tr>
						<td align="center">
							<label for="categorie_oeuvre">Catégorie: </label>
						</td>
						<td align="center">
							<select name="categorie_oeuvre" id="categorie_oeuvre">
								<option>Selectionnez Catégorie</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=1');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=2');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=3');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=4');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=5');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=6');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=7');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=8');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
								<option><?php $reponse = $bdd->query('SELECT nom_cat FROM categorie WHERE id_cat=9');
									while ($donnees = $reponse->fetch())
									{
									echo $donnees['nom_cat'];
									}
									$reponse->closeCursor();?>
								</option>
							</select>
						</td>
					</tr>
					<tr>
						<td align="center">
							<label for="nom_oeuvre">Nom:</label>
						</td>
						<td align="center">
							<input type="text" placeholder="Nom œuvre" id="nom_oeuvre" name="nom_oeuvre"/>
						</td>
					</tr>
					<tr>
						<td align="center">
							<label for="synopsis_oeuvre">Synopsis:</label>
						</td>
						<td align="center">
							<textarea placeholder="Synopsis" id="synopsis_oeuvre" name="synopsis_oeuvre"></textarea>
						</td>
					</tr>
					<tr>
						<td align="center">
							<label for="commentaire_oeuvre">Commentaire:</label>
						</td>
						<td align="center">
							<textarea placeholder="commentaire" id="commentaire_oeuvre" name="commentaire_oeuvre"></textarea>
						</td>
					</tr>
				</table><br/><br/><br/>
				<input type="submit" name="execute" value="Ajouter Œuvre"/><br/><br/>
			</form>
			<?php
				if(isset($erreur))
				{
					echo '<div class="erreur">' .$erreur. "</div>";
				}
			?>
		</div><br/>
		<nav><!-- menu navigation -->
				<li><a href="../index.html">Index</a></li>
				<li>|</li>
				<li><a href="../oeuvres/liste_categories.php">Catégories</a></li>
				<li>|</li>
				<li><a href="deconnection.php">Deconnection !</a>
			</ul>
		</nav>
	</body>
	<footer><!-- pied de page -->
		<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
		Developed by Mez © 2017
	</footer>
</html>
<?php
}
else
{
	$erreur = "Seul l'auteur peut acceder au contenu";
	header("Location: ../index.html");
}
?>

merci pour vos réponses :)



  • Partager sur Facebook
  • Partager sur Twitter
6 septembre 2017 à 14:09:21

Première chose à faire, t'assurer de l'activation des erreurs PHP (error_display) et PDO ( PDO::ERRMODE_EXCEPTION dans ton bddconnect.php ).

Ensuite, regarder si des erreurs apparaissent.

Si aucune erreur n'apparaît, placer des var_dump dans les différents if successifs pour voir si tu passes bien tous les if.

Au passage, htmlspecialchars ne s'utilise pas pour insérer des données en base, mais pour sécuriser l'affichage, donc au moment de echo les données ...

Et si tu veux assurer l'unicité des noms autant mettre une contrainte UNIQUE côté MySQL sur cette colonne, et, plutôt que de lancer un SELECT avec if, de gérer le retour d'erreur le cas échéant ;)

Et si le commentaire était une colonne de type TEXT, tu n'aurais pas le problème de longueur 255 caractères ...

-
Edité par Benzouye 6 septembre 2017 à 15:09:47

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
6 septembre 2017 à 14:59:11

Benzouye a écrit:

Au passage, htmlspecialchars ne s'utilise pas pour insérer des données en base, mais pour sécuriser l'affichage, donc au moment de echo les données ...


ha justement je croyais que c’était pour sécuriser l'entrée de données pour éviter les caractères spéciaux, espace ect...

je vais essayer comme tu m'a dis, merci

-
Edité par SartVille 6 septembre 2017 à 14:59:24

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2017 à 10:13:55

Bonjour je me permet de revenir vers vous, après quelques modifications, mon formulaire écrit bien dans les tables.

Maintenant le problème se pose lors de l'affichage, je ne comprends pas pourquoi je n'ai aucune erreur de php et pourquoi rien ne s'affiche, mon code est-il correct ?

Le système: Formulaire d'ajout de catégorie qui ajoute une nouvelle catégorie (oui oui ^^ ), un formulaire d'ajout d’œuvres, pour trier les œuvres j'ai fait une liste des catégories, quand on clique sur la catégorie on à toute les œuvres de la catégorie en question, tout cela marche mais une fois arrivé sur la page d'une œuvre, aucune info ne s'affiche, mauvaise requête ? mauvais php ? pouvez vous m’éclairer ?

Page d'affichage des données relative à une oeuvre, dans l'url c'est oeuvre.php?id_oeuvre=...

<?php
session_start();
require("bddconnect.php");

if(isset($_GET['id_oeuvre']) AND $_GET['id_oeuvre'] > 0)
{
	$id_oeuvre = intval($_GET['id_oeuvre']);
	$reponse = $bdd->prepare('SELECT nom_oeuvre, synopsis_oeuvre FROM oeuvres where id_oeuvre = :id_oeuvre');
	$reponse->bindValue('id_oeuvre', $_GET['id_oeuvre'], PDO::PARAM_INT);
	$reponse->execute();
?>
<html>
	<head>
		<meta charset="utf-8">
		<link rel="stylesheet" href="../style.css"/>
		<title><?php echo htmlspecialchars($reponse['nom_oeuvre']); ?></title>
	</head>
	<body>
		<div class="profil" align="center">
			<?php echo htmlspecialchars($reponse['nom_oeuvre']); ?>
			<br/><br/>
			<?php echo htmlspecialchars($reponse['synopsis_oeuvre']); ?>
		</div>
	</body>
</html>

au passage j'ai aussi une erreur d'affichage dans le titl, une idée ?

merci de votre aide, je suis vraiment perdu à ce niveau la

-
Edité par SartVille 14 septembre 2017 à 10:21:27

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2017 à 11:17:08

En fait, la variable $requete est un objet PDOStatement, pas un tableau (array), c'est pour cela que PHP t'insultes :p

Le comportement est normal ... Tu n'as pas compris le fonctionnement de PDO.

Il faut exécuter la requête, puis récupérer le résultat avec fetch :

<?php
session_start();
require("bddconnect.php");

if( isset( $_GET['id_oeuvre'] ) and $_GET['id_oeuvre'] > 0 ) {
	$reponse = $bdd->prepare('SELECT nom_oeuvre, synopsis_oeuvre FROM oeuvres where id_oeuvre = :id_oeuvre');
	$reponse->bindValue('id_oeuvre', $_GET['id_oeuvre'], PDO::PARAM_INT);
	$reponse->execute();
	
	$oeuvre = $reponse->fetch();
	$reponse->closeCursor();
}
?>
<html>
	<head>
		<meta charset="utf-8">
		<link rel="stylesheet" href="../style.css"/>
		<title><?php echo htmlspecialchars($oeuvre['nom_oeuvre']); ?></title>
	</head>
	<body>
		<div class="profil" align="center">
			<?php echo htmlspecialchars($oeuvre['nom_oeuvre']); ?>
			<br/><br/>
			<?php echo htmlspecialchars($oeuvre['synopsis_oeuvre']); ?>
		</div>
	</body>
</html>

Je te conseille de (re)lire le cours PHP/MySQL sur les méthodes PDO :

https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/lire-des-donnees-2

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
19 septembre 2017 à 10:36:45

Bonjour, après lecture du cours et quelques modif j'ai enfin réussi à faire se que je voulais faire.

Un grand merci a toi de m'avoir bien dépanné !

Sujet Résolu :p

-
Edité par SartVille 19 septembre 2017 à 10:37:15

  • Partager sur Facebook
  • Partager sur Twitter