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