Les contraintes de clé primaire et etrangère

mouss.com Messages postés 19 Date d'inscription mardi 14 août 2018 Statut Membre Dernière intervention 9 janvier 2019 - 24 août 2018 à 21:55
mouss.com Messages postés 19 Date d'inscription mardi 14 août 2018 Statut Membre Dernière intervention 9 janvier 2019 - 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`

4 réponses

jordane45 Messages postés 37545 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 juin 2023 341
24 août 2018 à 22:21
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.
1
jordane45 Messages postés 37545 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 juin 2023 341
25 août 2018 à 09:37
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

1
mouss.com Messages postés 19 Date d'inscription mardi 14 août 2018 Statut Membre Dernière intervention 9 janvier 2019
Modifié le 24 août 2018 à 23:12
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!";
               }
             }
            }
        }
}

0
jordane45 Messages postés 37545 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 juin 2023 341
24 août 2018 à 23:14
Tu as oublié de mettre ton champ id en auto incrémente
CREATE TABLE `fichier_pdf` (
`id_pdf` int(11) NOT NULL,
0
mouss.com Messages postés 19 Date d'inscription mardi 14 août 2018 Statut Membre Dernière intervention 9 janvier 2019
25 août 2018 à 03:37
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!";
}
}
}
}
}
0
mouss.com Messages postés 19 Date d'inscription mardi 14 août 2018 Statut Membre Dernière intervention 9 janvier 2019
26 août 2018 à 12:11
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?
0