Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/03/2011, 22h06   #1
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
Par défaut Problèmes d'insertion multiples

Bonjour,

Je rencontre des difficultées lors d'une double qui effectue, tour à tour, une série d'INSERT en base (une 20aine seulement).
L'algo ressemble à celui-ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$datas = Array(
   Array('data1' => 'madonnee', 'data2' => 'monautredonnee'),
   Array('data1' => 'encore', 'data2' => 'uneautre')
);
 
foreach($datas as $data) {
   $d1 = $data['data1'];
   $d2 = $data['data2'];
   $sql = "INSERT INTO table VALUES ('$d1', '$d2');"
   mysql_query($sql);
   print($sql); // Pour debug
}
Je lance le script, les requêtes s'affichent toute.
En revanche si je regarde dans la base de donnée, par PhpMyAdmin, seule une ligne à été ajoutée à la table (visiblement la première ou la dernière, à vérifier si besoin).
Si je copie/colle les requêtes affichées dans PMA, toutes passent et ma table est correctement peuplée.

Comment faire pour que tous les INSERT se fassent en table ?
J'ai tenté de booster avec un "COMMIT;" à la fin de ma requête mais cela n'y a rien fait.

Meci pour vos réponses !
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h10   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
As-tu controlé si ton code produisait des erreurs mysql ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h22   #3
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
Oui tout à fait, il n'y a aucune erreur MySQL suite aux inserts ni par le script, ni par copier/coller dans PMA.
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h25   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Est-ce que tu as une clef sur ta table ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h29   #5
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
Oui, en fait la table est :
HISTORIQUE(Date date, Varchar(16) code)

Il y a une clée primaire sur le champs date.
Le problème ne vient pas de doublons de clé puisque j'ai fait un flush de la table avant mon script pour m'en assurer.
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h31   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ton code du début ne correspond pas à ça.
Peux-tu nous montrer le vrai code ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 22h47   #7
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
Je voulais simplifier un peu, voici le code :

Premier fichier :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
	// On analyse la validité du fichier
	$valide = true;
	while ( $valide && !feof($fp) ) {
 
		$ligne = fgets($fp);
		if( preg_match("`^[0-9]{2}(0|1)+[0-9]+(0|1|2|3)+[0-9]+[0-9A-Z]{1,16}$`", $ligne) ) {
 
			$a = substr($ligne, 0, 2);
			$m = substr($ligne, 2, 2);
			$j = substr($ligne, 4, 2);
			$date = '20' . $a . '-' . $m . '-' . $j;
			$codeetab = substr($ligne, 6);
 
			$datas[] = Array(
				'date' => $date,
				'codeetab' => $codeetab
			);
 
		} else {
			$valide = false;
		}
	}
 
	// Fermeture du fichier
	fclose($fp);
 
	/* A ce stade, $valide est à true et un print_r 
	    montre que le tableau de donnée est correctement remplis */
 
	// On regarde si le fichier est conforme
	if($valide) {
 
		// On insère tout en base
		foreach($datas as $histo) {
			/* Cette méthode est décrite plus basse */
			bddhistorique_ajouter($histo['date'], $histo['codeetab']);
		}
		die();
		// Succès
		return true;
	} else {
		// Echec
		return false;
	}
Voici la seconde méthode :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Insertion dans l'historique
function bddhistorique_ajouter($date, $codeetab) {
 
	// Insertion
	$sql = "
		INSERT INTO
			" . TB_HISTORIQUE . "
			(`date`, `codeetab`)
		VALUES
			('$date', '$codeetab');
	";
 
	/* Un print($sql) affiche les requêtes qui passent correctement dans PMA */
 
	mysql_query($sql);
}
Merci
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 23h04   #8
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
En voulant copier/coller les requêtes sur le forum, je me rends compte que j'ai une ano dans mes requêtes: les $codeetab comportent un espace à la fin. Celui-là vient de l'espace en fin de chaque ligne de mon fichier.
J'ai remplacé :

$codeetab = substr($ligne, 6);

par :

$codeetab = substr($ligne, 6, -1);

Les requêtes sont bonne et passent.
Ce que je ne comprends pas, c'est l'absence d'erreur sur mes requêtes dans mon script : peut-être ai-je mal récupérer les retours de l'insert par musql_query, peux-tu m'indiquer la marche à suivre correcte ?

Pour PMA en revanche je ne comprends pas comment l'insertion passe la contrainte d'intégrité sur 'codeetab' quand je passe en requête directement...!
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 00h11   #9
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Je suppose que quand tu copies/colles, tu ne prends pas le caractère de retour chariot.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 18h16   #10
Membre actif
 
Avatar de FabaCoeur
 
Inscription : avril 2007
Messages : 427
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : avril 2007
Messages : 427
Points : 182
Points : 182
Il y avait bien un espace avant la parenthèse finale pourtant.
Bref encore un mystère !
Merci quand même
FabaCoeur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h37.


 
 
 
 
Partenaires

Hébergement Web