Vous n'êtes pas identifié(e).

#176 Général » Utilisation de crosstab » 17/01/2011 14:40:26

damalaan
Réponses : 14

Bonjour,

je souhaite utiliser la fonction crosstab pour faire un genre de tableau croisé (à la manière d'excel ou access)
voici donc mon code

SELECT *
FROM crosstab(
  'select mois, round
   from view_moy_labo')
AS ct(mois text, ET numeric);

et voici l'erreur

ERREUR:  la fonction crosstab(unknown) n'existe pas
LINE 2: FROM crosstab(
             ^
HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.

********** Erreur **********

ERREUR: la fonction crosstab(unknown) n'existe pas
État SQL :42883
Astuce : Aucune fonction ne correspond au nom donné et aux types d'arguments.

Apparemment cette fonction n'existe pas sur mon pg
y a t il un module à installer?
je suis sous pgsql 9.0

merci

#177 Re : PL/pgSQL » Passage de paramètre pour la COPY » 08/01/2011 17:09:43

je suis allé jusqu'à 3 \ (au pif, c'est vrai), il m'en manquait  1 !!!
Merci pour les infos.

#178 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 21:57:29

select essais('C:/v10.txt') fonctionne très bien

j'avais oublié que le slash fonctionnait!!

#179 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 21:48:29

J'ai modifié ma fonction mais ça ne marche pas

CREATE OR REPLACE FUNCTION essais(text)
  RETURNS void AS
$BODY$

DECLARE
ordre_sql varchar;

BEGIN
-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_temp2_tm2;

-- on importe le fichier
SET client_encoding TO 'LATIN1';


ordre_sql := 'COPY tbl_import FROM ''' || $1 || ''' WITH CSV HEADER DELIMITER '';''';
execute ordre_sql;
.....

voici le lancement de la fonction
select essais(E'C:\\v10.csv');

voici l'erreur renvoyée

ERREUR:  n'a pas pu ouvrir le fichier « C:v10.csv » pour une lecture : No such file or directory
CONTEXT:  instruction SQL « COPY tbl_import FROM 'C:\v10.csv' WITH CSV HEADER DELIMITER ';' »
PL/pgSQL function "essais" line 14 at instruction EXECUTE

********** Erreur **********


État SQL :58P01

apparemment c'est un souci d'échappement de caractère dans le nom du fichier...

#180 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 18:06:22

Bien sûr!!! ça va de soi smile

petite précision : ça reste interne à un réseau d'entreprise.

#181 PL/pgSQL » Passage de paramètre pour la COPY » 05/01/2011 21:42:53

damalaan
Réponses : 7

Bonjour,

j'ai créé une fonction qui importe un fichier texte. Je voudrais passé le chemin du fichier en paramètre pour pouvoir me servir de cette fonction depuis une page web via PHP

-- Function: essais()

-- DROP FUNCTION essais();

CREATE OR REPLACE FUNCTION essais()
  RETURNS void AS
$BODY$
BEGIN

-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_import2;

-- on importe le fichier
SET client_encoding TO 'LATIN1';
COPY tbl_import FROM 'C:/essai.txt'
WITH
CSV HEADER
DELIMITER ';';

.....

Merci d'avance

#182 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 22:39:25

Effectivement la jointure est plus judicieuse surtout que j'ai conçu ma base de cette manière!!
je suis à 120000 lignes et 8s de temps de réponse, pas mal!

#183 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 17:11:47

comment dire...............parfait!!!!
quand je pense le temps que j'ai passé à faire ça sous access!! et là ça se fait tout seul (ou presque)
en cherchant sur le net j'ai trouvé ce tuto : http://lalystar.developpez.com/fonction … ques/#L3.2 (c'est pour Oracle, mais les fonctions des 2 sgbd étant proches, cela m'a plus aidé que la doc de postgresql)

pour l'instant je sors les valeurs en un peu plus de 1100 ms, mais je n'ai que 24000 lignes, et je suis sur un netbook; je teste dès que je peux en réel!!

voici quand même mon code :

SELECT 
  tbl_tournee_trn.trn_date_prel, 
  tbl_tournee_trn.trn_tournee, 
  tbl_tournee_trn.trn_usine, 
  tbl_valeur_mg.mg_matricule, 
  tbl_valeur_mg.mg_val,
  tbl_valeur_mg.mg_val - lag (tbl_valeur_mg.mg_val, 1) 
  over (partition by tbl_valeur_mg.mg_matricule
  order by tbl_tournee_trn.trn_date_prel) ecart
FROM 
  tbl_valeur_mg, 
  tbl_tournee_trn
WHERE 
  tbl_tournee_trn.trn_id = tbl_valeur_mg.trn_id ;

encore merci
plus ça va plus j'aime postgreSQL!!

#184 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 16:07:38

je suis sous la version 9.0........et je débute donc je ne connais pas ces fonctions..........

#185 Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 15:52:37

damalaan
Réponses : 8

Bonjour,

Voici un extrait de données

trn_date	trn_tr	trn_us	mg_mat	mg_val	écart
90201	140	1711	1003	39.9	
90202	140	1711	1003	41.6	1.7
90203	140	1711	1003	40.2	-1.4
90301	140	1711	1003	39.1	-1.1
90302	140	1711	1003	39.7	0.6
90303	140	1711	1003	40.3	0.6
90201	135	1711	1005	42.2	
90202	135	1711	1005	42.1	-0.1
90203	135	1711	1005	42.1	0
90301	135	1711	1005	40.9	-1.2
90302	135	1711	1005	40.6	-0.3
90303	135	1711	1005	39.9	-0.7
90201	104	1711	1010	42.5	
90202	104	1711	1010	42.8	0.3
90203	104	1711	1010	42.1	-0.7
90301	104	1711	1010	41	-1.1
90302	104	1711	1010	41.5	0.5
90303	104	1711	1010	41.8	0.3
90201	141	1711	1014	41.9	
90202	141	1711	1014	41.4	-0.5
90203	141	1711	1014	43.5	2.1
90301	141	1711	1014	37.9	-5.6
90302	141	1711	1014	39.4	1.5
90303	141	1711	1014	40.9	1.5
90201	132	1711	1016	42.9	
90202	132	1711	1016	41.6	-1.3
90203	132	1711	1016	39.2	-2.4
90301	132	1711	1016	37.5	-1.7
90302	132	1711	1016	37.6	0.1
90303	132	1711	1016	38	0.4
90201	141	1711	1019	44	
90202	141	1711	1019	43.8	-0.2
90203	141	1711	1019	44.4	0.6
90301	141	1711	1019	41.4	-3
90302	141	1711	1019	42	0.6
90303	141	1711	1019	41.2	-0.8

Ce que je veux faire, c'est calculer la différence qu'il y a entre 2 enregistrements consécutifs mg_val tant que mg_mat = mgmat-1, tout cela classer par date

Mon souci est que dans ma base j'ai plus de 400000 lignes et qu'elle grossit de 20000 env par mois; j'ai fait un essai avec des select imbriqués, sur 50 valeurs ça marche, mais évidemment sur 400000 c'est pas la peine.

Actuellement, cette appli tourne sur Access et je fais mon calcul en VBA : à chaque import, je recalcule tout et je stocke la valeur calculée dans la table (pas top!!).

Auriez-vous une solution sous Postgresql un peu plus propre?
Le but final de cette appli étant de faire des stats sur ces écarts calculés sur une durée que l'utilisateur définit lui même.

Merci d'avance

#186 Re : PHP » Création page web pour s'identifier » 29/12/2010 08:45:45

oui c'est bien lors de l'authentification

j'ai adapté un code que j'ai trouvé sur le net prévu pour MySQL et qui utilise le cryptage en md5; d'où mon interrogation.

Encore merci pour vos remarques, c'est toujours constructif!

#187 Re : PHP » Création page web pour s'identifier » 28/12/2010 21:42:33

Finalement j'ai décidé de procéder d'une autre manière :
1-affichage de la page de connexion

<form action="/session2/connexion.php" method="post">
    <input name="name" type="text" size="12" value="" /> Name<br />
    <input name="pass" type="password" size="12" value="" /> Password<br />
    <input name="submit" type="submit" value="Connexion" />
</form>

2-sur le clic du bouton connexion on traite l'identification avec le fichier connexion.php

<?php
//initialisation de la session
session_start();
//si les champs ont été remplis
if (!$_POST['name']=="" && !$_POST['pass']=="") 
{
  //on récupère les valeurs des champs
  $name = $_POST['name'];
  $pass = $_POST['pass'];
  



  //connexion à la base de donnée
  $connect = @pg_connect("host=localhost port=5432 dbname=madbpg user=$name password=$pass");
  //echo pg_last_error($connect);
	
	if (!$connect) {
	header('Location: stop.php');
	}
    else {
	echo "connexion ok";
         
	$_SESSION['name'] = $name;
	$_SESSION['pass']= $pass;
	echo "<a href=\"lien.php\">Cliquez ici<\a>";
	}
}
?>

donc si la conexion foncttionne j'affiche "connexion ok" , je passe le nom d'utilisateur et son mot de passe dans la session et je teste avec un lien vers une page faisant appel à une requete sur la bdd


3-affichage de la page lien et utilisation des variables de session

<?php
require 'auth.php';
echo $_SESSION['name'];
echo $_SESSION['pass'];
$name = $_SESSION['name'];
$pass = $_SESSION['pass'];
$connect = pg_connect("host=localhost port=5432 dbname=madbpg user=$name password=$pass");

$result = pg_query($connect, "SELECT * from tbl_pente");
if (!$result) {
  echo "Une erreur s'est produite.\n";
  exit;
}

while ($row = pg_fetch_row($result)) {
  echo "ID: $row[0]  TYPE: $row[1] VAL: $row[2] REPET: $row[2]";
  echo "<br />\n";
}

?>

et je vérifie l'authentification à chaque page avec require 'auth.php'

<?php
session_start();
//on vérifie que l'utilisateur est identifé
if (!isset($_SESSION['name'])) {
  //si la variable de session n'existe pas
  //on redirige l'utilisateur vers le formulaire d'identification
  header('Location: ./index.php');
  //on arrête l'exécution
  exit();}
  else
  {
  $name=$_SESSION['name'];
  $pass=$_SESSION['pass'];
  }
?>

mes soucis sont
-que le mot de passe passe en clair, impossible de le faire fonctionner en le
passant en md5
-que je n'arrive pas à passer les variables de session telles quelles dans les connexions
je suis obligé de les repasser dans une variable classique avant (je pense que je vais faire un autre fichier php pour cela ça évitera de le faire pour chaque page)

dans l'attente de vos remarques!

#188 Re : PHP » Création page web pour s'identifier » 19/12/2010 22:02:55

j'ai donc utilisé la tbl pg_roles, et adapté un script conçu initialement pour mysql
mon souci est que l'identification est tjs refusé : Votre nom ou votre mot de passe est incorrect

script pour se logger:

<form action="/session/session.php" method="post">
	<input name="name" type="text" size="12" value="" /> Name<br />
	<input name="pass" type="text" size="12" value="" /> Password<br />
	<input name="submit" type="submit" value="Connexion" />
</form>

et script d'authentification

<?php
//initialisation de la session
session_start();
//si les champs ont été remplis
if (!$_POST['name']=="" && !$_POST['pass']=="") 
{
  //on récupère les valeurs des champs
  $name = $_POST['name'];
  $pass = md5($_POST['pass']);

  //connexion à la base de donnée
  $connect = pg_connect("host=localhost port=5432 dbname=madbpg user=postgres password=****");

echo $name;
  
  $sql= "SELECT rolpassword FROM pg_roles WHERE rolname like '$name';";
  echo $sql."</br>";
  $sql = pg_query($connect, $sql);

  $row = pg_fetch_array($sql, 0, PGSQL_NUM);
  
 
$pass_sql= $row[0];
  //on teste si le mot de passe correspond à la base de donnée
  if ($pass_sql == $pass) 
	{
    //l'utilisateur est valide
    //on crée la variable de session avec son nom
    $_SESSION['name'] = $name;
    $msg = 'Vous êtes correctement indentifié';
	}
  else {
    //sinon on avertit l'utilisateur
    $msg = 'Votre nom ou votre mot de passe est incorrect<br />';
    $msg .= '<a href="/index.php">Retour</a>';}

  //fermeture de la connexion
  pg_close();}
else {
  //un des champs n'est pas rempli
  $msg = 'Votre nom et/ou votre mot de passe n\'est pas renseigné<br />';
  $msg .= '<a href="/index.php">Retour</a>';}

//on affiche le resultat
echo $msg;
?>

merci de votre aide

#189 PHP » Création page web pour s'identifier » 02/12/2010 23:52:52

damalaan
Réponses : 6

Bonjour,

je débute tout juste avec postgresql.
je m’exerce donc à créer une petite base (1 table pour le moment) avec des utilisateurs (roles) ayant des droits différents.
je voudrais interfacer ma base avec une page web, et utiliser les session de php pour autoriser (ou non)  les différentes actions d'un utilisateur dès lors qu'il s'est loggé et tout au long de la navigation sur le site.
Ma question est : puis-je utilisé pour identifier mes utilisateurs la table système pg_roles ou doit créer une table user de toutes pièces (et dans ce cas comment je gère les droits select, insert, update, delete sur les tables)?

Merci d'avance

Pied de page des forums

Propulsé par FluxBB