NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Žůrek - misaz:12.8.2013 15:51

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
Avatar
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:12.8.2013 15:57

jak do toho dotazu vkládáš hodnoty?

Nahoru Odpovědět
12.8.2013 15:57
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:01

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:12.8.2013 16:03

kdyby tam byly tak snad ani neprojdou phpMyAdminem?

Editováno 12.8.2013 16:03
 
Nahoru Odpovědět
12.8.2013 16:03
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:05

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:12.8.2013 16:07

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
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:12.8.2013 16:08

jak bez teček?

 
Nahoru Odpovědět
12.8.2013 16:08
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:09

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
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:10

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:12.8.2013 16:12

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:14

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
Odpovídá na Kit
Michal Žůrek - misaz:12.8.2013 16:15

jaký otazník?

 
Nahoru Odpovědět
12.8.2013 16:15
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:18

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
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:25

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
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:12.8.2013 16:26

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
12.8.2013 16:26
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:12.8.2013 16:31

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
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 16:39

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
Odpovídá na Kit
Neaktivní uživatel:12.8.2013 16:45

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
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:12.8.2013 16:53

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
Tvůrce
Avatar
David Hynek:12.8.2013 17:06

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 Hartinger
Vlastník
Avatar
Odpovídá na David Hynek
David Hartinger:12.8.2013 17:26

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

Editováno 12.8.2013 17:27
Nahoru Odpovědět
12.8.2013 17:26
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hynek
Kit:12.8.2013 17:45

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
12.8.2013 17:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:12.8.2013 18:19

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:12.8.2013 18:29

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

Nahoru Odpovědět
12.8.2013 18:29
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:12.8.2013 18:37

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:12.8.2013 18:38

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 18:57

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
Odpovídá na Kit
Michal Žůrek - misaz:12.8.2013 19:00

mohlo, ale nefunguje...

 
Nahoru Odpovědět
12.8.2013 19:00
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 19:09

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
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 19:21

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:12.8.2013 19:30

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

 
Nahoru Odpovědět
12.8.2013 19:30
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:12.8.2013 19:32

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
Odpovídá na Kit
Michal Žůrek - misaz:12.8.2013 19:52

už se stalo.

 
Nahoru Odpovědět
12.8.2013 19:52
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.