Les contraintes de clé primaire et etrangère

Messages postés
16
Date d'inscription
mardi 14 août 2018
Dernière intervention
5 octobre 2018
- - Dernière réponse : mouss.com
Messages postés
16
Date d'inscription
mardi 14 août 2018
Dernière intervention
5 octobre 2018
- 26 août 2018 à 12:11
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`
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
1
Merci
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.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
1
Merci
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

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
16
Date d'inscription
mardi 14 août 2018
Dernière intervention
5 octobre 2018
0
Merci
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!";
               }
             }
            }
        }
}

jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
Tu as oublié de mettre ton champ id en auto incrémente
CREATE TABLE `fichier_pdf` (
`id_pdf` int(11) NOT NULL,
mouss.com
Messages postés
16
Date d'inscription
mardi 14 août 2018
Dernière intervention
5 octobre 2018
-
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!";
}
}
}
}
}
Commenter la réponse de mouss.com
Messages postés
16
Date d'inscription
mardi 14 août 2018
Dernière intervention
5 octobre 2018
0
Merci
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?
Commenter la réponse de mouss.com

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.