Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Błąd skryptu - nie moge znaleźć gdzie

Witam!

Mam taki oto "program":


$cmdstr = "select distinct snr, werk, werk_b, kz_ba, kz_dg, lagort, anlief_ort, kost_stelle, arbpl, afol, zttr, ztte, ruestlos from php.fwk_wykaz_snr_arbpl_tab where werk like 'F' and ztte like '%' ";
if (!$_GET[snr] AND !$_GET[anlo] AND !$_GET[grupa])
{
echo ("<center><font color=\"#FF0000\"><b>Brak kryteriow </b></font></center>");
$cmdstr .= "and ROWNUM < 51";

}
if ($_GET[snr] != "") {
$cmdstr .= "and snr like '$_GET[snr]' ";
}
if ($_GET[grupa] != "") {
$cmdstr .= "and arbpl like '$_GET[grupa]' ";
}
if ($_GET[anlo] != "") {
$cmdstr .= "and anlief_ort like '$_GET[anlo]' ";
}
$cmdstr .= "order by afol";

$parsed = ociparse($_SESSION[conn], $cmdstr);
ociexecute($parsed) or die (insert_error(OCI_Error($parsed)));
@$a=ocifetchstatement ($parsed, $results);


echo ("<table class=\"tabsolid\" cellpadding=\"0\" cellspacing=\"0\">");
echo("<tr><th>snr</th><th>w1</th><th>w2</th><th>ba</th><th>dg</th><th>lagort</th><th>anlo</th><th>kst</th><th>arbpl</th><th>avo</th><th>tr</th><th>te</th><th>ruest.</th></tr>");

for ($i=0; $i<$a; $i++)
{
$snr=$results[SNR][$i];
$werk1=$results[WERK][$i];
$werk2=$results[WERK_B][$i];
$ba=$results[KZ_BA][$i];
$dg=$results[KZ_DG][$i];
$lagort=$results[LAGORT][$i];
$anlo=$results[ANLIEF_ORT][$i];
$kst=$results[KOST_STELLE][$i];
$arbpl=$results[ARBPL][$i];
$avo=$results[AFOL][$i];
$tr=$results[ZTTR][$i];
$te=$results[ZTTE][$i];
$ruest=$results[RUESTLOS][$i];


echo ("<tr><td class=\"tdsolidl\">$snr</td><td class=\"tdsolid\" bgcolor=\"lightgray\" width=\"40\">$werk1</td><td class=\"tdsolid\" width=\"40\">$werk2</td><td class=\"tdsolid\" bgcolor=\"lightgray\" width=\"40\">$ba</td><td class=\"tdsolid\" width=\"40\">$dg</td><td class=\"tdsolid\" bgcolor=\"lightgray\">$lagort</td><td class=\"tdsolid\">$anlo</td><td class=\"tdsolid\" bgcolor=\"lightgray\">$kst</td><td class=\"tdsolid\">$arbpl </td><td class=\"tdsolid\" align=\"right\" bgcolor=\"lightgray\">$avo</td><td class=\"tdsolid\" align=\"right\">$tr</td><td class=\"tdsolid\" align=\"right\" bgcolor=\"lightgray\">$te</td><td class=\"tdsolid\" align=\"right\">$ruest</td></th>");
echo("<tr><th>afol</th><th>skladowe</th><th>sztuk</th><th>jm</th><th>opis</th><th>werk</th><th>anlo</th></tr>");

//=============================================================================================================
//====================skladowe=========================================================================================
$cmdstr_s ="select afol, anlo, me_b, bend, bk_id, werk, possnr, menge from FWA_SKLADOWE_SNR_TAB where bk_id like $snr and werk like 'F' order by afol asc ";
$parsed = ociparse($_SESSION[conn], $cmdstr_s);
ociexecute($parsed) or die (zonk);
$nrows_s = ocifetchstatement($parsed, $results_s);
echo("$cmdstr_s");
//$calkowita_ilosc_skladowych = $calkowita_ilosc_skladowych + $nrows_s;
for($a = 0; $a<$nrows_s; $a++)
{
//$b = $a + $nrows_s +(($i+1)*100);

$bkid = $results_s["BK_ID"][$a];
$werk = $results_s["WERK"][$a];
$posnr = $results_s["POSSNR"][$a];
$ile = $results_s["MENGE"][$a];
$afol= $results_s["AFOL"][$a];
$meb = $results_s["ME_B"][$a];
$anlo = $results_s["ANLO"][$a];
$bend = $results_s["BEND"][$a];
echo ("

<tr bgcolor=\"gray\">
<td align=\"center\" class=\"tdsolid\"><font size=\"2\" >$afol</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" color=\"white\">$posnr</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$ile</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$meb</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$bend</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$werk</font></td>

<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$anlo</font></td>


</tr>
");
}

//=============================================================================================================




flush();

}
//$calkowita_ilosc_meldowanych = $nrows + $calkowita_ilosc_skladowych;
echo ("</table>");


$end = utime(); $run = $end - $start;
$czas_ret = substr($run, 0, 5);
$nrows_ret = $a;
$nrows_org = $nrows_ret;
$nrows_ret = $nrows_ret*14;//mnoży wiersze*kolumny
echo ("Wyświetlono $nrows_org pozycji($nrows_ret rekordów), czas wykonania: $czas_ret");
?>


SQL'e wykonuja sie prawidłowo kiedy są puszczone na same na bazie ale kiedy wykonuje sie program, dostaje:

Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-00936: missing expression in.... i wskazuje na ociexecute drugiego sqla..

Po czym co prawda wybierane są dane ale tak jakby pętla stawała po 3 wybraniu (trzecim zapętleniu) czyli dostaje 3 snr i do nich skladowe.

Gdzie może być błąd?
Z góry dzięki za pomoc
Stanisław P.

Stanisław P. Software designer

Temat: Błąd skryptu - nie moge znaleźć gdzie

Jacek Ołowiak:
$cmdstr = "select distinct snr, werk, werk_b, kz_ba, kz_dg, lagort, anlief_ort, kost_stelle, arbpl, afol, zttr, ztte, ruestlos from php.fwk_wykaz_snr_arbpl_tab where werk like 'F' and ztte like '%' ";
Nie wiem jaka to baza, ale mam nadzieję, że "abc like '%'" potrafi zoptymalizować do noop'a. I tak powinien zrobić to programista.
$cmdstr .= "and snr like '$_GET[snr]' ";
http://strona/skrypt.php?snr=' or ''='
Albo coś podobnego... poszukaj czegoś o bindowaniu.
$cmdstr_s ="select afol, anlo, me_b, bend, bk_id, werk, possnr, menge from FWA_SKLADOWE_SNR_TAB where bk_id like $snr and werk like 'F' order by afol asc ";
Robisz składane na żywca query. Co to jest snr? Czy ma spacje? Znaki specjalne? Czemu nie jest bindowany? ...
SQL'e wykonuja sie prawidłowo kiedy są puszczone na same na bazie ale kiedy wykonuje sie program, dostaje:

Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-00936: missing expression in.... i wskazuje na ociexecute drugiego sqla..
Czemu dajesz tutaj mieszankę php, html i sql, ale nie konkretne query które powoduje problemy? Zrób dumpa echo("$cmdstr_s") PRZED wykonaniem i errorem i podaj jakie konkretnie query powoduje problem!
Gdzie może być błąd?
Pomóż nam Ci pomóc...

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

Jacek Ołowiak:
Witam!

Mam taki oto "program":

$cmdstr = "select distinct snr, werk, werk_b, kz_ba, kz_dg, lagort, anlief_ort, kost_stelle, arbpl, afol, zttr, ztte, ruestlos from php.fwk_wykaz_snr_arbpl_tab where werk like 'F' and ztte like '%' ";
if (!$_GET[snr] AND !$_GET[anlo] AND !$_GET[grupa])
{
echo ("<center><font color=\"#FF0000\"><b>Brak kryteriow </b></font></center>");
$cmdstr .= "and ROWNUM < 51";

}
if ($_GET[snr] != "") {
$cmdstr .= "and snr like '$_GET[snr]' ";
}
if ($_GET[grupa] != "") {
$cmdstr .= "and arbpl like '$_GET[grupa]' ";
}
if ($_GET[anlo] != "") {
$cmdstr .= "and anlief_ort like '$_GET[anlo]' ";
}
$cmdstr .= "order by afol";

$parsed = ociparse($_SESSION[conn], $cmdstr);
ociexecute($parsed) or die (insert_error(OCI_Error($parsed)));
@$a=ocifetchstatement ($parsed, $results);

echo ("<table class=\"tabsolid\" cellpadding=\"0\" cellspacing=\"0\">");
echo("<tr><th>snr</th><th>w1</th><th>w2</th><th>ba</th><th>dg</th><th>lagort</th><th>anlo</th><th>kst</th><th>arbpl</th><th>avo</th><th>tr</th><th>te</th><th>ruest.</th></tr>");

for ($i=0; $i<$a; $i++)
{
$snr=$results[SNR][$i];
$werk1=$results[WERK][$i];
$werk2=$results[WERK_B][$i];
$ba=$results[KZ_BA][$i];
$dg=$results[KZ_DG][$i];
$lagort=$results[LAGORT][$i];
$anlo=$results[ANLIEF_ORT][$i];
$kst=$results[KOST_STELLE][$i];
$arbpl=$results[ARBPL][$i];
$avo=$results[AFOL][$i];
$tr=$results[ZTTR][$i];
$te=$results[ZTTE][$i];
$ruest=$results[RUESTLOS][$i];

echo ("<tr><td class=\"tdsolidl\">$snr</td><td class=\"tdsolid\" bgcolor=\"lightgray\" width=\"40\">$werk1</td><td class=\"tdsolid\" width=\"40\">$werk2</td><td class=\"tdsolid\" bgcolor=\"lightgray\" width=\"40\">$ba</td><td class=\"tdsolid\" width=\"40\">$dg</td><td class=\"tdsolid\" bgcolor=\"lightgray\">$lagort</td><td class=\"tdsolid\">$anlo</td><td class=\"tdsolid\" bgcolor=\"lightgray\">$kst</td><td class=\"tdsolid\">$arbpl </td><td class=\"tdsolid\" align=\"right\" bgcolor=\"lightgray\">$avo</td><td class=\"tdsolid\" align=\"right\">$tr</td><td class=\"tdsolid\" align=\"right\" bgcolor=\"lightgray\">$te</td><td class=\"tdsolid\" align=\"right\">$ruest</td></th>");
echo("<tr><th>afol</th><th>skladowe</th><th>sztuk</th><th>jm</th><th>opis</th><th>werk</th><th>anlo</th></tr>");

//=============================================================================================================
//====================skladowe=========================================================================================
$cmdstr_s ="select afol, anlo, me_b, bend, bk_id, werk, possnr, menge from FWA_SKLADOWE_SNR_TAB where bk_id like $snr and werk like 'F' order by afol asc ";
$parsed = ociparse($_SESSION[conn], $cmdstr_s);
ociexecute($parsed) or die (zonk);
$nrows_s = ocifetchstatement($parsed, $results_s);
echo("$cmdstr_s");
//$calkowita_ilosc_skladowych = $calkowita_ilosc_skladowych + $nrows_s;
for($a = 0; $a<$nrows_s; $a++)
{
//$b = $a + $nrows_s +(($i+1)*100);

$bkid = $results_s["BK_ID"][$a];
$werk = $results_s["WERK"][$a];
$posnr = $results_s["POSSNR"][$a];
$ile = $results_s["MENGE"][$a];
$afol= $results_s["AFOL"][$a];
$meb = $results_s["ME_B"][$a];
$anlo = $results_s["ANLO"][$a];
$bend = $results_s["BEND"][$a];
echo ("

<tr bgcolor=\"gray\">
<td align=\"center\" class=\"tdsolid\"><font size=\"2\" >$afol</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" color=\"white\">$posnr</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$ile</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$meb</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$bend</font></td>
<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$werk</font></td>

<td align=\"right\" class=\"tdsolid\"><font size=\"2\" >$anlo</font></td>

</tr>
");
}

//=============================================================================================================

flush();

}
//$calkowita_ilosc_meldowanych = $nrows + $calkowita_ilosc_skladowych;
echo ("</table>");

$end = utime(); $run = $end - $start;
$czas_ret = substr($run, 0, 5);
$nrows_ret = $a;
$nrows_org = $nrows_ret;
$nrows_ret = $nrows_ret*14;//mnoży wiersze*kolumny
echo ("Wyświetlono $nrows_org pozycji($nrows_ret rekordów), czas wykonania: $czas_ret");
?>

SQL'e wykonuja sie prawidłowo kiedy są puszczone na same na bazie ale kiedy wykonuje sie program, dostaje:

Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-00936: missing expression in.... i wskazuje na ociexecute drugiego sqla..

Po czym co prawda wybierane są dane ale tak jakby pętla stawała po 3 wybraniu (trzecim zapętleniu) czyli dostaje 3 snr i do nich skladowe.

Gdzie może być błąd?
Z góry dzięki za pomoc

Masakra ...
Filip Górny

Filip Górny Programista,
webdeveloper.

Temat: Błąd skryptu - nie moge znaleźć gdzie

To sie nazywa compressed mvc.
Robert B.

Robert B. Web Development
Manager

Temat: Błąd skryptu - nie moge znaleźć gdzie

Ja rozumiem, ze można nie lubieć pracy na obiektach... ale przecież są jeszcze funkcje.

Czy nie da się tego wkleić w bardziej czytelny sposób ? Nie mówię o kolorowaniu składni, ale przynajmniej wcięcia by się przydały...
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Błąd skryptu - nie moge znaleźć gdzie

w samym sql nie ma problemu. w przekazywaniu zmiennych tez nie.

echo pierwszego wyboru:

select distinct snr, werk, werk_b, kz_ba, kz_dg, lagort, anlief_ort, kost_stelle, arbpl, afol, zttr, ztte, ruestlos from php.fwk_wykaz_snr_arbpl_tab where werk like 'F' and ztte like '%' and snr like '88723012786' and arbpl like '%' order by afol

drugi:

select afol, anlo, me_b, bend, bk_id, werk, possnr, menge from FWA_SKLADOWE_SNR_TAB where bk_id like 88723012786 and werk like 'F' order by afol asc

wynik powinien wygladac tak:
pierwszy
drugi
pierwszy
drugi
i tak 8 razy w tym przypadku... a zatrzymuje sie po 3

chyba dokladniej nie moge opisac (nie moge ze wzgledow _sluzbowych_ :>)
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Błąd skryptu - nie moge znaleźć gdzie

Robert Boguszewski:
Ja rozumiem, ze można nie lubieć pracy na obiektach... ale przecież są jeszcze funkcje.

Czy nie da się tego wkleić w bardziej czytelny sposób ? Nie mówię o kolorowaniu składni, ale przynajmniej wcięcia by się przydały...
powiem inaczej - jeśli panowie macie jakies objekcje co do moich umiejętności to poproście admina o dopisanie w opisie grupy "tylko dla super profesjonalistow, którzy biegle władają kodem". Jasne?
Zdaje się, że jeśli bym tak wszystko ładnie robił to nie miałbym tutaj pytań...

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

damn co za bajzel, nic tu nie pomoge bo czytac mi sie nie chce.

chociazby zadalbys sobie tyle trudu i wkleil to na http://phpfi.com/

a jak szukasz bledow, to error_reporting(E_ALL) i mysql_error() w zupelnosci Ci wystarcza. troche rusz glowa (;

pozatym sie tutaj nie unoś, bo to grupa raczej traktujaca o rozwiazywaniu problemow natury algorytmicznej czy rozwiazan architektury aplikacji, a nie szukanie bledow w napchanym kodzie.
z takim problemem to na forum webtips.pl sobie idz.Jakub Świegot edytował(a) ten post dnia 26.02.08 o godzinie 15:03
Stanisław P.

Stanisław P. Software designer

Temat: Błąd skryptu - nie moge znaleźć gdzie

Jacek Ołowiak:
w samym sql nie ma problemu. w przekazywaniu zmiennych tez nie.
To czemu oci_execute pada? :)
echo pierwszego wyboru:

select distinct snr, werk, werk_b, kz_ba, kz_dg, lagort, anlief_ort, kost_stelle, arbpl, afol, zttr, ztte, ruestlos from php.fwk_wykaz_snr_arbpl_tab where werk like 'F' and ztte like '%' and snr like '88723012786' and arbpl like '%' order by afol

drugi:

select afol, anlo, me_b, bend, bk_id, werk, possnr, menge from FWA_SKLADOWE_SNR_TAB where bk_id like 88723012786 and werk like 'F' order by afol asc

Ja widzę różnicę w like '123' i like 123 na przykład. Nie wiem jak to wygląda w oraclu, ale czy to nie jest syntax error w drugim przypadku?
wynik powinien wygladac tak:
pierwszy
drugi
pierwszy
drugi
i tak 8 razy w tym przypadku... a zatrzymuje sie po 3
Tzn. po 3'cim query (robi pierwszy, drugi, pierwszy, i tu się wywala próbując zrobić "drugi"), czy po 3'ciej parze (pierwszy+drugi * 3 i wywala się robiąc "pierwszy") - bo nie jest to dla mnie jasne.
Które query z podanych wyżej się wywaliło?
powiem inaczej - jeśli panowie macie jakies objekcje co do moich
umiejętności to poproście admina
Ja nie mam obiekcji do freelancerów składających query z noopami, sql injection, etc. ale na pewno wytknę to każdemu "programiście/dba". Jeśli chcesz pomocy, zrób co się da, żebyśmy widzieli to co jest potrzebne, bo nikt się tu nie będzie bawił w wyłuskiwanie sql'i z tej papki. Masz problem w wygenerowanych zapytaniach - jak wyżej - pomóż nam Ci pomóc.

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

Jakub Świegot:

Kolego Swiegot, spusc z tonu i przestan zachowywac sie jak nadety bufon. Nie wnosisz nic do dyskusji, trolujesz w wiekszosci watkow - mam Cie dosc, a nie moge odfiltrowac, wiec racz mowic na temat lub nie mow wcale.

I nie trudz sie odpisywaniem.

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

Kod faktycznie strasznie nieczytelny i brzydki ;), ale nie o tym bede...

Zrob prosty debug w petli, za kazdym razem wyrzucajac gotowa kwerende na konsole, do tego E_ALL w error_reporting i powinienes miec znacznie wiecej informacji pomocnych w poszukiwaniach. Trudno debugowac czyjs kod bez dostepu do danych wejsciowych i bazy.

Poza tym, ta kwerenda jest podatna na SQL-injection.
Nie widze zebys gdzies normalizowal/filtrowal to co dostajesz w $_GET[]. Podstawowy blad.
Marcin Juchnicki

Marcin Juchnicki sklep.zagrajsam.pl

Temat: Błąd skryptu - nie moge znaleźć gdzie

Wyświetlenie drugiego zapytania to dobry pomysł. Ja bym radził, zapytanie, które uzyskasz wkleić do bazy i zobaczyć, czy faktycznie wykonuje się prawidłowo.

Niestety to jest Oracle więc mogą być różnice, w MySQL wyłożyłbyś się na fragmentach:
" like $snr " - zmienna powinna być w nawiasach
"order by afol asc" ... brak przecinka.

... poza tym, o ile dobrze zobaczyłem, to masz pętlę wewnątrz drugiej:

for ($i=0; $i<$a; $i++)
{
...
for($a = 0; $a<$nrows_s; $a++)
...
}

Zmieniasz warunki pierwszej pętli w jej środku ... być może to zamierzony efekt, ale jeśli nie, to zmień nazwę zmiennej.
Michał C.

Michał C. Deputy Head of
Software Development

Temat: Błąd skryptu - nie moge znaleźć gdzie

Marcin Juchnicki:

Niestety to jest Oracle więc mogą być różnice, w MySQL wyłożyłbyś się na fragmentach:
" like $snr " - zmienna powinna być w nawiasach
"order by afol asc" ... brak przecinka.

Akurat tu jest wszystko ok ;)

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

Łukasz S.:
Kod faktycznie strasznie nieczytelny i brzydki ;), ale nie o tym bede...

Zrob prosty debug w petli, za kazdym razem wyrzucajac gotowa kwerende na konsole, do tego E_ALL w error_reporting i powinienes miec znacznie wiecej informacji pomocnych w poszukiwaniach. Trudno debugowac czyjs kod bez dostepu do danych wejsciowych i bazy.

Poza tym, ta kwerenda jest podatna na SQL-injection.
Nie widze zebys gdzies normalizowal/filtrowal to co dostajesz w $_GET[]. Podstawowy blad.

no faktycznie wiecej wniosl szanowny Pan do dyskusji niz ja ;)

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

Michał Czerwiński:
Marcin Juchnicki:

Niestety to jest Oracle więc mogą być różnice, w MySQL wyłożyłbyś się na fragmentach:
" like $snr " - zmienna powinna być w nawiasach
"order by afol asc" ... brak przecinka.

Akurat tu jest wszystko ok ;)

Jest tak jak napisał Michał. Zmienna nie musi znajdować się w nawiasach, a "order by afol asc" - nie oznacza sortowania wyników zapytania według dwóch kolumn ("afol" i "asc") tylko według jednej ("afol") narastająco ("asc" = "ascending"). Radzę nadrobić zaległości :)Krzysztof Kuzin edytował(a) ten post dnia 27.02.08 o godzinie 10:42

konto usunięte

Temat: Błąd skryptu - nie moge znaleźć gdzie

sortowanie po wielu kolumnach to raczej

ORDER BY `field_1` DESC, `field_2` DESC, `field_x` DESC
Marcin Juchnicki

Marcin Juchnicki sklep.zagrajsam.pl

Temat: Błąd skryptu - nie moge znaleźć gdzie

Krzysztof Kuzin:
nie oznacza sortowania wyników zapytania według dwóch kolumn ("afol" i "asc") tylko według jednej ("afol") narastająco ("asc" = "ascending").

No, moje niedopatrzenie, tyle tych dziwnych nazw kolumn było, że nie zauważyłem :)
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Błąd skryptu - nie moge znaleźć gdzie

Marcin Juchnicki:
Krzysztof Kuzin:
nie oznacza sortowania wyników zapytania według dwóch kolumn ("afol" i "asc") tylko według jednej ("afol") narastająco ("asc" = "ascending").

No, moje niedopatrzenie, tyle tych dziwnych nazw kolumn było, że nie zauważyłem :)
no niestety dziwne te kolumny, fakt.
co do błędu - faktycznie $a w pierwszej pętli wywalało błąd, nie zauważyłem tego, zmieniłem na b i działa :>

dzięki za trudy pomimo "papki"
Dominik Bednarczyk

Dominik Bednarczyk Analityk /
Programista

Temat: Błąd skryptu - nie moge znaleźć gdzie

Filip Górny:
To sie nazywa compressed mvc.


aaaahahahahaha :D



Wyślij zaproszenie do