[Résolu] Comparaison d'éléments avec accents dans 2 bases

Eléphanteau du PHP | 32 Messages

04 mars 2011, 12:21

Bonjour,

Je dois retrouver dans 2 bases distinctes des individus communs.
Je suis parvenu à coder mes requêtes en php, et cela fonctionne à peu près bien.
Seul problème: dans une base les individus sont en majuscules, et dans l'autre, il y a des majuscules, des minuscules, et des ACCENTS.
J'ai contourné le problème des majuscules/minuscules avec un strtolower, mais il me reste le souci des accents.

Comment m'y prendre afin que le champ chloe soit reconnue comme étant le même que chloé ???
Idem pour le ï , etc...

J'ai pensé au départ à l'import de mes bases en choisissant un jeu de caractères différent, mais sans résultat.

Help!
Merci...
Modifié en dernier par fabulon le 04 mars 2011, 18:15, modifié 1 fois.

Eléphanteau du PHP | 24 Messages

04 mars 2011, 12:52

Avec des preg_replace peut-être.

$nom = preg_replace('#[éèêë]#', 'e', $nom);

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 14:39

mais non,
normalement si ton charset est bien choisie il fais les correspondances pour les accents, en SQL c'est fait exprès pour

Eléphanteau du PHP | 32 Messages

04 mars 2011, 14:59

mais non,
normalement si ton charset est bien choisie il fais les correspondances pour les accents, en SQL c'est fait exprès pour
Est-ce que tu pourrais préciser un peu cette histoire de charset ? Je débute...

Eléphanteau du PHP | 32 Messages

04 mars 2011, 15:01

mais non,
normalement si ton charset est bien choisie il fais les correspondances pour les accents, en SQL c'est fait exprès pour
Ton idée fonctionne.
J'ai fait marcher mon script pour une dizaine d'éléments, ça tourne.

En revanche, pour ma liste de plus de 2000 utilisateurs, je suis confronté au maximum execution time de 30s.
J'ai beau modifié le php.ini, ça ne change rien, ça reste à 30S. Et puis de toute façon, sur un site hébergé, je ne pourrais pas modifier ce paramètre.

Une idée?

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 15:06

montre ton code

Eléphanteau du PHP | 32 Messages

04 mars 2011, 15:07

Le voici:
<?php
	// Connection à mysql
	include('connexion.php');
	// fin de la partie connexion
	
	$requete="SELECT * from ent"; // requête proprement dite 
	$result = mysql_query($requete) or die(mysql_error()); // envoi de la requête 
	while($row = mysql_fetch_array($result)) { //le résultat revient sous forme d'une matrice
		
		$UID_ENT = $row['UID_ENT'];
		$PRENOM = $row['PRENOM'];
		$PRENOM = preg_replace('#[éèêë]#', 'e', $PRENOM);
		$PRENOM = preg_replace('#[ï]#', 'i', $PRENOM);
		$PRENOM = preg_replace('#[äà]#','a',$PRENOM);
		$PRENOM = preg_replace('#[öô]#','o',$PRENOM);
		$PRENOM = preg_replace('#[ç]#','c',$PRENOM);
		$requete2="UPDATE ENT SET PRENOM = '$PRENOM' WHERE UID_ENT = '$UID_ENT'" ; // requête proprement dite
		$result2 = mysql_query($requete2) or die(mysql_error()); // envoi de la requête 
		}
?>
Modifié en dernier par fabulon le 04 mars 2011, 15:26, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 15:16

a quoi sert le code à part supprimé les accents ?

Eléphanteau du PHP | 32 Messages

04 mars 2011, 15:19

Celui-ci ne sert qu'à supprimer les accents.
Ensuite, j'ai un autre fichier qui compare les champs. En voici le code:
<?php
	// Connection à mysql
	include('connexion.php');
	// fin de la partie connexion
	
	$requete="SELECT * from magret"; // requête proprement dite 
	$result = mysql_query($requete) or die(mysql_error()); // envoi de la requête 
	while($row = mysql_fetch_array($result))  //le résultat revient sous forme d'une matrice
		{
		$CLASSE_MAGRET = $row ['CLASSE'];
		$NOM_MAGRET = $row['NOM'];
		$PRENOM_MAGRET = strtolower($row['PRENOM']);
		$UID_ENT = $row['UID_ENT'];
		if ($UID_ENT == '#') {
			$requete2="SELECT * from ENT"; // requête proprement dite 
			$result2 = mysql_query($requete2) or die(mysql_error()); // envoi de la requête 
			while($row2 = mysql_fetch_array($result2))  //le résultat revient sous forme d'une matrice
				{
				$CLASSE_ENT = $row2 ['CLASSE'];
				$NOM_ENT = $row2['NOM'];
				$PRENOM_ENT = strtolower($row2['PRENOM']);
				$UID_ENT = $row2['UID_ENT'];
				
				IF (($NOM_MAGRET == $NOM_ENT) && ($PRENOM_MAGRET == $PRENOM_ENT) && ($CLASSE_MAGRET == $CLASSE_ENT)) {
					$requete3="UPDATE MAGRET SET UID_ENT = '$UID_ENT' WHERE NOM = '$NOM_MAGRET'&& PRENOM = '$PRENOM_MAGRET' && CLASSE = '$CLASSE_MAGRET'" ; // requête proprement dite
					$result3 = mysql_query($requete3) or die(mysql_error()); // envoi de la requête 
					}
				}
		}
		}

?>
Modifié en dernier par fabulon le 04 mars 2011, 15:25, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 15:20

met la balise PHP du forum on verra mieux

Eléphanteau du PHP | 32 Messages

04 mars 2011, 15:27

Tu as raison, c'est mieux comme ça! :wink:

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 15:30

ça peux se faire en une seule requête :
UPDATE `magret`, `ent` 
SET `magret`.`uid_ent` = `ent`.`uid_ent` 
WHERE `magret`.`nom` = `ent`.`nom` 
  AND `magret`.`prenom` = `ent`.`prenom` 
  AND `magret`.`class` = `ent`.`class`

Eléphanteau du PHP | 32 Messages

04 mars 2011, 15:35

Ah pardi... c'est mieux que ma triple requete...

Et pour ce qui est du problème d'accent? Est-ce que cela peut se faire sans le premier fichier?
Tu m'avais parlé de charset !?
Sinon, comment outrepasser ce souci de maximum execution time quand je veux remplacer mes accents?

ViPHP
ViPHP | 5462 Messages

04 mars 2011, 15:40

Ah pardi... c'est mieux que ma triple requete...

Et pour ce qui est du problème d'accent? Est-ce que cela peut se faire sans le premier fichier?
Tu m'avais parlé de charset !?
Sinon, comment outrepasser ce souci de maximum execution time quand je veux remplacer mes accents?
il faut que les table est le même charset (et même collation)

ex : latin1_swedish_ci
chaset : latin1
collation : swedish
ci : case insensitive

ton script est long car tes requêtes ne sont pas bonne, la condition sur le # n'est pas bonne, essaye de comprendre pas à pas ce que t'as écris tu verras que ca n'as pas trop de sens :wink:

Eléphanteau du PHP | 32 Messages

04 mars 2011, 16:04

le # est juste une marque pour savoir quels UID ont été remplis et ceux non.
C'est sur que cela fait des requêtes...

Pour régler les tables, c'est dans phpmyadmin? (j'utilise wamp...)