Insert into ne fonctionne pas [Résolu/Fermé]

Signaler
Messages postés
12
Date d'inscription
lundi 13 août 2012
Statut
Membre
Dernière intervention
15 novembre 2015
-
 Utilisateur anonyme -
Bonjour,

Je reviens vers vous pour un nouveau problème: insert into ne fonctionne pas. est-ce ma boucle et sa récupération qui sont beugués? Je cale sur le sujet depuis plusieurs heures maintenant et après diverses recherches sur internet, je ne trouve pas la solution.

Voici mon code:

mysql_connect("localhost", "root", "", "dbname=chrisvia");

//On récupère un fichier texte envoyé depuis une autre page

$file=$_POST["actes"];
if (file_exists($file))
{
//on ouvre ce fichier et on définit un paramètre $ligne
$lecture = fopen($file,"r");
$ligne=fgets($lecture, 4096);
$champ=explode("\t",$ligne);

while (!feof($lecture))
{

fgets($lecture);

$id_actes=$champ[0];
$id_actes="null";


$TypeActe=$champ[1];
if ($TypeActe=="")
{
$TypeActe="NULL";
}
$TypeActe=addslashes($TypeActe);

-------------------------------------------------------------------------------

$PrenomMereConjoint=$champ[25];
if ($PrenomMereConjoint=="")
{
$PrenomMereConjoint="NULL";
}
$PrenomMereConjoint=addslashes($PrenomMereConjoint);

$PhotoActe=$champ[26];
if ($PhotoActe=="")
{
$PhotoActe="NULL";
}
$PhotoActe=addslashes($PhotoActe);
}

//fin de la boucle

$req="INSERT INTO actes value('','".$TypeActe."', ---------------------------------------- '".$PrenomMereConjoint."','".$PhotoActe."')";

$result=mysql_query($req) or die("Impossible d'ajouter cette requete");

echo '<p style="text-align:center">Vous avez enregistré '.mysql_affected_rows().' acte(s) dans la base de données</p>';

}
else
{
echo 'Le fichier actes.txt n\'à pas été trouvé! Veuillez vérifier le nom et le chemin que vous avez saisis<br><br><br><input type="button" value="Fermer" onclick="window.close()">';
}

?>

//fin du code

Lorsque j'exécute le code, j'ai le message du die "Impossible d'ajouter cette requete" ce qui laisse supposer que tout se passe normalement jusque là. J'ai vérifié dans le serveur wamp, l'user root possède bien tousles privilèges. Alors, mauvaise syntaxe de insert into?
Si quelqu'un peut m'aider, qu'il en soit remercié par avance!

Christian

12 réponses

Messages postés
3926
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
27 octobre 2017
869
bonsoir christian820,
pas si simple de tout suivre mais respectes tu bien :

$req = "INSERT INTO nomtable (nomchamp1, ch2, ch3)
VALUES ( '$valpourch1', '$valch2', '$valch3') " ;
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
553
Date d'inscription
lundi 5 novembre 2007
Statut
Membre
Dernière intervention
9 juillet 2013
133
une petite correction s'impose ici:
Dans la requéte VALUES est appelé, mais pas VALUE !

$req="INSERT INTO actes VALUES('','".$TypeActe."', ---------------------------------------- '".$PrenomMereConjoint."','".$PhotoActe."')";  



"Le meilleur antivirus reste l'utilisateur"
Messages postés
12
Date d'inscription
lundi 13 août 2012
Statut
Membre
Dernière intervention
15 novembre 2015

Bonjour Webster95,

Merci pour ta réponse.
Effectivement, il y avait cette faute!
Je l'ai corrigée, et j'ai toujours le même résultat.

Christian

Bonjour

Tu ne te connectes pas correctement à ton serveur, et tu ne sélectionnes pas la base de données !

mysql_connect("localhost", "root", "") or die (mysql_error());
mysql_select_db("chrisvia") or die (mysql_error());

Tu as dû reprendre un code destiné aux fonctions mysqli et non pas mysql

Bonjour Le Père,

Merci pour ta réponse,

J'ai modifié le script de connexion au serveur, mai j'ai toujours le même problème . J'ai aucun message de non connexion au serveur.

Pour voir, j'ai ajouté un echo juste entre le while et la requête insert,

echo $TypeActe, $DateActe, $Nom, $Prenom, ......... ;

et il m'affiche la première ligne du fichier (qui en contient 14).

Je nage complètement!

Christian
Messages postés
553
Date d'inscription
lundi 5 novembre 2007
Statut
Membre
Dernière intervention
9 juillet 2013
133
Essaye de faire un echo de ta requete:

echo $req;


Ensuite, copie cette requete sur PhpMyAdmin et regarde l'erreur que tu retourne MySQL



C'est normal que tu ne voies que la première ligne
Tu fais une seule fois le $champ=explode("\t",$ligne); : tu ne le refais pas à chaque fois que tu lis une ligne ! donc $champ[0], etc... ne changent jamais.
D'ailleurs, pourquoi lire une première ligne en dehors de la boucle et les autres dans la boucle ? La logique m'échappe
De même, pourquoi faire le INSERT qu'après avoir tout lu ? tu ne vas insérer que la dernière ligne comme ça.

Le pere,

Merci pour tes réponses.

La connection à la base nese faisait pas suite à une virgule manquante entre deux champs values; problème détecté grace à ta methode .

Pour le reste, problème.
Si j'ai bien compris, tu mets $champ=explode("\t",$ligne); après l'accolade ouvante du while et le insezrt into avant l'accolade fermante .
J'ai testé et j'obtiens lo'insertion de ... 14 fois la preliere ligne! (le fichier à traiter contient 14 lignes).

J'ai bataillé tout l'après-midi la-dessus, revu la doc, mais je suis dans l'impasse.
Je pense à une incrémentation du $champ, mais j'ai pas trouvé la solution.

Merci de ton aide.

Christian

La connection à la base nese faisait pas suite à une virgule manquante entre deux champs values; problème détecté grace à ta methode .
Il n'y a aucun champ "values" dans la connexion, je ne vois pas de quoi tu parles.

j'obtiens lo'insertion de ... 14 fois la preliere ligne! Tu es désespérant... Tu ne comprends donc vraiment pas ce que tu écris ?
Le $champ=explode("\t",$ligne); te redonne 14 fois la même chose parce que tu ne modifies jamais la valeur de $ligne. Donc chaque fois que tu l' "explodes", tu retrouves la même chose.
Quand tu lis ta ligne avec fgets, si tu ne mets pas $ligne=fgets..., le résultat de de la lecture est simplement jeté à la poubelle. Il faut mettre le résultat de la lecture dans $ligne pour avoir effectivement la nouvelle ligne à chaque lecture et en faire un explode pour récupérer les morceaux
Messages postés
12
Date d'inscription
lundi 13 août 2012
Statut
Membre
Dernière intervention
15 novembre 2015

Bonjour le pere,

bon, je ne comprends pas tout, mais j'essaie...

Voilà le code que j'ai modifié:

$lecture = fopen($file,"r");
while (!feof($lecture))
{
$ligne=fgets($lecture);
$champ=explode("\t",$ligne);


$TypeActe=$champ[1];
if ($TypeActe=="")
{
$TypeActe="-";
}
$TypeActe=addslashes($TypeActe);

etc ..............................

mysql_query($req="INSERT INTO actes(TypeActe, DateActe, Nom, ........... PhotoActe) VALUES('".$TypeActe."','".$DateActe."', .....................................'".$PhotoActe."')");
}

Là, les 14 enregistrements s'insèrent bien dans ma base, mais j'ai le message suivant:

Notice: Undefined offset: 1 in C:\wamp\www\Chrisvia\www\GFH\InsereActes.php on line 50

Notice: Undefined offset: 2 in C:\wamp\www\Chrisvia\www\GFH\InsereActes.php on line 57

...................................................... et jusqu'à offset 26 (le fichier à lire cotient 26 champs).

Il s'insère également une ligne vide en fin de fichier: est-ce la cause? Comment l'éviter!

Comment se fait-il qu'il insère bien les données dans leur champ respectif et qu'il me dise qu'il ne reconnait pas l'offset?

La requête mise en sql dans phpmyadmin m'indique une erreur 1024: alors que je n'ai pas défini de message d'erreur particulier.

Donc, on avance doucement!
Christian

Il y a probablement une ligne vide à la fin de ton fichier.
Quand tu fais un 'explode', de cette dernière ligne, tu ne retrouves pas tes 26 champs
D'où les index non définis, et sans doute un problème dans la requête (même si je ne vois pas lequel)

Pour commencer, éliminer les lignes vides :

$ligne=fgets($lecture); 
$champ=explode("\t",$ligne); 
if (count($champ)!=26) continue; // 'saute' les lignes qui n'ont pas le bon nombre de champs
Messages postés
12
Date d'inscription
lundi 13 août 2012
Statut
Membre
Dernière intervention
15 novembre 2015

Bonjour le pere,

C'est parfait!

Merci pour ton aide.

Christian
Utilisateur anonyme
De rien :)