Les contraintes de clé primaire et etrangère

Signaler
Messages postés
19
Date d'inscription
mardi 14 août 2018
Statut
Membre
Dernière intervention
9 janvier 2019
-
Messages postés
19
Date d'inscription
mardi 14 août 2018
Statut
Membre
Dernière intervention
9 janvier 2019
-
J'ai un problème avec les cles dans mysql dont j'arrive pas à résoudre.
Aider moi.Je veux qu'un membre puisse poster un fichier Sur mon site voici le code d'erreur qu'on m'affiche: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 1' in C:\wamp\www\blog\code\transfert.php:30 Stack trace: #0 C:\wamp\www\blog\code\transfert.php(30): PDOStatement->execute(Array) #1 {main} thrown in C:\wamp\www\blog\code\transfert.php on line 30

-- Structure de la table `fichier_pdf`

4 réponses

Messages postés
28886
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 mai 2020
328
Sans voir ton code php...difficile de te répondre... mais visiblement tu as mis le champ id dans ta requête insert... retire le.
Messages postés
28886
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 mai 2020
328
Plusieurs choses qui ne vont pas dans ton code.....
Dajà
<meta charset="utf-8">

Cette ligne de code se place dans le HEAD de ta page HTML. Pas comme ça en plein milieu de ta page PHP.
Si tu veux "forcer" le charset en php.. tu peux, éventuellement, utiliser :
header('Content-Type: text/html; charset=utf-8');


Ensuite, htmlspecialchars est une instruction à utiliser UNIQUEMENT pour l'affichage et jamais pour l'insertion en BDD

Et enfin, pour gérer correctement les erreurs en PDO il ne faut pas utiliser de OR DIE mais des blocs TRY/CATCH
Je t'invite à lire et à appliquer ce qui se trouve dans ces deux liens :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
et
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


Par rapport à tes soucis...
Duplicate entry '0-0' for key 1

Cela indique que tu as plusieurs fois la même valeur (ici 0 ) dans ton champ primary key...


Voici ton code un peu amélioré :
<?php
session_start();

//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//connexion à la bdd
require'config.php';

/**
* Fonction pour éxécuter une insertion en BDD
* $sql : (string) requête SQL à executéer
* $datas : (array) Variables à utiliser pour la requête préparée
* $returnId: (bool) : Si TRUE, retourne l'ID nouvelle créé par la requête d'insert.
*                  Le mettre à FALSE si la table n'a pas d'auto-incrément
* return : Si $returnId l'id nouvellement créé
*/
function db_insert($sql,$datas=NULL,$returnId=TRUE){
  global $bdd;
  try{
    $requete = $bdd->prepare($sql) ;
    $requete->execute($datas) ;
    if($returnId){
      return $bdd->->lastInsertId(); //id auto incrémenté généré par l'insert
    }else{
      return true;
    }
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
     print_r($datas);
     exit();
  }
}

//récupération PROPRE des variables AVANT de les utiliser
$fichier = !empty($_FILES['fichier']) ? $_FILES['fichier'] : NULL;
$type= !empty($_POST['type']) ? $_POST['type'] : NULL;
$categorie= !empty($_POST['categorie']) ? $_POST['categorie'] : NULL;
$titre= !empty($_POST['titre']) ? $_POST['titre'] : NULL;    
$id_membres = "1"; // tu dois compléter cette valeur... Surement une variable de session non ? $id_membres = !empty($_SESSION['id_membres']) ? !empty($_SESSION['id_membres'] : NULL;


if($id_membres && $fichier && $fichier['error']==0)){   
     $file_name=$fichier['name'];
     $file_size=$fichier['size'];
     $file_tmp_name=$fichier['tmp_name'];
     $file_extention=strrchr($file_name,".");
     $file_dest='../mediat/pdf/'.$file_name;
     $file_dests='../mediat/video/'.$file_name;
     $extention=array('.pdf','.doc','.ppt','.mp4','.flv','.msi','.avi');
     
    //verification de l'extention du fichier
    if(in_array($file_extention,$extention)){
        //Upload d'un fichier pdf
        if($type=='pdf'){
            //verification de la categorie du fichier
            if($categorie=='programmation') {
                //transfert du fichier vers sa destinaton final
                if(move_uploaded_file($file_tmp_name,$file_dest)){
                  $newId = db_insert('INSERT INTO fichier_pdf(nom,titre,categorie,chemin_pdf,taille) VALUE(?,?,?,?,?)',array($file_name,$titre,$categorie,$file_dest,$file_size));
                  //insertion de la date
                  if($newId){
                    db_insert("INSERT INTO poster(id_pdf,date_ajout,heure_ajout,id_membres) VALUE(?,?,?,?)",array($newId,CURDATE(),CURTIME(),$id_membres),FALSE);
                    echo"Envoi du fichier reussi!";
                  }else{
                    echo"Erreur lors de l'insertion du fichier dans la bdd";
                  }
               }
             }
            }
        }
}


Pour finir... plutôt que d'avoir plusieurs tables pour gérer les différents imports (poster, poster1,poster2 )
Pas besoin non plus de stocker séparément la date et l'heure... le champ DATETIME fera les deux ensembles
La structure de la table serait donc :


CREATE TABLE IF NOT EXISTS `poster` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `id_membres` bigint(20) DEFAULT NULL,
  `id_file` bigint(20) DEFAULT NULL,
  `date_ajout` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id_file` (`id_file`),
  KEY `id_membres` (`id_membres`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


Ce qui changera légèrement ton code
if($newId){
  db_insert("INSERT INTO poster(id_file,date_ajout,id_membres) VALUE(?,NOW(),?)",array($newId,$id_membres),FALSE);
  echo"Envoi du fichier reussi!";
}else{
  echo"Erreur lors de l'insertion du fichier dans la bdd";
}


NB, Lorsque tu postes du code sur le forum... tu dois utiliser LES BALISES DE CODE.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Messages postés
19
Date d'inscription
mardi 14 août 2018
Statut
Membre
Dernière intervention
9 janvier 2019

Voici le code Jordane45
<?php session_start();?>
<meta charset="utf-8">
<?php
//connexion à la bdd
require'config.php';
if(!empty($_FILES['fichier']) and ($_FILES['fichier']['error']==0))
{
    
     $file_name=$_FILES['fichier']['name'];
    $file_size=$_FILES['fichier']['size'];
    $titre=htmlspecialchars(strip_tags($_POST['titre']));
     $file_extention=strrchr($file_name,".");
     $file_tmp_name=$_FILES['fichier']['tmp_name'];
     $file_dest='../mediat/pdf/'.$file_name;
     $file_dests='../mediat/video/'.$file_name;
     $extention=array('.pdf','.doc','.ppt','.mp4','.flv','.msi','.avi');
    //verification de l'extention du fichier
    if(in_array($file_extention,$extention))
    {
        //Upload d'un fichier pdf
        if(isset($_POST['type']) AND ($_POST['type']=='pdf'))
        {
            //verification de la categorie du fichier
            if(isset($_POST['categorie']) AND $_POST['categorie']=='programmation')
            {
                $categorie="programmation";
                //transfert du fichier vers sa destinaton final
                if(move_uploaded_file($file_tmp_name,$file_dest))
                {
                 $req=$bdd->prepare('INSERT INTO fichier_pdf(nom,titre,categorie,chemin_pdf,taille) VALUE(?,?,?,?,?)') or die(print_r($bdd->errorinfo()));
                     $req->execute(array($file_name,$titre,$categorie,$file_dest,$file_size)) or die(print_r($req->errorinfo()));
                    //insertion de la date
                    $insert=$bdd->prepare("INSERT INTO poster(date_ajout,heure_ajout) VALUE(?,?)") or die(print_r($bdd->errorinfo()));
                    $insert->execute(array(CURDATE(),CURTIME())) or die(print_r($insert->errorinfo()));
                    echo"Envoi du fichier reussi!";
               }
             }
            }
        }
}

Messages postés
28886
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 mai 2020
328
Tu as oublié de mettre ton champ id en auto incrémente
CREATE TABLE `fichier_pdf` (
`id_pdf` int(11) NOT NULL,
Messages postés
19
Date d'inscription
mardi 14 août 2018
Statut
Membre
Dernière intervention
9 janvier 2019

J'ai mis l'id en auto incrémente ça marche mais l'id de la table fichier_pdf et membres ne sont pas les même dans poster , l'id se trouvant labas est (0,0) de plus si je veux poster un nouveau fichier ça m'affiche encore ce code: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0-0' for key 1' in C:\wamp\www\blog\code\transfert.php:33 Stack trace: #0 C:\wamp\www\blog\code\transfert.php(33): PDO->exec('INSERT INTO pos...') #1 {main} thrown in C:\wamp\www\blog\code\transfert.php on line 33
voici a nouveau mon code

<?php session_start();?>
<meta charset="utf-8">
<?php
//connexion à la bdd
require'config.php';
if(!empty($_FILES['fichier']) and ($_FILES['fichier']['error']==0))
{

$file_name=$_FILES['fichier']['name'];
$file_size=$_FILES['fichier']['size'];
$titre=htmlspecialchars(strip_tags($_POST['titre']));
$file_extention=strrchr($file_name,".");
$file_tmp_name=$_FILES['fichier']['tmp_name'];
$file_dest='../mediat/pdf/'.$file_name;
$file_dests='../mediat/video/'.$file_name;
$extention=array('.pdf','.doc','.ppt','.mp4','.flv','.msi','.avi');
//verification de l'extention du fichier
if(in_array($file_extention,$extention))
{
//Upload d'un fichier pdf
if(isset($_POST['type']) AND ($_POST['type']=='pdf'))
{
//verification de la categorie du fichier
if(isset($_POST['categorie']) AND $_POST['categorie']=='programmation')
{
$categorie="programmation";
//transfert du fichier vers sa destinaton final
if(move_uploaded_file($file_tmp_name,$file_dest))
{
$req=$bdd->prepare('INSERT INTO fichier_pdf(nom,titre,categorie,chemin_pdf,taille) VALUE(?,?,?,?,?)') or die(print_r($bdd->errorinfo()));
$req->execute(array($file_name,$titre,$categorie,$file_dest,$file_size)) or die(print_r($req->errorinfo()));
//insertion de la date
$bdd->exec("INSERT INTO poster(date_ajout) VALUE(NOW())") or die(print_r($bdd->errorinfo()));
echo"Envoi du fichier reussi!";
}
}
}
}
}
Messages postés
19
Date d'inscription
mardi 14 août 2018
Statut
Membre
Dernière intervention
9 janvier 2019

En theorie on dit que dans une association 1,n ou 0,n l'association consernée devient une table et sa clé est la concatenation de la clé des deux table.Alors peux tu m'expliquer comment se passe l'insertion de ces clé dans mysql?