Insert into ne fonctionne pas

Résolu/Fermé
christian820 Messages postés 12 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 15 novembre 2015 - 22 août 2012 à 22:59
 Utilisateur anonyme - 24 août 2012 à 14:31
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

epitale Messages postés 3942 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 27 octobre 2017 915
22 août 2012 à 23:10
bonsoir christian820,
pas si simple de tout suivre mais respectes tu bien :

$req = "INSERT INTO nomtable (nomchamp1, ch2, ch3)
VALUES ( '$valpourch1', '$valch2', '$valch3') " ;
1
Webster95 Messages postés 553 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 9 juillet 2013 142
Modifié par Webster95 le 23/08/2012 à 01:39
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"
0
christian820 Messages postés 12 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 15 novembre 2015 1
23 août 2012 à 09:01
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
0
Utilisateur anonyme
23 août 2012 à 10:24
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
0

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

Posez votre question
Christian820
23 août 2012 à 11:06
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
0
Webster95 Messages postés 553 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 9 juillet 2013 142
23 août 2012 à 11:18
Essaye de faire un echo de ta requete:

echo $req;


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


0
Utilisateur anonyme
23 août 2012 à 11:43
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.
0
Christian820
23 août 2012 à 19:30
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
0
Utilisateur anonyme
23 août 2012 à 22:59
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
0
christian820 Messages postés 12 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 15 novembre 2015 1
24 août 2012 à 10:49
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
0
Utilisateur anonyme
24 août 2012 à 11:22
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
0
christian820 Messages postés 12 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 15 novembre 2015 1
24 août 2012 à 14:28
Bonjour le pere,

C'est parfait!

Merci pour ton aide.

Christian
0
Utilisateur anonyme
24 août 2012 à 14:31
De rien :)
0