Diskuze: PDO dblib vrací jiné výsledky než SQL server managment? je to možné?
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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?
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.
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)
"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.
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.
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.
Zobrazeno 6 zpráv z 6.