IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

SQL & PHP


Sujet :

PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut SQL & PHP
    Bonjour ,
    je développe depuis un moment maintenant, une application web pour les employés de ma boite . Cette apllication a pour but de télécharger un fichier texte avec des messages (logs) qui sont stockés sur une base de données.
    pour pouvoir telecharger ce fichier texte,il faut remplir plusieurs informations , dans ces informations il faut renseigner des filtres composer d'une chaine de caractères qui permettent de rétrécir la recherche. A ce jour j'ai uniquement des filtres qui permetent de Sortir tous les messages avec la chaine de caractères renseigner on peut avoir jusqu'à 5 FILTRES. Ici seulement les filtres nous interressent ($condition = operateur ogique ET & OU ) du coup on ne s'ocupe pas de ($codesgtqs,$type,$date1,$date2)

    Ma fonction qui permet de sortir uniquement les messages qui contient la chaine de caractères renseigner dans le filtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public function getMessageListFiltered($codesgtqs,$type,$date1,$date2,$condition,array $pattern,){ 			
    			if((!empty($pattern) &&($condition == 'AND' || $condition == 'OR')) ){
    				$tab=array_values($pattern);
    				$query="SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND (";
    				for($i=0;$i<count($tab);$i++){
    					$str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab[$i],'UTF-8'));
    					$str=preg_replace('/%/','\%',$str);
    					$str=preg_replace('/_/','\_',$str);
    					$tab[$i]="%".$str."%";
    					if($i==count($tab)-1){
    						$query.="upper(log) LIKE ?)";
    					}else{
    						$query.="upper(log) LIKE ? $condition ";
    					}
    				}
    				$query.=" ORDER BY date;";
    				$stmt= $this->_db->prepare($query);
    				$stmt->bindParam(1,$codesgtqs);
    				$stmt->bindParam(2,$type);
    				$stmt->bindParam(3,$date1);
    				$stmt->bindParam(4,$date2);
     
    				for($i=0;$i<count($tab);$i++){
    					$stmt->bindParam($i+5,$tab[$i]);
    				}
     
    				$data=array();
    				if($stmt->execute()){
    					while(($row=$stmt->fetch())!==false){
    						$data[]=new Message($row);
    					}
    				}
    				return $data; 
    			}
    			return null;
    		}
    Maintenant je dois faire des filtres ou la chaine de caractères renseigner ne doit pas apparaitre dans le fichier texte de fin.
    Exemple de requete SQL demander :

    SELECT m.log FROM message m JOIN ne n on n.id=m.ne_id WHERE n.codesgtqs='AB17' AND m.type='UNS' AND date BETWEEN '2013-06-01' AND '2013-06-28' AND (m.log LIKE '%DAL%' OR m.log LIKE '%FAL%')AND (m.log NOT LIKE '%!!%' AND m.log NOT LIKE '%IND%');

    seulement la partie en gras de la requete nous interresse DAL et FAL sont des exemple de chaine de caractères renseigner pour les filtres "contient" .
    !! et IND sont des exemple de chaine de caractères pour les filtres "ne contient pas" cette requete fonctionne , seulement je dois l'integrer dans la fonction du dessus.

    j'ai commencer par faire ceci: Mais ca ne fonctionne pas ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    45
    46
    47
    48
    49
    public function getMessageListFiltered($codesgtqs,$type,$date1,$date2,$condition,array $pattern,$operateur2,array $pattern2){ 			
    			if((!empty($pattern) &&($condition == 'AND' || $condition == 'OR')) || (!empty($pattern2) &&($operateur2 == 'AND' || $operateur2 == 'OR'))){
    				$tab=array_values($pattern);
    				$tab2=array_values($pattern2);				$query="SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND (";
    				for($i=0;$i<count($tab);$i++){
    					$str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab[$i],'UTF-8'));
    					$str=preg_replace('/%/','\%',$str);
    					$str=preg_replace('/_/','\_',$str);
    					$tab[$i]="%".$str."%";
    					if($i==count($tab)-1){
    						$query.="upper(log) LIKE ?)";
    					}else{
    						$query.="upper(log) LIKE ? $condition ";
    					}
    				}
    					$query.="AND (";
    				for($i=0;$i<count($tab2);$i++){
    					$str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab2[$i],'UTF-8'));
    					$str=preg_replace('/%/','\%',$str);
    					$str=preg_replace('/_/','\_',$str);
    					$tab[$i]="%".$str."%";
    					if($i==count($tab2)-1){
    						$query.="upper(log) NOT LIKE ?)";
    					}else{
    						$query.="upper(log) NOT LIKE ? $operateur2 ";
    					}
    				}				$query.=" ORDER BY date;";
    				$stmt= $this->_db->prepare($query);
    				$stmt->bindParam(1,$codesgtqs);
    				$stmt->bindParam(2,$type);
    				$stmt->bindParam(3,$date1);
    				$stmt->bindParam(4,$date2);
    
    				for($i=0;$i<count($tab);$i++){
    					$stmt->bindParam($i+5,$tab[$i]);
    				}
    				for($i=0;$i<count($tab2);$i++){
    					$stmt->bindParam($i+5,$tab2[$i]);
    				}				
    				$data=array();
    				if($stmt->execute()){
    					while(($row=$stmt->fetch())!==false){
    						$data[]=new Message($row);
    					}
    				}
    				return $data; 
    			}
    			return null;
    		}
    Le code en gras represente les modifications de la fonction .
    voila (desolé pour les fautes d'orthographe.)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    "Ca ne fonctionne pas", c'est plutôt vague comme description du problème.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui cest vrai j'ai du mal a expliquer mon probleme ^^

    Donc je m'explique (enfin je vais essayer) , initialement j'ai une requete de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND ("upper(log) LIKE ?) ORDER BY date;
    que l'on peut retrouver dans dans mon premier post dans le premier encadré du code

    seulement j'aimerais que ma requete ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND (upper(log) LIKE ?) AND (upper(log) NOT LIKE ?) ORDER BY date;
    j'ai donc essayer de modifier le code de rajouter des elements supplementaires , seulement je crains de mal mis prendre.

    j'ai des erreurs de ce tpe : SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "AND" LINE 1: ...s=$1 AND type=$2 AND date BETWEEN $3 AND $4 AND ( AND (upper... ^

    la partie en gras represente l'erreur ma requete est mal formuler.

    Sa doit etre a ce niveaux là que sa foire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $query.=" AND (";
    				for($i=0;$i<count($tab2);$i++){
    					$str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab2[$i],'UTF-8'));
    					$str=preg_replace('/%/','\%',$str);
    					$str=preg_replace('/_/','\_',$str);
    					$tab[$i]="%".$str."%";
    					if($i==count($tab2)-1){
    						$query.="upper(log) NOT LIKE ?)";
    					}else{
    						$query.="upper(log) NOT LIKE ? $operateur2 ";
    					}
    				}
    j'essai de rajouter ce bout de code a ma requète initial pour qu'au final elle ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.log FROM message m JOIN ne n on n.id=m.ne_id WHERE n.codesgtqs='AB17' AND m.type='UNS' AND date BETWEEN '2013-06-01' AND '2013-06-28' AND (m.log LIKE '%DAL%' OR m.log LIKE '%FAL%')AND (m.log NOT LIKE '%!!%' AND m.log NOT LIKE '%IND%')
    Par exemple

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Apparemment le problème est que le code ajoute à la requête qu'il y ait ou non un $pattern avec des conditions.
    Si $pattern est vide ça fait une requête clairement invalide.

    Mais il faudrait que tu dises quels sont les arguments passés à la fonction dans ton exemple qui plante, parce que c'est beaucoup de spéculation sinon.

  5. #5
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Juste une remarque si vous me le permettez.
    Plutôt que de passer beaucoup de temps (je suppose) à trouver une solution dans cette voie là pour au final générer une requête sur des critères non sargeables, donc très peu performante, quitte à faire un traitement php, autant le faire avant l'insertion plutôt qu'après.

    Pourquoi?
    Parcequ'il serait beaucoup plus performant dans ce traitement PHP préalable à l'insertion, de faire de la génération de métadonnées sur les logs à insérer de façon ensuite à requêter avec performance vos logs avec les filtres souhaités. Cela vous oblige à créer pour le moins une table supplémentaire pour ce faire.

    La solution au final aurait été - me semble-t-il - moins coûteuse.

    Cordialement,

    Jc.

Discussions similaires

  1. [Conception] insertion sql en php, dans une base de donnée ?
    Par artotal dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/10/2005, 04h34
  2. [MySQL] probleme requete sql et php
    Par digger dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 10/10/2005, 14h15
  3. [SGBD] requête sql en php pour mysql
    Par Thierry8 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/09/2005, 22h31
  4. Probleme de variable entre SQL et Php
    Par copin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/06/2005, 10h58
  5. [Oracle] Exécuter une procédure PL/SQL en PHP?
    Par Cerberes dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 25/02/2005, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo