Diskuze: PDO error v (asi) správné syntaxi SQL

PHP PHP PDO error v (asi) správné syntaxi SQL American English version English version

Avatar
Michal Žůrek (misaz):

Ahoj,
mám dotaz přes PDO a ono mi to vrátí chybu:

Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in xxx.php on line 68

Přitom když poskládaný dotaz zkopíruju do phpmyadmin tak funguje bez problému. Proč ho PDO neudělá?

Odpovědět 12.8.2013 15:51
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jiří Gracík:

jak do toho dotazu vkládáš hodnoty?

Nahoru Odpovědět 12.8.2013 15:57
Creating websites is awesome till you see the result in another browser ...
Avatar
Nahoru Odpovědět 12.8.2013 15:58
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

V tom SQL dotazu máš syntaktické chyby.

Nahoru Odpovědět 12.8.2013 16:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

kdyby tam byly tak snad ani neprojdou phpMyAdminem?

Editováno 12.8.2013 16:03
Nahoru Odpovědět 12.8.2013 16:03
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Do admina přece netečkuješ.

Proč vlastně tečkuješ? Jde to i bez teček.

Editováno 12.8.2013 16:06
Nahoru Odpovědět 12.8.2013 16:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

echuju si celý dotaz (poskládaný tečkami) a ten v phpMyAdmin projde, ale když se ten dotaz (co se echuje) pošle přes PDO tak neprojde.

Nahoru Odpovědět 12.8.2013 16:07
Nesnáším {}, proto se jim vyhýbám.
Avatar
Nahoru Odpovědět 12.8.2013 16:08
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Tak při tom přetahování děláš nějakou chybu. Apostrofy, uvozovky, ...

Nahoru Odpovědět 12.8.2013 16:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

K čemu tečky? SQL dotaz je jeden string.

Editováno 12.8.2013 16:12
Nahoru Odpovědět 12.8.2013 16:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

Ke skládání řetězců? Potřebuju si připravit část dotazu (přesně skupinku hodnot v enumu) a tu pak vložit do výsledného.

Editováno 12.8.2013 16:12
Nahoru Odpovědět 12.8.2013 16:12
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Doufám, že otazník nedáváš do apostrofů.

Nahoru Odpovědět 12.8.2013 16:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Nahoru Odpovědět 12.8.2013 16:15
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Aha, Obvykle dávám celý SQL dotaz do jednoho stringu i když je třeba na 10 řádek. Připadá mi to praktičtější než slepovat tečkami.

Nahoru Odpovědět 12.8.2013 16:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Otazník jako zástupný symbol pro data. Jak jinak tam ta data vložíš? Ještě můžeš :promenna, ale to používám jen u delších a méně přehledných SQL dotazů. Je s tím trochu víc práce.

Nahoru Odpovědět 12.8.2013 16:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jiří Gracík:

Data se nevkládají spojováním řetězců, při tom právě vznikají chyby. Používají se pro to metody, nevím jak u PDO :)

Nahoru Odpovědět  +1 12.8.2013 16:26
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Jsou to metody prepare a execute. SQL dotaz s tím výrazně zjednoduší.

Nahoru Odpovědět 12.8.2013 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Napadá mě, že jsi omylem dal číslo do apostrofů, ale v té chybové hlášce (na konec jsem doroloval až teď) si stěžuje na 2 apostrofy vedle sebe.

Když nám však neukážeš ten SQL dotaz, tak se těžko radí. Pouze věštím.

Nahoru Odpovědět 12.8.2013 16:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

to by někde mohla teoreticky chybět tečka ... ale to je blbost, by musel použít uvozovky i apostrofy ...

Nahoru Odpovědět 12.8.2013 16:45
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Spíš bych to viděl na přebývající apostrofy.

To je jedno, takové laborování s apostrofy a uvozovkami je pro mne minulostí. Už do SQL dotazů skoro žádné nedávám. Jenom překáží.

Nahoru Odpovědět 12.8.2013 16:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hynek
Redaktor
Avatar
David Hynek:

tak nahoďte nějaké příklady v PDO, rád se také přiučím :)

Nahoru Odpovědět 12.8.2013 17:06
Čím víc vím, tím víc věcí nevím.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na David Hynek
David Čápka:

Tutoriály pro práci s PDO tu přeci jsou již dlouho.

Editováno 12.8.2013 17:27
Nahoru Odpovědět  +2 12.8.2013 17:26
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Hynek
Kit:

Tak si vypůjčím třeba tento příklad:

$result = mysql_query('SELECT * FROM uzivatele WHERE jmeno = "' . mysql_real_escape_string($jmeno) . '"');
while ($row = mysql_fetch_assoc($result)) {
    echo $row['prijmeni'], "\n";
}

který po přepsání do PDO bude vypadat asi takto:

$select = $db->prepare("SELECT * FROM uzivatele WHERE jmeno = ?");
$select->execute(array($jmeno));
foreach ($select->fetchAll(PDO::FETCH_OBJ) as $row) {
    echo $row->prijmeni, "\n";
}

Příjemné je, že výsledek máš rovnou v objektu, takže tím snadno nahradíš ORM.

Nahoru Odpovědět  +1 12.8.2013 17:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Je jich tady jen velmi málo. PDO toho umí mnohem víc.

Nahoru Odpovědět 12.8.2013 18:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Minimálně sem přidám ještě transakce.

Nahoru Odpovědět 12.8.2013 18:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Na transakce ale budeš potřebovat InnoDB, SQLite, nebo PostgreSQL. MyISAM transakce moc nezvládá.

Nahoru Odpovědět 12.8.2013 18:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Michal Žůrek (misaz):

Dotaz vypadá nějak takto:

CREATE TABLE `xxx` ( yyy ENUM('moc','málo'), zzz varchar(15), PRIMARY KEY (zzz) );

Načítají se ty možnosti do ENUMu.

$moznostiDoEnumu = "";
foreach ($moznosti as $moznost) {
        $moznostiDoEnumu .= "'" . mysql_real_escape_string($moznost) . "',";
}
$moznostiDoEnumu[strlen($moznostiDoEnumu) - 1] = "";
Nahoru Odpovědět 12.8.2013 18:38
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

To by fungovat mohlo, ale ten skript je šílený.

Nahoru Odpovědět 12.8.2013 18:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Nahoru Odpovědět 12.8.2013 19:00
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Už to mám. Funkce mysql_real_es­cape_string() normálně nefunguje. Musíš použít ekvivalentní metodu z PDO, tedy quote().

Nahoru Odpovědět 12.8.2013 19:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Zkus tohle

$moznostiDoEnumu = implode(", ", array_map(array($db, 'quote'), $moznosti));

Musíš mít samozřejmě otevřenou PDO databázi $db.

Nahoru Odpovědět 12.8.2013 19:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek (misaz):

díky moc. Taková záludnost by mě teda nenapadla.

Nahoru Odpovědět 12.8.2013 19:30
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Zkoušel jsem tu metodu quote() na dvou různých databázích. Pokaždé escapovala jinak. Přesně tak, jak to ta databáze potřebovala. Proto musí být otevřená.

Doufám, že tu původní ošklivou část skriptu zahodíš :)

Editováno 12.8.2013 19:33
Nahoru Odpovědět 12.8.2013 19:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Nahoru Odpovědět 12.8.2013 19:52
Nesnáším {}, proto se jim vyhýbám.
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 34 zpráv z 34.