Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
bingoplayer
Člen
Avatar
bingoplayer:6.8.2018 23:17

Už 2-3 hodinu si lámu hlavu s pro mě nepochopitelným problémem.

Používám knihovnu PDO s driverem dblib pro spojení s Ms Sql databází. Snažím se pomocí SQL dotazu vytáhnout data z db.

SQL dotaz má tuto strukturu:

SELECT
a.id,
a.test,
(SELECT SUM(b.pocet) FROM tabulkab b WHERE b.id=a.id) as 'data'
FROM tabulkaa a

Když zadám SQL dotaz do SQL server managment, tak se mi vrátí správný výpis dat. Pokud dotaz pošlu přes PHP PDO, tak hodnota 'data' je VŽDY null. Data ze sloupců a.id, a.test jsou v pořádku.

Dotazy jsou úplně stejné, databáze taky, vše jsem ověřoval ale prostě pro sloupec data vrací PDO vždy NULL. Je možné, že PDO nedokáže pracovat s dotazem, který obsahuje "subdotaz" takového typu a jednoduše vyhodí NULL?

Budu moct vděčný za pomoct, protože jsem vyčerpal všechny nápady. Na googlu se mi nic podobného nepodařilo dohledat.

 
Odpovědět
6.8.2018 23:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.8.2018 10:31

Musis pouzit stejny sql prikaz. Zkus pouzit ctrl+c / ctrlv+v.
Eventualne ho mas uplne spatne, ten program nejspis toleruje i chybny zapis a problemove znaky si odstrani nebo nahradi.
Co vypise pdo za chybu? Umis v pdo vypsat sql chybu?
Jak to mas v php zapsane?
Ma spravne vsechny uvozovky?

http://php.net/…rrorinfo.php

Example #1
<?php
/* Provoke an error -- bogus SQL syntax */
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
    echo "\nPDO::errorInfo():\n";
    print_r($dbh->errorInfo());
}
?>

http://www.dpriver.com/…qlformat.htm

SELECT a.id,
       a.test,
       (SELECT Sum(b.pocet)
        FROM   tabulkab b
        WHERE  b.id = a.id) AS 'data' -- sql uvozovky pro sloupce jsou vlevo od pismene Q, cisla 1 na klavesnici `data`
FROM   tabulkaa a

A nemuzes pouzit LEFT JOIN misto vlozeneho SELECT. Tady se to primo nabizi a mohlo by to by ta cast byt tak o 70% rychlejsi, celkove asi 30-50%, zalezi poctu radku.

 
Nahoru Odpovědět
7.8.2018 10:31
Avatar
bingoplayer
Člen
Avatar
bingoplayer:7.8.2018 10:46

SQL dotaz byl pouze ukázkový, abych znázornil princip. Konkrétní SQL dotaz JOIN do cca více různých tabulek nedával by diskutujícím bez znalost tabulek smysl, proto jsem zvolil tuto možnost.
PDO mi nevyhodí žádnou chybu - vrátí data, pouze jeden sloupec je vždy NULL

Pokročil jsem v tom, že když jsem vyzkoušel identický SQL dotaz v SQL MS, HeidiSQL a PHP SQLSRV, tak vždy vyjel správný výsledek, pouze PDO vrací špatný výsledek. Připadá mi to jako kdyby PDO pracovalo s daty jinak.

Originál SQL dotaz níže (chybně se zobrazuje 'Datum_dodani' a 'Na_ceste')

SELECT
s.Produkt, s.Popis_skladove_polozky,
(s.Skladem-s.Blokovano) as 'dostupne',

(SELECT
(SUM(P.Mnozstvi)-(SELECT ISNULL(SUM(E.Mnozstvi), 0) FROM Polozky_dokladu E WITH (NOLOCK) JOIN Doklady D WITH (NOLOCK) ON D.Cislo_dokladu=E.Cislo_dokladu WHERE E.Produkt=P.Produkt and E.Stav='rezervovat' and D.Typ_dokladu='ZZ')) as 'Mnozstvi'
FROM Doklady D WITH (NOLOCK)
INNER JOIN Polozky_dokladu  P WITH (NOLOCK) ON P.Cislo_dokladu = D.Cislo_dokladu
WHERE
P.Produkt=s.Produkt AND
Typ_dokladu='ZO' AND
Kniha='Objednávky'  AND
((P.Datum_dodani IS NOT NULL) or (D.Datum_splatnosti IS NOT NULL)) AND
(Stav LIKE '%POTVRZENO%' OR  Stav LIKE '%přijímá se%' OR  Stav LIKE '%přijmout%')
group by P.Produkt) as 'Na_ceste',

(SELECT
MIN(CASE WHEN J.Datum_dodani IS NULL THEN Y.Datum_splatnosti ELSE J.Datum_dodani END) as Datum_dodani
FROM Polozky_dokladu J WITH (NOLOCK)
JOIN Doklady Y WITH (NOLOCK) ON J.Cislo_dokladu=Y.Cislo_dokladu
WHERE J.Produkt=s.Produkt and Y.Typ_dokladu='ZO' and Y.Kniha = 'Objednávky' and ((J.Datum_dodani IS NOT NULL) or (Y.Datum_splatnosti IS NOT NULL)) and (J.Stav LIKE '%POTVRZENO%' OR  J.Stav LIKE '%přijímá se%' OR  J.Stav LIKE '%přijmout%')) as 'Datum_dodani'

FROM Sklad s WITH (NOLOCK)
 
Nahoru Odpovědět
7.8.2018 10:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.8.2018 8:48

"chybně se zobrazuje 'Datum_dodani' a 'Na_ceste'"
Tos moc neupresnil. Co znamena chybne? Jako vubec? Nebo jen nektere datumy? Ktere?
Zkousel jsi ty dotazy pouzit samostatne? Pripadne, kazdy kousicek zvlast? Zatim to vypada, ze ti nektera cast tech slozitych dotazu selhala. A misto LEFT JOIN tam pouzivas nejake prasarny :)
Treba mas sql nastavene tak, ze misto NULL (WHEN J.datum_dodani IS NULL) ti tam vyplni default hodnotu jako prazdny string ''. Test by mohl byt jednoduchy:

WHEN J.datum_dodani IS NULL THEN 'datum_splatnosti' ELSE 'datum_dodani'

Nebo mozna nefunguje spravne nektera z funkci nebo jinak, pouziva jine parametry. Nechce se mi ted moc premyslet. Proste bych rozebral kazdy kousicek dotazu, udelal testovaci mini SELECTy.

Editováno 8.8.2018 8:49
 
Nahoru Odpovědět
8.8.2018 8:48
Avatar
bingoplayer
Člen
Avatar
Odpovídá na Peter Mlich
bingoplayer:8.8.2018 12:24

Vrací vždy NULL. Vyřešil jsem to doinstalováním PHP knihovny sqlsrv, která na rozdíl od PDO vrací správné výsledky.

 
Nahoru Odpovědět
8.8.2018 12:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.8.2018 12:57

Stejne si myslim, ze mas v tabulce neco spatne. Ze tam neni NULL, ale prazdny retezec. Potom, logicky, by to nejelo. Ale ty ruzna sql muzou mit zapnutou volbu, ze '' a NULL berou jako jedno.
Ale pdo zatim moc nepouzivam, tak muze mit nejake problemove veci.

 
Nahoru Odpovědět
8.8.2018 12:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.