Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP 7 oci_bind_by_name - ORA-01722 invalid number
drussek
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

Ostrzeżenie: (0%)
-----


Witam
Zrobiłem upgrade z PHP 5.5 do PHP 7.1.1 i niestety ale wystąpił problem.
To co zdjagnozowałem to bindowanie do zapytania zmiennej która jest w sql porównywana do typu Date.
Podkładowa baza to Oracle 11.
Dotychczas działałem przy takim zapytaniu:
  1. TRUNC(TO_DATE(:ON_DATE,'YYYY-MM-DD')) BETWEEN a.fromdate AND a.todate


  1. $onDate = '2017-03-02';
  2. .....
  3. oci_bind_by_name($stid, ":ON_DATE", $onDate)


Teraz pojawia się komunikat: ORA-01722 nvalid number.
Bindowanie numberów czy varcharów jest ok.
Ktoś się spotkał? Jakieś pomysły?
Eksperymentowałem z pozbywaniem się to_Date, konwertowałem na znakowe daty z któymi się porównuje, Wykorzystałem klasę DateTime i bindowałem $date->format('Y-m-d') i nadal to samo.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


a tak:

Kod
oci_bind_by_name($stid, ":ON_DATE", $onDate, 24);


?

Ten post edytował Pyton_000 2.03.2017, 10:56:08
Go to the top of the page
+Quote Post
drussek
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

Ostrzeżenie: (0%)
-----


Pyton_000 dziękuję Ci bardzo za odpowiedź.
Wskazane przez Ciebie rozwiązanie nie pomogło, ale znalazłem szczęśliwie przyczynę, która jest całkiem inna, niż mi się wydawało.
Opiszę dokładnie o co chodziło, bo może ktoś jeszcze będzie się z tym borykać.

Zapytanie sql o którym pisałem było nieco dłuższe, ale kluczowa jest jedna dodatkowa linijka:
  1. ....
  2. AND upr.user_id = :USER_ID


Bindowałem 2 zmienne, jedna z datą, drugą z Id usera, który jest numberem. Robiłem jednak jeden bład:
  1. oci_bind_by_name($stid, ":USER_ID", $user->getUserId());


To w PHP 5.5 tylko pluło notką:
Notice: Only variables should be passed by reference
W PHP 7.1 który mam teraz, też daję taką notatkę. Jeśli nie binduję dodatkowo daty (mogę np varchara), to wszystko jest ok, znaczy zapytanie zwraca wynik, którego się spodziewam.
Niestety bindując jeszcze datę, pojawia się komunikat: ORA-01722: invalid number
Wklejając datę, nie bindując, działało. Dlatego nie przyszło mi do głowy, ze przyczyną jest bindowanie wyniku metody a nie zmiennej we wcześniejszym warunku.

Po zmianie na:
  1. $userId = $user->getId();
  2. oci_bind_by_name($stid, ":USER_ID", $userId);

Działa jak ta lala.
Jakieś to nieintuicyjne, ale zmiany w 7'ce kuszą jednak do migracji.

PS. przy okazji, zapis działający wcześniej:
  1. require "/../../cos.inc";

trzeba koniecznie zamienić na:
  1. require "../../cos.inc";

ciekawe...
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Jakieś to nieintuicyjne, ale zmiany w 7'ce kuszą jednak do migracji.
Nieintuicyjne to jest to, ze wylaczyles wyswietlanie bledow NOTICE tudziez je ingorowales nawet jak widziales wczesniej wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


co do require to nie koniecznie... To zależy od tego jak działa php. Bo jeśli php robi chroot to pierwszy zapis zadziała, jeśli nie to drugi. Także tutaj po prostu bezpiecznie jest podawać całą ścieżkę i nie ma problemu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 13:33