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.
Tvůrce
Zobrazeno 34 zpráv z 34.
//= 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.
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.