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.

Člen

Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.