简体   繁体   中英

Oracle SQL request in PHP not returning anything but works in SQL Developer

I'm facing an issue where I have a request that works in SQL Developer or VsCode with the oracle DB add-on but in the php code, it returns 0 rows. PHP version is old and I can't do anything about that, 5.4.6 , OracleDB is 11g ( 11.2.0.3.0 ).

Here is the request:

$sql =  "SELECT
                PATIENT_SOIGNE.NOM,
                PATIENT_SOIGNE.PATRONYME AS NOM_NAISSANCE,
                PATIENT_SOIGNE.PRENOM,
                to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD') AS DDN,
                decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu') AS SEXE,
                PATIENT_SOIGNE.NIP,
                S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ) AS ACTE,
                OPERATEUR.NOM AS NOM_OPERATEUR,
                OPERATEUR.PRENOM AS PRENOM_OPERATEUR
            FROM
                PENSOINS.ACTE_RDV,
                PENSOINS.RDV_STATUT  RDV_STATUT,
                PENSOINS.ACTE_RDV_GRP,
                PENSOINS.S_ACTE_M  S_ACTE_MED,
                PENSOINS.EJ_PERSO  OPERATEUR,
                (
                    SELECT RESSOURCE_OPERATEUR.*,  ACTE_RDV_RESA.NIACTERDV
                    FROM
                        PENSOINS.DXP_RESSOURCE RESSOURCE_OPERATEUR, PENSOINS.ACTE_RDV_RESA ACTE_RDV_RESA
                    WHERE
                        RESSOURCE_OPERATEUR.ID_RESSOURCE=ACTE_RDV_RESA.REF_RESSOURCE
                        AND
                            RESSOURCE_OPERATEUR.REF_TYPE_RESSOURCE=1
                )  TD_RESSOURCE_OPERATEUR,
                PENSOINS.EJ_SRV  RDV_SRV,
                PENSOINS.VENUE,
                (
                    SELECT A.NIACTERDV, A.NIVENUE, TD.NISEJMOUV, V.NIPATIENT, nvl(TD.NISEJOUR, V.NISEJOUR) as NISEJOUR, V.NISERVICE
                    FROM PENSOINS.ACTE_RDV  A,
                        PENSOINS.VENUE      V,
                        (
                            SELECT L.NIACTERDV, L.NIVENUE, DER.DATE_DER_MAJ, L.NISEJMOUV, M.NISEJOUR
                            FROM PENSOINS.LIEN_RDV_MVT L,
                                PENSOINS.MOUVEMEN     M,
                            (
                                SELECT A.NIACTERDV, A.NIVENUE, max(nvl(L.DATE_MODIF, L.DATE_CREA)) DATE_DER_MAJ
                                FROM PENSOINS.ACTE_RDV     A,
                                    PENSOINS.LIEN_RDV_MVT L
                                WHERE A.NIACTERDV = L.NIACTERDV
                                AND L.RETRAIT = 'F'
                                GROUP BY A.NIVENUE,A.NIACTERDV
                            ) DER
                            WHERE L.NISEJMOUV = M.NISEJMOUV
                            AND DER.NIACTERDV = L.NIACTERDV
                            AND DER.NIVENUE = L.NIVENUE
                            AND DER.DATE_DER_MAJ = nvl(L.DATE_MODIF, L.DATE_CREA)
                            AND L.RETRAIT = 'F'
                        ) TD
                    WHERE A.NIVENUE(+) = V.NIVENUE
                    AND TD.NIACTERDV(+) = A.NIACTERDV
                )  TD_VENUE,
                PENSOINS.PATIENT  PATIENT_SOIGNE
            WHERE
                ( PENSOINS.ACTE_RDV.STATUTRDV=RDV_STATUT.NI(+)  )
                AND  ( PENSOINS.ACTE_RDV_GRP.NIACTERDV=PENSOINS.ACTE_RDV.NIACTERDV  )
                AND  ( S_ACTE_MED.NIACTE=PENSOINS.ACTE_RDV_GRP.NIACTE and S_ACTE_MED.NISERVICE=PENSOINS.ACTE_RDV_GRP.NISERVICE  )
                AND  ( OPERATEUR.NIUTILISAT(+)=TD_RESSOURCE_OPERATEUR.ID_DXCARE  )
                AND  ( TD_RESSOURCE_OPERATEUR.NIACTERDV(+)=PENSOINS.ACTE_RDV.NIACTERDV  )
                AND  ( PENSOINS.ACTE_RDV.NISERVICE=RDV_SRV.NISERVICE(+)  )
                AND  ( PENSOINS.VENUE.NIVENUE=TD_VENUE.NIVENUE  )
                AND  ( TD_VENUE.NIACTERDV=PENSOINS.ACTE_RDV.NIACTERDV(+)  )
                AND  ( PATIENT_SOIGNE.NIPATIENT(+)=PENSOINS.VENUE.NIPATIENT  )
                AND  RDV_STATUT.CODE|| ' - ' ||RDV_STATUT.LIBELLE  IN  ( 'R - Attribué','M - Modifié'  )
                AND  RDV_SRV.CODE||' - '||RDV_SRV.NOM  IN  ( '07 - Diététique','08 - Endocrinologie','18 - Oncologie','19 - Ophtalmologie','24 - Pneumologie','30 - Rhumatologie','34 - Orthophonie','40 - Consultations externes','42 - Stomatologie','43 - HOPITAL DE JOUR MEDECINE','44 - Hématologie','20 - ORL','CE 02 - Anesthésie','CE 03 - Cardiologie','CE 04 - Chirurgie Orthopédique','CE 06 - Chirurgie Urologique','CE 07 - Chirurgie Viscérale','CE 08 - Hépato-gastro-entérologie','CE 09 - Chirurgie Plastique','CE 10 - Gériatrie','CE 11 - Gynécologie-Obstétrique','CE 12 - Médecine interne','CE 14 - Pédiatrie','CE 15 - Tabacologie','CE 16 - Chirurgie Vasculaire','16 - Néphrologie'  )
                AND  substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8)  =  '".$date_next."'
            GROUP BY
                PATIENT_SOIGNE.NOM,
                PATIENT_SOIGNE.PATRONYME,
                PATIENT_SOIGNE.PRENOM,
                to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),
                decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu'),
                PATIENT_SOIGNE.NIP,
                S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ),
                OPERATEUR.NOM,
                OPERATEUR.PRENOM";

And the code which uses it:

$date_next = date_next_day();

$db_o = connexion_oracle_dxcare();
$parsed = oci_parse($db_o, $sql);
$ru=oci_execute($parsed);

if (!$ru) { //doesn't show anything
    $e = oci_error($parsed);
    print htmlentities($e['message']);
    print "\n<pre>\n";
    print htmlentities($e['sqltext']);
    printf("\n%".($e['offset']+1)."s", "^");
    print  "\n</pre>\n";
    }

$num_rows = oci_fetch_all($parsed, $res); //returns 0 rows
var_dump($res); //show me all the column names but no datas inside

The date format is good, my function return this format ' YYYYMMDD ' which is working.
The var dump shows:

array(9) { ["NOM"]=> array(0) { } ["NOM_NAISSANCE"]=> array(0) { } ["PRENOM"]=> array(0) { } ["DDN"]=> array(0) { } ["SEXE"]=> array(0) { } ["NIP"]=> array(0) { } ["ACTE"]=> array(0) { } ["NOM_OPERATEUR"]=> array(0) { } ["PRENOM_OPERATEUR"]=> array(0) { } }

I surely miss something but I can't find it. Any ideas?

EDIT:

So I tested if the problem was with the accents, but this request:

SELECT PENSOINS.EJ_SRV.NOM from PENSOINS.EJ_SRV WHERE PENSOINS.EJ_SRV.NOM LIKE 'Dié%'

worked fine (even if it's displayed with é in the browser afterward).

I changed this part:

AND  substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8)  =  '".$date_next."'  
            GROUP BY  
                PATIENT_SOIGNE.NOM,  
                PATIENT_SOIGNE.PATRONYME,  
                PATIENT_SOIGNE.PRENOM,  
                to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),  

multiple times, using some to_char, trunc, to_date but nothing worked.

Concerning the dates, I was able to make this statement:

SELECT PENSOINS.ACTE_RDV.HORAIRE from PENSOINS.ACTE_RDV WHERE substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = :date_test_bv  

worked. Here :date_test_bv is a binding variable of a string like 20140415
So now I'm back at

AND  RDV_SRV.CODE||' - '||RDV_SRV.NOM  IN  ( '07 - Diététique','08 - Endocrinologie','18 - Oncologie','19 - Ophtalmologie','24 - Pneumologie','30 - Rhumatologie','34 - Orthophonie','40 - Consultations externes','42 - Stomatologie','43 - HOPITAL DE JOUR MEDECINE','44 - Hématologie','20 - ORL','CE 02 - Anesthésie','CE 03 - Cardiologie','CE 04 - Chirurgie Orthopédique','CE 06 - Chirurgie Urologique','CE 07 - Chirurgie Viscérale','CE 08 - Hépato-gastro-entérologie','CE 09 - Chirurgie Plastique','CE 10 - Gériatrie','CE 11 - Gynécologie-Obstétrique','CE 12 - Médecine interne','CE 14 - Pédiatrie','CE 15 - Tabacologie','CE 16 - Chirurgie Vasculaire','16 - Néphrologie'  )  

AND  substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8)  =  :date_bv  

GROUP BY  

PATIENT_SOIGNE.NOM,
PATIENT_SOIGNE.PATRONYME,  
PATIENT_SOIGNE.PRENOM,  
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),  
decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu'),  
PATIENT_SOIGNE.NIP,  
S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ),  
OPERATEUR.NOM,  
OPERATEUR.PRENOM  

Knowing that the binded string date produces a successful result and that using the accents is not a problem.
I have 0 error messages, nor from PHP or Oracle, just empty rows like the var dump I showed earlier.
At that point I really don't understand where the problem could be.

Implicit date conversion is responsible for most queries that work differently in different clients. Date formats default to the NLS_DATE_FORMAT value set at the system level, but many clients will override that value by setting the parameter at the session level.

Specifically, these two expressions could have problems:

substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8)  =  '".$date_next."
...
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD')

Many people solve these problems by forcing all clients to change their settings, but a better permanent solution is always specify the desired format, or to avoid date conversion entirely. Assuming those two columns are date values, it would be safer to rewrite the expressions to this:

substr(to_char(PENSOINS.ACTE_RDV.HORAIRE, 1, 8), 'YYYYMMDD')  =  '".$date_next."'
...
trunc(PATIENT_SOIGNE.DATENAIS)

(I'm not sure how PHP works, there may be a better way to pass in the $date_next as a date instead of a string.)

Another wild guess is that the non-ASCII strings are causing problems somewhere:

RDV_SRV.CODE||' - '||RDV_SRV.NOM  IN  ( '07 - Diététique', ...

Take a look at the output from select sql_fulltext from gv$sql where lower(sql_fulltext) like '%07 - Di%; to ensure that the query is getting passed to Oracle correctly. If some file or process doesn't support non-ASCII characters, then you may need to store the Unicode strings like this:

RDV_SRV.CODE||' - '||RDV_SRV.NOM  IN  ( '07 - Di'||unistr('\00E9')|'t'||unistr('\00E9')||'tique', ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM