Problém s funkcí foreach – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s funkcí foreach – PHP – Fórum – Programujte.comProblém s funkcí foreach – PHP – Fórum – Programujte.com

 

MaraIGI
~ Anonymní uživatel
4 příspěvky
22. 8. 2015   #1
-
0
-

Zdravím,
snažím se si ulehčit práci malou funkcí, do které zadám SQL dotaz který v funkci zpracuji pomocí pdo prepare 'funkce' (většinou s nějakými předdefinovanými místo pro 'vložení' variablu [:name, :id, atd..]), a parametry, které se pomocí pdo bindParam 'funkce' snažím 'nabindovat' do SQL dotazu.

<?
public function query($sql, $params) {
        try {
        $request = self::$connection->prepare($sql); // Přístup k databázi je vždy. :-) - V classe

        foreach($params as $param_key => $param_value) {
            $request->bindParam($param_key, $param_value);
        }

        $request->execute();

        self::close(); // Definováno v classe (ignorujte)

        return true;
    } catch (PDOException $error) {
        die("Nastala chyba v dotazu: ".$error->getMessage());
    }
}

A funkci volám tímto stylem:

$volana_classa->query("INSERT INTO `users` (`username`, `password`, `email`, `reg_time`, `reg_ip`) VALUES (:user, :pass, :email, :time, :ip)",
array(":user" => $d['user'] /* zkoušl jsem i přímý variable.. místo $d['....'] */, ":pass" => $d['pass'], ":email" => $d['email'], ":time" => $d['reg_time'], ":ip" => $d['reg_ip']));

.. A ta funkce se vlastně i provede, vše se do databáze vloží, ale na všech polích v databázi se místo dle předdefinovaných věci vloží jen IP adresa.. Zkoušel jsem si i všechny data vypsat, což také všechny má zadávaná data vypsalo - a dokonce správně.. Ale v rámci této funkce se tomu jakoby nechtělo..  :|

Budu rád za jakoukoliv radu  :)
Díky.

Nahlásit jako SPAM
IP: 89.102.165.–
Kit+15
Guru
22. 8. 2015   #2
-
+1
-
Zajímavé

#1 MaraIGI
Zajímavé, mně to udělalo také. Když jsem však řádky 

foreach($params as $param_key => $param_value) {
    $request->bindParam($param_key, $param_value);
}
$request->execute();

nahradil jediným řádkem 

$request->execute($params);

bylo najednou vše OK.

BTW: Nedá mi to: Proč zavíráš databázi po provedení každého SQL dotazu?

BTW2: Místo "return true" používám něco užitečnějšího: "return $request"

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sakal910
Stálý člen
22. 8. 2015   #3
-
0
-

Zkus odstranit ty dvojtecky u tech klicu v parametrech...

'pass' => $d['pass']

Nahlásit jako SPAM
IP: 31.222.0.–
sakal910
Stálý člen
22. 8. 2015   #4
-
+1
-
Zajímavé

Beru zpátky predchozi prispevek :-D s pdo sem dlouho nedělal, ta dvojtečka tam patří :-) každopádně vymen funkci bindParam za bindValue a melo by ti to slapat ;-) Pokud to tak bude tak dej vedet a ja ti vysvetlim proc

:-)

Nahlásit jako SPAM
IP: 31.222.0.–
MaraIGI0
Duch
22. 8. 2015   #5
-
0
-

Zajímavé, mně to udělalo také. Když jsem však řádky 

foreach($params as $param_key => $param_value) { $request->bindParam($param_key, $param_value); } $request->execute();

nahradil jediným řádkem 

$request->execute($params);

bylo najednou vše OK.

BTW: Nedá mi to: Proč zavíráš databázi po provedení každého SQL dotazu?

BTW2: Místo "return true" používám něco užitečnějšího: "return $request"

 

Toto řešení napadlo mého spolukódícího, ale stejně mi nedalo a chtěl jsem zjistit, proč 'nefunguje' toto řešení. :)
PS: Databázi zavírám kvůli tomu, že po vykonání dotazu si stejně wrapper otevřu, když to tady tak píšu, tak mi to přijde nepraktické.. a asi to i brzo změním. :D
 

Beru zpátky predchozi prispevek :-D s pdo sem dlouho nedělal, ta dvojtečka tam patří :-) každopádně vymen funkci bindParam za bindValue a melo by ti to slapat ;-) Pokud to tak bude tak dej vedet a ja ti vysvetlim proc

:-)

Tak nakonec to bindValue vyřešil. Asi si bindParam nedokáže vycucat přesný údaj z arraye a tak si bere ten poslední nasetovaný a tím je IP adresa. :|
PS: Return mám dělaný jinak - neuvedl jsem celou funkci, celou mám zde (http://pastebin.com/VvdjB2jf) a pro mé účely praktická doopravdy je. :D

Díky za pomoc. :)

Nahlásit jako SPAM
IP: 89.102.165.–
sakal910
Stálý člen
22. 8. 2015   #6
-
0
-

#5 MaraIGI
Koukni se do dokumentace na rozdíl mezi bindParam a bindValue :) Ono bindParam ti přiřadí ke klíči PROMĚNNOU a né hodnotu, takže když se ti změní hodnota té proměnné, tak se to automaticky změní v tom sql dokud nezavoláš execute, a bindValue ti prostě přiřadí jen HODNOTU... :) takže si vlastně v tom foreach přiřazoval ke každému parametru (resp. klíči) stéjnou PROMĚNNOU ( $param_value) které se její hodnota v každém průchodu pole změnila až do posledního průchodu, takže si měl vlastně u všech parametrů nastavenou jen tu poslední hodnotu proměnné $param_value :)

Heh snad sem to nenapsal příliš zmateně :)

Nahlásit jako SPAM
IP: 31.222.0.–
Kit+15
Guru
22. 8. 2015   #7
-
0
-

#5 MaraIGI
Zvykl jsem si líně otevírat databázi a také ji líně zavírat. Resp. ji v PHP nezavírám nikdy, protože to nemá význam.

BindParam() připojí klíč na proměnnou, v tomto případě pokaždé na tu stejnou.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sakal910
Stálý člen
22. 8. 2015   #8
-
0
-

PS: Zkoušel jsi se podívat třeba na knihovnu Doctrine DBAL? Ta to má kompletně všechno vyřešené a usnadní ti hodně práci a hlavně ti ušetří čas :) Takhle jen znova "vynalézáš kolo" :)

Nahlásit jako SPAM
IP: 31.222.0.–
MaraIGI0
Duch
22. 8. 2015   #9
-
0
-

Heh snad sem to nenapsal příliš zmateně :)

Sám jsem se na tu dokumentaci, jak jsi to napsal, ještě předtím podíval a tak jsem to tvoje 'vysvětlení' jakžtakž pobral. :)

Zvykl jsem si líně otevírat databázi a také ji líně zavírat. Resp. ji v PHP nezavírám nikdy, protože to nemá význam.

BindParam() připojí klíč na proměnnou, v tomto případě pokaždé na tu stejnou.

Pobírám, díky. :) 


PS: Zkoušel jsi se podívat třeba na knihovnu Doctrine DBAL? Ta to má kompletně všechno vyřešené a usnadní ti hodně práci a hlavně ti ušetří čas :) Takhle jen znova "vynalézáš kolo" :)

O té knihovně teda slyším poprvé, díky za radu, ale vzhledem k tomu že mám času dost a 'učím se' předělávat kód z špageťáku na něco lepšího, tak zůstanu u PDOčka a toho, co si zkomolím pro ulehčení práce díky OOP. :)

.. A koukám že jste tady na fóru dost aktivní. :D 

Nahlásit jako SPAM
IP: 89.102.165.–
Kit+15
Guru
22. 8. 2015   #10
-
0
-

#5 MaraIGI
PS: Return mám dělaný jinak - neuvedl jsem celou funkci, celou mám zde (http://pastebin.com/VvdjB2jf) a pro mé účely praktická doopravdy je. :D

To vypadá hodně nebezpečně. Funkce by měla vracet vždy stejný typ návratové hodnoty. Pokud se chceš podívat na skript, na kterém jsem tvůj příklad zkoušel, tak tady je:

http://pastebin.com/vGgZnUXk

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sakal910
Stálý člen
23. 8. 2015   #11
-
+1
-
Zajímavé

#9 MaraIGI
Podle mě asi plně nechápeš OOP přístup v programování. Tímhle si akorát vytvoříš potencionální místo chyb, které jsou např. v tom DBAL už dávno ošetřeny... Pak to, že si uděláš nějaký "wrapper" na DB, který ti vlastně ani objekty nevrací, nelze nazývat OOP... Nehledě na to, že plně souhlasím s Kitem, že vracet pokaždé jiný typ je úplně špatný a nebezpečný návrh a k OOP přístupu se to ani nepřiblížilo (to že používáš objekty ještě neznamená že to je OOP )...

Konkrétně k té funkci: funkce by měla dělat jeden konkrétní úkol a vracet jeden konkrétní návratový typ případně null... Tvoje funkce může dělat 3 rozdílné úkoly :P Dále tam máš, že v případě že nastane vyjímka tak se ti hodí die a konec... Co když budeš chtít pak někde v kódu ošetřit tu vyjímku a provést nějakou akci? V tomto návrhu bys musel přepsat kompletně celou aplikaci, respektive místa kde se tahle funkce používá nebo napsat novou funkci, která bude dělat tu samou věc == duplicitní kód jen s tím rozdílem že při vyjímce nehodíš die... Velmi špatný přístup :)

Neber si to nijak zle, chci ti jen poradit... já když začínal tak sem dělal strašné pekla, a myslel jsem si jak to není OOP a perfektní :) Ale na to dříve či později určitě příjdeš sám :)

Nahlásit jako SPAM
IP: 31.222.0.–
Kit+15
Guru
23. 8. 2015   #12
-
0
-

#11 sakal91
No nazdar, v tom svém kódu jsem to jeho die() nechal. To zas bude ostuda...

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
23. 8. 2015   #13
-
+3
-
Zajímavé

#5 MaraIGI
Toho zvyku nepoužívat závorky pro jednořádkový ify se okamžitě zbav, je to šílenej neduh, kterej dělá v kódu akorát bordel.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
MaraIGI0
Duch
26. 8. 2015   #14
-
0
-

Neber si to nijak zle, chci ti jen poradit... já když začínal tak sem dělal strašné pekla, a myslel jsem si jak to není OOP a perfektní :) Ale na to dříve či později určitě příjdeš sám :)

Jo, asi jsem to, že v OOP začínám programovat zmiňovat neměl a vzhledem k tomu že jsem se snažil napsat nějaké 'funkcionální' styled CMS, a měl jsem tam menší progress a nechtěl jsem to zahodit, tak jsem si to tam tak nechal a ještě jsem většinu do OOP nestihl přepsat. :)
A za názor se nezlobím, jen je faktem, že jsem to zmínil tak blbě. :|
Každopádně díky za 'radu' že die() se přímo asi používat takto určitě nemá a ještě ohledně těch returnů. - Díky Kite :)

Toho zvyku nepoužívat závorky pro jednořádkový ify se okamžitě zbav, je to šílenej neduh, kterej dělá v kódu akorát bordel.

Díky za radu, už jsem ji také od kamaráda dostal, časem by se mi to jinak docela vymstilo. :D
.. Jen že to v tom kódu vypadalo tak krásně. :D

A ať se vyhneme offtopicu a vzhledem k tomu že tu máte živou komunitu, tak pokud to tu tak funguje, dejte lock. :)

Nahlásit jako SPAM
IP: 89.102.165.–
Kit+15
Guru
26. 8. 2015   #15
-
+1
-
Zajímavé

#14 MaraIGI
Než se to zamkne, pokud se to zamkne, tak jen pár postřehů:

asi jsem to, že v OOP začínám programovat zmiňovat neměl...

Naopak, tato věta výrazně změnila můj pohled na pokládané dotazy. Dal jsi tím najevo, že se chceš učit. Tak se uč a pokud si nebudeš vědět rady, napiš sem. Nejsme sice ohledně OOP názorově jednotní, ale tím lépe - aspoň si můžeš vyzkoušet všechny varianty.

Jednořádkové ify se dobře dělají například v Pythonu, ale tam s tím souvisí i povinné odsazování nahrazující příkazové závorky "{}". V ostatních jazycích bývají zdrojem obtížně hledatelných chyb - i když moderní editory v tom značně pomáhají a umí i automaticky kompletně přeformátovat kód. Doporučuji to dělat, protože chybějící závorky a středníky pak dají nalézt pouhým pohledem.

Ad "return": Zakázal jsem si používání slov "else" a "break". Nahrazuji je právě returnem - z kódu mi tím zmizela hromada zbytečných příkazových závorek.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Problém s funkcí — založil mistr jirka

Problém s funkcí — založil mistr jirka

Problém s funkcí strtok() — založil Sprinter

Problém s funkcí strcat() — založil Sprinter

Problem s funkci mkdir(); — založil mORb

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý