tronquer une chaine de caractéres avant un INSERT ou UPDATE

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : tronquer une chaine de caractéres avant un INSERT ou UPDATE

par martial » 19 mai 2007, 17:00

J'ai trouvé la solution mais....en SQL avec

Code : Tout sélectionner

UPDATE table1 , table2 SET id_champ1=champ2 where RIGHT(id_champ1, 4) = RIGHT(champ2, 4)
En fait cela compare les quatre derniers caractéres des champs des deux tables, si ils sont identiques la condition est remplie!
je n'ai donc plus à me casser la tête avec le code PHP, je fais cette requête une fois le CSV copié
A bientot et merci pour ton aide
[/code]

par martial » 19 mai 2007, 15:55

En fait je récupére les valeurs de chaque champ pour y insérer les valeurs correspondantes
$champs.=substr($resultat[$i], 0, $pos) . ", "; // on decoupe et stock des champs sous forme: 'champ1, champ2, ...'
$valeurs.="'".substr($resultat[$i], $pos+1,strlen($resultat[$i])- $pos+1 )."', "; // sous forme: "'val1', 'val2', ..."
En effet, la table est constituée de champs dans le même ordre alors que le CSV à un nombre de champs défini par l'utilisateur (initialement c'est un tableau EXCEL). Avant de lancer la requête l'utilisateur fait correspondre les champs du CSV avec ceux de la BDD grace à des listes déroulantes
ex:
CSV ----> Table
Nom ----> Nom
Prénom ----> Prénom
Adresse ----> Adresse
Adresse2 xxxxxx CP
Email xxxxx Ville
Tel xxxxx
Telecopie xxxxx

par ouckileou » 19 mai 2007, 15:25

Il faudrait être sûr de ce que tu récupères dans $valeurs pour commencer à coder alors... si tu ne sais pas si tu as toute une ligne, ou seulement une colonne, tu ne vas pas pouvoir adapter tes tests

Tu devrais récupérer colonne par colonne, vu que tu fais des substr() au début... bref débrouille toi d'abord pour afficher pour chaque ligne

Tu peux aller regarder cette fonction : fgetcsv()
Et aussi aller dans la FAQ, il y a un sujet sur un manière très simple de charger du CSV dans une table MySQL, directement en SQL

Et pour la formule "tordue", ce n'était pas méchant, juste une manière de suggérer un truc plus léger.

par martial » 19 mai 2007, 15:15

Cela ne fonctionne pas non plus, je pense que c'est normal car il lit les données lignes par lignes et non pas champs par champs. IL faudrait que je rajoute un paramétre pour qu'il exécute la condition au niéme champ (dans mon cas c'est le sixiéme)
Quant à ma formule un peu tordue, cela me rassure car je suis bien dans la bonne rubrique c'est à dire "débuter en PHP"

par ouckileou » 19 mai 2007, 14:46

Moi je te dis que c'est le % qui pose problème.

Ton test dit "si valeur vaut exactement 'ABCD%'". Pas "si $valeur commence par ABCD".
Et c'est bien ce que tu voudrais non ? Le % est utilisé en SQL pour dire "et n'importe quoi avant/après"

Si ton echo ne renvoie aucune valeur, c'est bien que tu ne rentres pas dans le if.

Et ce test n'est pas bon non plus :
if ($valeurs=="'ABCD1234'" ){ 
Là tu dis :
SI $valeur vaut 'ABCD1234' (apostrophes inclues). Donc comme tu n'as pas d'apostrophes, ça ne marche pas.

Pourquoi ne pas réutiliser substr() ?
if (substr($valeurs,0,4) == "ABCD") {

Au passage, ceci me semble tordu :
$valeurs2=substr($valeurs,-4); //ne garde que les quatre derniers caractéres de la chaine
$valeurs=substr_replace($valeurs,$valeurs2, 0);
$valeurs=substr_replace($valeur,$valeurs2, 0, strlen($valeurs));//remplace l'ancienne valeur en affectant la nouvelle
substr() te renvoie les 4 derniers caractères, pourquoi est-ce que tu ne les réutilises pas directement plutôt que de passer par des variables intermédiaires ?
if (substr($valeurs,0,4) == "ABCD") {
	$valeurs=substr($valeurs,-4); //ne garde que les quatre derniers caractéres de la chaine
} 

par martial » 19 mai 2007, 14:36

J'ai fait un echo et cela ne renvoit aucune valeur ! ce n'est pas que le "%" qui pose probléme. En effet quand je remplace "ABCD%" par une valeur exacte du CSV cela ne me tronque pas non plus les caractéres
if ($valeurs=="'ABCD1234'" ){ 
$valeurs2=substr($valeurs,-4);
$valeurs=substr_replace($valeurs,$valeurs2, 0);
$valeurs=substr_replace($valeurs,$valeurs2, 0, strlen($valeurs));
En fait je souhaiterai tronquer les valeurs du 6ème champ du CSV ou de la BDD. De plus les valeurs commencent toujours par les mêmes caractéres!
je pense que c'est ma formule entiére qui n'est pas bonne.

par ouckileou » 19 mai 2007, 14:20

D'accord.

Mais ton test, il marche alors ou pas ?

par martial » 19 mai 2007, 14:15

Je fais ce test parceque j'ai plusieurs champs et le seul pouvant être tronqué est celui dont les données commencent par ABCD, je ne dois pas toucher aux autres! Si je ne met pas cette condition, il me tronquera les données de tous les champs!

par ouckileou » 19 mai 2007, 14:04

Met un echo après ce test pour vérifier que tu rentres dedans :
if ($valeurs=="'ABCD%,'" ){
Parceque moi, je suis sûr que non. Le %, c'est en SQL que ça marche :)

Et si tu veux garder tout le temps les 4 drniers caractères, pourquoi faire ce test ?

tronquer une chaine de caractéres avant un INSERT ou UPDATE

par martial » 19 mai 2007, 13:11

Bonjour à tous!
Je souhaite importer un fichier CSV dans une BDD MySql, tout fonctionne trés bien sauf que je veux intégrer une valeur du champ CSV dans le champ correspondant de la BDD en ne gardant que les quatre derniers caractéres de la chaine sachant que la chaine commence toujours par les mêmes caractéres
ex: Champ CSV= ABCDEF1234
valeur retrounée dans la BDD=1234
voici l'extrait du code, j'y ai mis une condition et j'utilise "substr" et "substr_replace" mais le script ne les prend pas en compte et m'insére la même chaine de caractére dans le champ de la BDD

	if ($connect==1){connecter();} 					// si connect =1 on se connect
	
	//str_replace(" ", "", $str_champs_valeurs); 		// supprimer tout les espaces
	$resultat = split("#", $str_champs_valeurs); 	// decoupage ds le tableau sous forme: 'nom_de_chapmp=text a insere'
	
	for ($i = 0; $i<sizeof($resultat); $i++){  		// boucle - parcourir tableau
		$pos=strpos($resultat[$i],"=") ;			// on recupere la position de carractaire de decoupage
		$champs.=substr($resultat[$i], 0, $pos) . ", "; // on decoupe et stock des champs sous forme: 'champ1, champ2, ...'
		$valeurs.="'".substr($resultat[$i], $pos+1,strlen($resultat[$i])- $pos+1 )."', "; // sous forme: "'val1', 'val2', ..."
	}
if ($valeurs=="'ABCD%,'" ){ 
$valeurs2=substr($valeurs,-4); //ne garde que les quatre derniers caractéres de la chaine
$valeurs=substr_replace($valeurs,$valeurs2, 0);
$valeurs=substr_replace($valeur,$valeurs2, 0, strlen($valeurs));//remplace l'ancienne valeur en affectant la nouvelle
}
else{
   
	$champs=substr($champs,0,sizeof($valeurs)-3); 	// il faut enleve dernier - ", "
	$valeurs=substr($valeurs,0,sizeof($valeurs)-3);	// il faut enleve dernier - ", "
}	
	$str_query="INSERT INTO ".$bd_table."(".$champs.") VALUES (".$valeurs.")"; //construction de query
	$resultat = requette($str_query ,0);							// envoi de query