Bonjour tout le monde ! j'ai un petit souci au niveau de mon code source, en fait ce que j'essaie de faire c'est de lire les informations d'un fichier txt ou autres et récupérer les infos séparé par une "," de chaque lignes dans un tableau et ensuite les insérer avec une requête préparer dans la bdd, de la table clible mais seulement je rencontre ce problème " [23502] : SQLSTATE[23502]: not null violation: 7 ERROR: null value in column "lie_region" violates not-null contraint DETAIL: Failing row contains (309, nul, nul, nul, nul)." . Ça dit qu'au niveau de la colonne lie _region la valeur est nulle, or je ne comprends pas car quand je fais un var_dump($files) j'ai bien du contenu. Je vous ai mis les screens en pièce jointe, merci par avance de vos réponses.
try{
$fileName = $_FILES['fichier']['name'];
$files = file('../save_Data/'.$fileName);
$data_array = array();
//var_dump($files);
foreach($files as $line)
{
$array_line = explode(",", $line);
var_dump($array_line);
if (count($array_line) >= 2)
{
$data_array[$array_line[0]] = $array_line[1];
//strcmp(array_line[0],'Ile de France')
if (!empty($data_array) ) {
echo "Entré dans la condition";
$req = 'INSERT INTO public.lieu (lie_region, lie_adresse, lie_ville, lie_code_postal) VALUES(:lie_region, :lie_adresse, :lie_ville, :lie_code_postal)';
$stm=$this->db->prepare($req);
$stm->bindParam(':lie_region', $data_array['lie_region'], PDO::PARAM_STR);
$stm->bindParam(':lie_adresse', $data_array['lie_adresse'], PDO::PARAM_STR);
$stm->bindParam(':lie_ville', $data_array['lie_ville'], PDO::PARAM_STR);
$stm->bindParam(':lie_code_postal', $data_array['lie_code_postal'], PDO::PARAM_STR);
$stm->execute();
$data_array = array();
}
else
{
echo "La requête ne s'est pas executé !!!";
}
}
}
}
catch(PDOException $e)
{
die('<p>Erreur lors de l\'insertion à la base de données : Erreur [' .$e->getCode(). '] :' . $e->getMessage() .'</p>' );
}
Tu n'as pas besoin de recréer un tableau tu peux boucler directement sur $files.
Mais surtout quelle dommage d'utiliser la requête préparée de la sorte !
Il faut la sortir de la boucle, ainsi que les bindParam, et ne boucler que sur les valeurs et l'execute.
- Edité par philodick il y a 7 minutes
Je retire donc tout le bloque de la requête de la boucle foreach et j'ai enlevé aussi le tableau mais par contre comment je boucle sur $files et les valeurs directement ?
try{
$fileName = $_FILES['fichier']['name'];
$files = file('../save_Data/'.$fileName);
//var_dump($files);
foreach($files as $line)
{
$array_line = explode(",", $line);
var_dump($array_line);
}
//strcmp(array_line[0],'Ile de France')
if (!empty($data_array) ) {
echo "Entré dans la condition";
$req = 'INSERT INTO public.lieu (lie_region, lie_adresse, lie_ville, lie_code_postal) VALUES(:lie_region, :lie_adresse, :lie_ville, :lie_code_postal)';
$stm=$this->db->prepare($req);
$stm->bindParam(':lie_region', $data_array['lie_region'], PDO::PARAM_STR);
$stm->bindParam(':lie_adresse', $data_array['lie_adresse'], PDO::PARAM_STR);
$stm->bindParam(':lie_ville', $data_array['lie_ville'], PDO::PARAM_STR);
$stm->bindParam(':lie_code_postal', $data_array['lie_code_postal'], PDO::PARAM_STR);
$stm->execute();
$data_array = array();
}
else
{
echo "La requête ne s'est pas executé !!!";
}
}
catch(PDOException $e)
{
die('<p>Erreur lors de l\'insertion à la base de données : Erreur [' .$e->getCode(). '] :' . $e->getMessage() .'</p>' );
}
Je viens de tester ça et il y a une nouvelle érreur : Erreur lors de l'insertion à la base de données : Erreur [22021] :SQLSTATE[22021]: Character not in repertoire: 7 ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x65 0x20.
Est-ce qu'il faut modifer les caractères avec accents dans le fichier directement ?je souhaite les intégrer telle qu'il sont dans t la bdd,
y aurait il un moyen d'encoder le contenu du fichier ?
soit tu réencodes le fichier ou ce que tu en lis au fur et à mesure (iconv)
soit tu passes ta connexion MySQL en latin1 (mais uniquement pour réaliser cet import)
- Edité par julp il y a environ 21 heures
J'ai utiliser la fonction mb_convert_encoding() dans la quelle je passe en paramètre un tableau qui contient un ensemble de jeux de caractères et ma variable de lecture du fichier et cela fonctionne
Ce ne serait pas du luxe que tu marques ton sujet comme résolu, c'est d'ailleurs indiqué dans les règles du forum.
Si les réponses apportées par les autres membres (ou votre propre recherche) vous ont permis de trouver une réponse à votre question, vous devez le signaler en cliquant sur le bouton "Résolu" tout en haut à droite de votre sujet.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Ce ne serait pas du luxe que tu marques ton sujet comme résolu, c'est d'ailleurs indiqué dans les règles du forum.
Si les réponses apportées par les autres membres (ou votre propre recherche) vous ont permis de trouver une réponse à votre question, vous devez le signaler en cliquant sur le bouton "Résolu" tout en haut à droite de votre sujet.
Salut merci pour le rappel mais en fait je n'avait pas poser toute mes question, .
J'ai cette erreur "Fatal error: Uncaught RuntimeException: SplFileObject::__construct(../save_Data/'.2017-05-29_PE.xls): failed to open stream: No such file or directory in C:\wamp64\www\VD\modele\Pretreatment.class.php on line 135 " et "untimeException: SplFileObject::__construct(../save_Data/'.2017-05-29_PE.xls): failed to open stream: No such file or directory in C:\wamp64\www\VD\modele\Pretreatment.class.php on line 135" , dois-je comprendre qu'il faudrait donner la permission avec un truc du genre CHMOD 777 ? Si oui comment je dois m'y prendre ? merci par avance.
try
{
$fileName = $_FILES['fichier']['name'];
$files = "../save_Data/'.$fileName";
$csv = new SplFileObject($files); // On instancie l'objet SplFileObject
$csv->setFlags(SplFileObject::READ_CSV); // On indique que le fichier est de type CSV
$csv->setCsvControl(','); // On indique le caractère délimiteur, ici c'est la virgule
/**
* Préparation de la requête avec les paramètres.
*/
$nox = 'INSERT INTO public.nox_donnes_brutes (nox_date, nox_no_ppb, nox_no2_ppb, nox_nox_ppb) VALUES(:nox_date, :nox_no_ppb, :nox_no2_ppb, :nox_nox_ppb)';
$stm = $this->db->prepare($nox);
$stm->bindParam('nox_date', $nox_date, PDO::PARAM_STR);
$stm->bindParam('nox_no_ppb', $nox_no_ppb, PDO::PARAM_STR);
$stm->bindParam('nox_no2_ppb', $nox_no2_ppb, PDO::PARAM_STR);
$stm->bindParam('nox_nox_ppb', $nox_nox_ppb, PDO::PARAM_STR);
foreach ($csv as $line)
{
$character_sets = array("ISO-10646", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-9", "ISO-8859-10",
"ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "PC1250", "PC1251", "PC1252", "PC1253", "PC1254", "PC1255", "PC1256", "PC1257",
"PC1258", "Windows-1252", "UTF-8", "UTF-16", "UTF-32", "ASCII", "TOA5", "TOB1", "UTF-EBCDIC", "CESU-8", "BOCU-1");
$convert_files = mb_convert_encoding($line, 'UTF-8', $character_sets);
$nox_date = $convert_files[0];
$nox_no_ppb = $convert_files[1];
$nox_no2_ppb = $convert_files[2];
$nox_nox_ppb = $convert_files[3];
$stm->execute();
}
}
catch(PDOException $e)
{
die('Erreur lors de l\'insertion des données : Error ['. $e->getCode().'] ' . $e->getMessage() .'</p>');
}
Non, il te dit que le fichier n'existe pas. Mais il n'y a pas de move_uploaded_file ? Pourquoi tu n'utilises pas directement $_FILES['fichier']['tmp_name'] sauf si le but est de conserver le fichier CSV ?
PS : la (prétendue) détection du jeu de caractères par mbstring est survendue, elle est à des années lumières de ce qu'offre la bibliothèque ICU : elle sera incapable de faire la différence entre tous ces jeux de caractères. Je ne sais même pas si elle serait capable de distinguer de l'UTF-8, pourtant caractéristique, et un jeu comme ISO-8859-1. En tout cas, personne ne saura reconnaître un jeu d'un autre entre les ISO* et CP*. J'ai le regret de te dire que ta liste ne sert strictement à rien. Elle serait limitée à UTF-8 (+ UTF-16 à la rigueur) et CP1252, oui mis là tu te mets le doigt dans l'oeil si tu t'attends à un miracle de sa part. Le problème c'est que tu prends le risque à ce qu'elle s'arrête sur le premier de ta liste et que ça donne n'importe quoi derrière ...
comprendre qu'il faudrait donner la permission avec un truc du genre CHMOD 777 ? Si oui comment je dois m'y prendre ? merci par avance.
Non, si tu lis bien le message d'erreur, il y est dit :
failed to open stream: No such file or directory
Par conséquent le fichier où son répertoire n'existe pas.
La raison peut être ce que te dit julp, tu as un point dans le chemin qui n'a rien à y faire, tu as aussi une simple quote qui te pose obligatoirement problème.
De plus, il est préférable de donner le chemin absolu et non relatif.
- Edité par Lartak 17 mai 2019 à 17:14:54
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Non, il te dit que le fichier n'existe pas. Mais il n'y a pas de move_uploaded_file ? Pourquoi tu n'utilises pas directement $_FILES['fichier']['tmp_name'] sauf si le but est de conserver le fichier CSV ?
PS : la (prétendue) détection du jeu de caractères par mbstring est survendue, elle est à des années lumières de ce qu'offre la bibliothèque ICU : elle sera incapable de faire la différence entre tous ces jeux de caractères. Je ne sais même pas si elle serait capable de distinguer de l'UTF-8, pourtant caractéristique, et un jeu comme ISO-8859-1. En tout cas, personne ne saura reconnaître un jeu d'un autre entre les ISO* et CP*. J'ai le regret de te dire que ta liste ne sert strictement à rien. Elle serait limitée à UTF-8 (+ UTF-16 à la rigueur) et CP1252, oui mis là tu te mets le doigt dans l'oeil si tu t'attends à un miracle de sa part. Le problème c'est que tu prends le risque à ce qu'elle s'arrête sur le premier de ta liste et que ça donne n'importe quoi derrière ...
- Edité par julp 17 mai 2019 à 17:22:45
Merci pour ta réponse, je ne vois pas comment installer la bibliothèque ICU pour PHP il me semble que c'est surtout utilisé avec les langages C,C++ et Java.
La bibliothèque ICU est (partiellement) interfacée par l'extension intl et, malheureusement, les fonctionnalités que j'évoque, ne le [interfacées] sont pas par PHP (du moins pour le moment).
De toute façon, une auto-détection, n'est pas fiable non plus : plus le texte sera long et caractéristique plus elle sera exacte (ICU se base sur la recherche/fréquence de certains groupes de lettres de mémoire pour en trouver la langue et associer le jeu correspondant - sauf pour les jeux caractéristiques facilement identifiables comme les UTF-*).
Bref, je ne cherchais pas à dire qu'il fallait utiliser ICU mais que mbstring, bien moins avancée, est loin d'être capable de distinguer "tout ça".
La bibliothèque ICU est (partiellement) interfacée par l'extension intl et, malheureusement, les fonctionnalités que j'évoque, ne le [interfacées] sont pas par PHP (du moins pour le moment).
De toute façon, une auto-détection, n'est pas fiable non plus : plus le texte sera long et caractéristique plus elle sera exacte (ICU se base sur la recherche/fréquence de certains groupes de lettres de mémoire pour en trouver la langue et associer le jeu correspondant - sauf pour les jeux caractéristiques facilement identifiables comme les UTF-*).
Bref, je ne cherchais pas à dire qu'il fallait utiliser ICU mais que mbstring, bien moins avancée, est loin d'être capable de distinguer "tout ça".
- Edité par julp il y a environ 1 heure
Ah oui d'accord, désolé de vous déranger encore une fois, je suis bloqué sur cette érreur '[22P02] SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "" ' et lorsque je tente de tester les variables avec les fonctions is_null et is_int les érreurs disparaisse mais en revanche il n'y aucune insertion dans la table. Que faire ?
Tu tombes sur une ligne de ton CSV qui n'a pas 4 "colonnes" s'en suit que tu te retrouves avec la chaîne vide or ton sql_mode doit le refuser. Tu as fait un var_dump ou autre pour voir quelle ligne de ton CSV produit ça ?
Tu tombes sur une ligne de ton CSV qui n'a pas 4 "colonnes" s'en suit que tu te retrouves avec la chaîne vide or ton sql_mode doit le refuser. Tu as fait un var_dump ou autre pour voir quelle ligne de ton CSV produit ça ?
Oui en effet j'ai une ligne vide dans mon csv, et je vais utiliser la méthode seek() pour lire le csv à partir de la ligne que je veux.
Selon vous il existe une fonction ne lit seulement les ligne qui contiennent des colonnes non vide ?
Et pour les lignes vides ? D'ailleurs, désolé, je ne sais pas pourquoi, j'étais resté sur fgetcsv mais SplFileObject fonctionne de manière similaire :
> Une ligne vide d'un fichier CSV sera retourné sous la forme d'un tableau contenu un seul champ NULL sauf si vous utilisez SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, auquel cas, les lignes vides seront ignorées.
Tu devrais utiliser array_map pour convertir les valeurs de toutes les colonnes d'un coup. Ce serait moins répétitif.
Et ton prepare ainsi que tes bindParam ne devraient pas être dans la boucle mais avant.
Il y a plusieurs choses que tu devrais mettre en dehors de la boucle, la variable character_sets, ainsi que la variable nox et :
$stm = $this->db->prepare($nox);
Par contre, tu définies des variables comme NULL, mais est-ce que les colonnes correspondantes sont nullable ? Surtout que quand tu utilises la méthode bindParam, tu indiques que ça doit être un int, sauf qu'avec ton code il se peut que certaines variables soient NULL.
- Edité par Lartak 21 mai 2019 à 14:33:10
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Mais, d'ailleurs, $line est un tableau de chaînes en principe, non ?
Donc tu ne peux sûrement pas utiliser mb_convert_encoding comme ça (d'où ma suggestion d'employer array_map). Ca ne te renvoie pas la chaîne "Array" pour $convert_files (et les $convert_files[0]/[1]/[2]/[3] les chaînes "A"/"r"/"r"/"a") ?
> Surtout que quand tu utilises la méthode bindParam, tu indiques que ça doit être un int, sauf qu'avec ton code il se peut que certaines variables soient NULL.
A tester mais je pense que NULL a précédence sur le type (ce dernier n'étant pas non plus strictement respecté suivant le pilote PDO). Surtout qu'il me semble qu'il était question de déprécier PDO::PARAM_NULL.
EDIT : j'ai retrouvé la RFC mais elle est marquée inactive
Bonjours tout le monde , j’avais une petite 'grande' question a posé, où est-ce que je doit indiquer le nom et le chemin de mon fichier sachant que le fichier peux se trouver n’importe où lorsqu'il est chargé au niveau du formulaire.
J'applique l'architecture MVC avec mon index qui sert de routeur. En fait j'ai vraiment du mal à faire lecture de mon fichier et l'intégration de sont contenu dans la base de données en codant logiquement les méthodes des couche modèle et contrôleur.
Pour l'instant ce que j'ai fait, la méthode du modèle qui est appeler par le méthode du contrôleur qui lui même est appeler dans mon index.
Bonjours tout le monde , j’avais une petite 'grande' question a posé, où est-ce que je doit indiquer le nom et le chemin de mon fichier sachant que le fichier peux se trouver n’importe où lorsqu'il est chargé au niveau du formulaire.
J'applique l'architecture MVC avec mon index qui sert de routeur. En fait j'ai vraiment du mal à faire lecture de mon fichier et l'intégration de sont contenu dans la base de données en codant logiquement les méthodes des couche modèle et contrôleur.
Pour l'instant ce que j'ai fait, la méthode du modèle qui est appeler par le méthode du contrôleur qui lui même est appeler dans mon index.
Merci par avance
Dans le fichier index, tu pourrais par exemple définir une constante qui aura comme valeur le chemin absolu du dossier de ton projet, puis par la suite tu pourrais utiliser cette constante pour récupérer le chemin qui mène directement dans le dossier de ton projet, de cette manière tu auras une base correcte.
- Edité par Lartak 4 juillet 2019 à 12:45:33
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Ce que je veux dire c'est que lorsque l'utilisateur va charger sont fichier via le formulaire, le fichier peut être n'importe où dans son disque-dur, et son chemin n'est pas déterminer à l'avance dans le code.
Quand il soumet le formulaire tu obtiens plusieurs informations sous forme de tableau concernant le fichier.
- Edité par Lartak il y a environ 1 heure
define(CHEMIN1, realpath('index.php'));
Concretement je ne vois pas quand est-ce que j'aurais a l'utiliser, comment est-ce que je pourrais coder ça dans le modèle la lecture du fichier sans spécifier le chemin d'origine du fichier chargé ?
Intégration de données de fichier txt dans une Bdd
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
N'oubliez pas d'activer les erreurs PDO.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Non, si tu lis bien le message d'erreur, il y est dit :
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.