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

PHP & Base de données Discussion :

PHP ODBC : afficher les champs memo field d'une base HFSQL [ODBC]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut PHP ODBC : afficher les champs memo field d'une base HFSQL
    Bonjour,

    Ceci est mon premier post sur ce site, pardon d'avance si certaines règles d'édition ne sont pas respectées.

    Je réalise actuellement un intranet pour mon entreprise. D'un côté, le site est stocké sur un serveur Debian et, d'un autre côté, j'ai ma base de données HFSQL qui est stockée sur notre second serveur, un Windows 8. Actuellement, nos techniciens, commerciaux, etc. utilisent l'ERP CODIAL pour alimenter cette base de données. J'ai donc développé en plus de l'intranet une API PHP qui est également hébergée sur le serveur Windows (le même que pour la BD). Jusqu'à présent, cette API est parfaitement capable de me transmettre les données vers l'intranet. Problème : impossible d'afficher les données provenant de champs "memo text" (LONG VARCHAR pour PHP) dans ma base de données.

    J'ai pu faire quelques tests, la requête permettant de lire ces champs uniquement fonctionne très bien en amont, depuis l'éditeur HFSQL. Un petit appel de la fonction var_dump() m'indique bien que l'intitulé du champ est récupéré, mais pas son contenu qui est remplacé par NULL, voire rien du tout avec un echo.

    J'ai synthétisé la partie concernée de mon code :
    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
    <?php
    	// Ouverture de la connexion à la BD
    	function connectDb()
    	{
    		$dsn = "DRIVER={HFSQL};Server Name=" . DB_HOST . ";Server Port=4900;Database=" . DB_NAME . ";";
    		$database = odbc_connect($dsn, DB_USER, DB_PASS) or die(odbc_error());
    		return $database;
    	}
     
    	$database = connectDb();
    	$Table = array(); // Mon tableau de sortie
    	$query = "SELECT REFERENCE, DESIGN, NUMSERIE, DATEFING FROM MA_TABLE WHERE monId LIKE '1'";
     
            // Cette portion de code a été trouvée et adaptée ici (https://www.developpez.net/forums/d747184/php/php-sgbd/php-odbc/recuperation-base-acces-php-champ-memo/)
    	$valeur = odbc_exec($database, $query);
    	$result = odbc_do($database, $query);
    	$collone = odbc_num_fields($valeur); // Le nombre de champs de la requête exécutée
     
    	$Collone = array();
     
    	for($i = 1; $i < $collone + 1; $i++)
    		$Collone[$i] = odbc_field_name($result, $i);
     
    	while(odbc_fetch_row($result))
    	{
    		$Ligne = array();
     
    		// Ici commencent les ennuis...
    		for($i = 1; $i < $collone + 1; $i++)
    		{
    			$tmp = odbc_result($result, $i);
     
    			if($tmp)
    				$data = $tmp;
    			else
    				$data = "NULL";
     
    			$Ligne[$Collone[$i]] = $data;
    		}
     
    		$Table[] = $Ligne;
    	}
     
    	odbc_close($database);
    	var_dump($Table);
    ?>
    Et voici le résultat affiché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    array(1) {
      [0]=>
      array(25) {
        ["REFERENCE"]=>
        string(8) "AZERTY"
        ["DESIGN"]=>
        string(4) "NULL" <-- Ce champ devrait contenir un long texte
        ["NUMSERIE"]=>
        string(10) "1234-1234-1234-1234"
        ["DATEFING"]=>
        string(8) "13/04/2018"
        }
    }
    Suivant les fonctions que j'utilise pour lire le contenu, j'obtiens l'erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Out of memory (allocated A) (tried to allocate B bytes) in [...]
    ... que je ne comprends pas, étant donné que dans mon cas, "A" est supérieur à "B". Hors, le message dit bien "pas assez de mémoire (A allouée) (essayez d'allouer B bytes) in [...]. J'ai modifié mon php.ini (variable memory_limit) mais rien ne semble fonctionner.

    Tout ce que j'ai pu trouver à droite à gauche sur internet, y compris ici n'a pas fonctionné. C'est à n'y rien comprendre.

    Une idée ? Merci d'avance.


  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Déjà, il faut savoir que le message d'erreur du dépassement de mémoire est trompeur. Si par exemple ton message affiche
    Out of memory (allocated 100 bytes) (tried to allocate 5 bytes)
    ça veut dire "j'ai essayé d'enregistrer 5 dans une mémoire dont l'espace total est 100" et non "j'ai essayé d'enregistrer 5 dans une mémoire dont l'espace libre est 100b". L'espace libre peut très bien être 2, ce n'est pas indiqué dans le message.

    Tu peux utiliser memory_​get_​usage pour afficher l'utilisation de la mémoire à l'instant t et éventuellement voir où ça coince.

    Pour ton champ LONG VARCHAR, je ne maitrise pas odbc, mais tu peux peut-être regarder du côté de odbc_​longreadlen.

    Sinon, pour un problème similaire avec des BLOB sur Oracle, j'avais fait une récupération indépendante du champ à l'endroit où il était utilisé, de façon à ne récupérer qu'un seul BLOB à la fois et ne pas avoir à stocker l'ensemble des données en mémoire.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Finalement, après plusieurs recherches, ODBC ne convient pas au développement de notre projet, il semble qu'il y ait trop de souci de mémoire.
    J'ai donc utilisé à la place ADODB qui fonctionne parfaitement.

    Petite astuce pour ceux qui passeraient par là : si vous voulez également lire des données depuis une base HFSQL avec ADODB, suivez ceci : https://doc.pcsoft.fr/?9000064#exemp...ELTTEXTE000261

    Merci Celira pour m'avoir répondu, tu m'as mis sur la bonne voie !


    Sujet résolu pour moi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Formulaire php avec js Afficher les champs au fur et à mesure
    Par kevinducrot dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/06/2016, 12h14
  2. Réponses: 1
    Dernier message: 31/07/2009, 08h12
  3. Afficher les nom des tables d'une base de donnée
    Par newmar dans le forum Administration
    Réponses: 4
    Dernier message: 02/04/2008, 16h40
  4. [MySQL] Afficher les 3 derniere entrer d'une base
    Par keishah dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/08/2006, 21h40
  5. afficher les champs null de deux tables dans un select
    Par poil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/09/2005, 15h05

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