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.
Zobrazeno 34 zpráv z 34.
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.
jak do toho dotazu vkládáš hodnoty?
kdyby tam byly tak snad ani neprojdou phpMyAdminem?
Do admina přece netečkuješ.
Proč vlastně tečkuješ? Jde to i bez teček.
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.
Tak při tom přetahování děláš nějakou chybu. Apostrofy, uvozovky, ...
K čemu tečky? SQL dotaz je jeden string.
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.
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.
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.
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 
Jsou to metody prepare a execute. SQL dotaz s tím výrazně zjednoduší.
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.
to by někde mohla teoreticky chybět tečka ... ale to je blbost, by musel použít uvozovky i apostrofy ...
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áží.
tak nahoďte nějaké příklady v PDO, rád se také přiučím 
Tutoriály pro práci s PDO tu přeci jsou již dlouho.
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.
Je jich tady jen velmi málo. PDO toho umí mnohem víc.
Na transakce ale budeš potřebovat InnoDB, SQLite, nebo PostgreSQL. MyISAM transakce moc nezvládá.
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] = "";
To by fungovat mohlo, ale ten skript je šílený.
Už to mám. Funkce mysql_real_escape_string() normálně nefunguje. Musíš použít ekvivalentní metodu z PDO, tedy quote().
Zkus tohle
$moznostiDoEnumu = implode(", ", array_map(array($db, 'quote'), $moznosti));
Musíš mít samozřejmě otevřenou PDO databázi $db.
díky moc. Taková záludnost by mě teda nenapadla.
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íš 
Zobrazeno 34 zpráv z 34.
