Php: inserer des donnees dans la base ?

simou -  
 simou -
Bonjour,
je suis entrain de faire un script en php qui sert à insérer des des données lu d'un fichier .txt
<?php 
        require_once("xxx/xxx/db_connect.inc.php"); 
 require_once('xxx/xxx//inc_Sitexx.php');  

 $connexion=db_connexion();  

$fichier_ouvrir=fopen("permis.txt","r"); 
//$i=1; 
while (!feof($fichier_ouvrir)) 
{ 
 $var_id=fgets($fichier_ouvrir,11); 
 $var_titre_archt=fgets($fichier_ouvrir,200); 
 //echo "ligne numero".$i.":".$var_id." ".$var_titre_archt."<br/>";         // affichage du $var_id 
 echo "".$var_id." ".$var_titre_archt."<br/>"; 
 //echo $var_titre_archt;  
 //$i++; 
  
   } 
fclose($fichier_ouvrir);

$sql = "INSERT INTO architecte VALUES ('$var_id','$var_titre_archt')";   

// on insere le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die) 
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());   
  
// on ferme la connexion à la base 
mysql_close();          
?> 
les donnes vient d'être inseré dans la base. 

mais je rien trouver !!
qui peux m'aider s'il vous plait ??

merci d'avance


A voir également:

5 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Salut simou,

Déjà, dans la ligne :

fclose($fichier_ouvrir); ?>

retire le "?>".


Dal
0
simou
 
oui c'est vrai c'est une faute en copiant le code
0
Nico9275
 
Salut tu as aussi bcp de lignes que tu as mis en commentaire "//" devant 2 echo par exemple ainsi que devant $i=1 et $i++
Ensuite un conseil utilise plutôt \n pour les retours à la ligne ça vaut mieux je pense plutôt que d'utiliser <\br>.
Encore une erreur sauf si tu as mal recopié le code mais quand tu fais des commentaires sur plusieurs lignes tu dois utiliser /* (contenu du commentaire) */ et non pas // qui ne fonctionne que si le com tien sur une ligne.
Voila après je vois pas d'erreur dans ton code, je ne suis encore qu'un débutant en php. J'espère t'avoir été utile.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Nico,

simou a visiblement fait des tests et a laissé des lignes de code commentées après. Mais je suis d'accord avec toi, s'il n'en a plus besoin, il peut les retirer.

Le \n dans une chaîne ne donne pas un retour à la ligne à l'affichage par un navigateur (même si le code html généré se trouve sur deux lignes). Pour aller à la ligne, <br/> est correct (ou <p> texte</p>).

Le commentaire // qui semble aller sur deux lignes est probablement sur une seule (c'est le forum CCM qui va à la ligne au bout de l'espace alloué à l'affichage).

Dal
0
simou
 
Alors les amis aidez moi à résoudre ce problème
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Salut simou,

Avec le bon code sur lequel tu as un problème, cela irait mieux.

1.

S'il y a un message d'erreur affiché, dis nous quel est ce message.

Si tu n'as aucun message d'erreur sur la page générée, consulte les logs de ton serveur pour voir, et vois ce qu'il y a dedans.

2.

Peux-tu nous dire quelle est la structure de la table "architecte" (résultat de la requête SQL "show columns from architecte;"). Dans le doute, il est aussi toujours mieux de nommer les colonnes où tu insères les données dans ta requete "insert".

3.


Pourquoi ta requête SQL est-elle à l'extérieur d'une boucle while qui est sensée récupérer des données à insérer. Là ce code n'insèrerait, en tout état de cause, que le dernier couple de données.

4.

S'il y a une apostrophe dans tes variables, la requête SQL ne va pas aimer. Pour te prémunir contre cela, il faut échapper tes variables.

Encore faut-il que ce que tu veux insérer corresponde au bon type de données définit dans la table.


Dal
0
simou
 
merci Dal de me repondre enfaite j'ai fait un rectification et voila mon nouveau code qui marche mais j'ai des autre soucis:(la table eleve contient 2 champs)
<?php
// Connexion db 
$fichier_ouvrir = @fopen("permis.txt", "r");
if ($fichier_ouvrir) {
    while (!feof($fichier_ouvrir)) {
        $var_id= rtrim(fgets($fichier_ouvrir, 11));
	$var_nom= rtrim(fgets($fichier_ouvrir, 200));
		 
        mysql_query("INSERT INTO eleve VALUES ('$var_id','$var_nom)");
    } 
    fclose($fichier_ouvrir);
}else {
die('impossible d ouvrir le fichier');
}
// Fermeture DB
?>

le problème ici c'est que quand j'insère et je vérifie dans la base je trouve qu'il insere par exemple 0--->10 id avec leur nom et il insere des autres enregistrement par exemple 200, 510 ,430,35, 55,... avec des nom vide
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Salut simou,

Dans :

mysql_query("INSERT INTO eleve VALUES ('$var_id','$var_nom)");

il manque une apostrophe fermante à la fin de ta requête. Tu as aussi omis de mettre le contrôle d'erreur (or die ...).

Par ailleurs, comme je te l'ai dit plus haut, tu devrais échapper les chaînes de caractères avant de les mettre dans tes requêtes. Ne pas ne faire est le meilleur moyen de s'exposer à des attaques d'injection si la source des données peut être manipulée.

donc :

$st_query = sprintf("INSERT INTO eleve VALUES ('%s', '%s');", 
            mysql_real_escape_string($var_id), 
            mysql_real_escape_string($var_nom)); 
mysql_query($st_query) or die ('Erreur SQL ! Sur la requête $st_query<br />'.mysql_error());

Questions subsidiaires :

- Poste ton format de données dans le fichier texte. C'est très bizarre de récupérer les données comme tu le fais, il doit y avoir une meilleure façon.

- Si ta colonne dans laquelle doit s'insérer $var_id est destinée à accueillir des entiers, pourquoi y mets tu une chaîne ?

- Tu n'as pas posté la structure de la table "eleve" (résultat de la requête SQL "show columns from eleve;")


Dal
0
simou
 
merci encore de me répondre
- Poste ton format de données dans le fichier texte. C'est très bizarre de récupérer les données comme tu le fais, il doit y avoir une meilleure façon.
pouvez vous me donner une autre façon pour récupérer les données
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Non, je ne peux pas si tu ne me dis pas comment sont les données. Répond à la question s'il te plaît. S'il y a des choses confidentielles dedans, confidentialise les données. Mais j'ai besoin de savoir comment elles sont structurées dans ton fichier texte. Poste avec des balises de code (bouton <> du forum), afin de préserver la structure, les espaces, etc.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Salut simou,

Intuitivement, en supposant que ton fichier texte comporte une ligne par couple, et que chaque ligne ne comporte que ces deux informations, je pense que tu devrais plutôt faire un fgets pour récupérer la ligne entière (donc sans spécifier le nombre de caractères), puis manipuler ta chaîne en faisant un split pour récupérer les deux composantes.

Ton code utilise "rtrim", qui sert à supprimer des espaces. Les espaces ne sont pas de bons caractères séparateurs car ils peuvent de retrouver dans un nom. Si tu as la possibilité de modifier la structure de ton fichier texte, c'est mieux d'utiliser ";", "|" ou un autre caractère que tu ne risques pas de trouver dans tes données. La récupération des données sera simplifiée, et le risque d'erreurs plus limité.

Bien sûr, si tu n'as pas la possibilité d'agir sur le fichier texte, on va faire avec :-)

Voilà ce que je peux dire. Cependant, j'en suis réduit aux hypothèses car tu ne me donnes pour le moment aucune information sur la structure de tes données dans le fichier texte.


Dal
0
simou
 
merci Dal
en faite mon fichier .txt est constituer de code et le nom:
0 ali ben salah
1 xxxxx
2 yyyyy
...
voila
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
Salut simou,

Si tu fais :

$var_id= rtrim(fgets($fichier_ouvrir, 11));
$var_nom= rtrim(fgets($fichier_ouvrir, 200));

sur :

0 ali ben salah
1 xxxxx
2 yyyyy 

ton programme va récupérer :

INSERT INTO eleve VALUES ('0 ali ben','salah')
INSERT INTO eleve VALUES ('1 xxxxx','2 yyyyy')
INSERT INTO eleve VALUES ('','')

Ce qui n'est pas bon.

L'idéal est de séparer les données avec un caractère comme ";" et de faire un split, c'est ce qu'il y a de plus simple. Mais comme tu ne me dis pas si tu as la possibilité d'agir sur le fichier texte, je vais supposer que tu ne le peux pas. On peut alternativement utiliser les expressions régulières.

<?php

// Connexion db
$fichier_ouvrir = @fopen("permis.txt", "r");
if ($fichier_ouvrir) {
    while (!feof($fichier_ouvrir)) {
    $var_st= fgets($fichier_ouvrir);

       if ( preg_match("/([0-9]+)\s+(.*$)/", $var_st, $arr_result) )
       {
         $arr_result[1] = mysql_real_escape_string($arr_result[1]);
         $arr_result[2] = mysql_real_escape_string($arr_result[2]);
         mysql_query("INSERT INTO eleve VALUES ('$arr_result[1]','$arr_result[2]')") or die ('Erreur SQL ! Sur la requête $st_query<br />'.mysql_error());
       }
    }
    fclose($fichier_ouvrir);
}else {
die("impossible d'ouvrir le fichier");
}
// Fermeture DB

?>

et là, cela donne bien :

INSERT INTO eleve VALUES ('0','ali ben salah')
INSERT INTO eleve VALUES ('1','xxxxx')
INSERT INTO eleve VALUES ('2','yyyyy')

https://www.php.net/manual/en/function.preg-match.php

([0-9]+) : capture un ou plus caractères numériques à partir du début de ligne
\s+ : un ou plusieurs caractères blancs
(.*$) : capture la suite jusqu'à la fin de la ligne


Dal
0
simou
 
merci Dal c'est très intéressant ce que tu m'a dit j'ai copier ceci:
<?php

// Connexion db
$fichier_ouvrir = @fopen("permis.txt", "r");
if ($fichier_ouvrir) {
    while (!feof($fichier_ouvrir)) {
    $var_st= fgets($fichier_ouvrir);

       if ( preg_match("/([0-9]+)\s+(.*$)/", $var_st, $arr_result) )
       {
         $arr_result[1] = mysql_real_escape_string($arr_result[1]);
         $arr_result[2] = mysql_real_escape_string($arr_result[2]);
         mysql_query("INSERT INTO eleve VALUES ('$arr_result[1]','$arr_result[2]')") or die ('Erreur SQL ! Sur la requête $st_query<br />'.mysql_error());
       }
    }
    fclose($fichier_ouvrir);
}else {
die("impossible d'ouvrir le fichier");
}
// Fermeture DB

?>

mon texte contient des id et des nom en arabe le résultat est dans la table 1 pour le nom et 0 pour l'id , j'ai même tester mon code avec un fichier en français même résultat 0 en id et 1 dans le nom
c bizarre??
0