DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   wtf? next() "brlja" (http://www.devprotalk.com/showthread.php?t=1274)

oliver 22. 07. 2006. 14:25

wtf? next() "brlja"
 
Pri insertu u tabelu imam gomilu polja, pa umjesto da pisem liniju od "kilometar" - konacno odlucih da odvojim minut-dva i to konacno sredim. Elem, naletih na glup problem, samo jos nisam utvrdio ko je glup: ja ili mi php nesto brlja :)

Po "vuku", next() ce vratiti false ako vise nema elemenata u nizu.

dakle:
PHP kôd:

function insertRow($table$data) {
    
$dbFieldNames "";
    
$dbFieldValues "";

    foreach (
$data as $field=>$value) {
        
$dbFieldNames .= $field;
        
$dbFieldValues .= "'".$value."'";

        if (
next($data)) {
            
$dbFieldNames .= ",";
            
$dbFieldValues .= ",";
        }
    }

    return 
$this->rawQuery("INSERT INTO $table ($dbFieldNames) VALUES ($dbFieldValues)";) ? true false;


Fora je u tome sto mi u ovom slucaju next() nekoliko puta vrati false iako foreach NIJE stigao do poslednjeg elementa, i onda nemam zarez izmedju polja/vrijednosti (= sql syntax error).

U medjuvremenu sam sredio problem po "seljacki":
PHP kôd:

if (end($data) !== $value) {
    
$dbFieldNames .= ",";
    
$dbFieldValues .= ",";


... i to radi pos'o, ali mi i dalje nije jasno u cemu je problem sa prvim nacinom. next() koristim i pri dump-u baze i "sklapam" query-je za backup fajl, tu sve radi kako treba.

Je l' neko imao slicnu muku, prvenstveno da znam da li ja grijesim ili je nesto drugo u pitanju.

bluesman 22. 07. 2006. 14:35

probaj reset() pre petlje da bi ti se interni pointer u nizu vratio na početak, naročito ako si ga već provrteo kroz neku petlju.

oliver 22. 07. 2006. 14:53

Nema nikakvog petljanja s nizom ranije, samo provjerim odredjene vrijednosti i ako je sve ok onda dolazi query. Probao i sa resetovanjem - identicna situacija, 3x vrati false.

Razmisljao sam da je mozda problem do samih podataka/imena kljuceva u nizu, al' je "prost" da prostiji ne moze biti sto se toga tice. Jedina "mana" mu je sto ima ~50 elemenata, al' i to nula naspram npr. dump-a baze kad imam mnogo vece nizove.

BraMom 22. 07. 2006. 15:40

Equal i identical nije isto
 
Loše je postavljen uslov:
if (next($data)) {

taj uslov će vratiti "false" kada je stvarno poslednji slog u pitanju, ali i u još nekim slučajevima.
Fora je u tome što ti ovde radiš "nevidljivo" kastovanje u boolean, tj. php će vrednosti 0 i empty kastovati u false, a pretpostavljam da je to situacija gde ti pravi problem.

Da probam da pojasnim, tvoj uslov je identican ovom
if ((bool)next($data) == true)
a hteo si ovako nešto:
if (next($data) !== false)

Znači ovaj uslov je ispunjen ako je vrednost koju vrati next($data) različit od false, ali i ako je različitog tipa, npr. 0

oliver 22. 07. 2006. 17:09

to je to! na 3 mjesta sam imao nulu kao vrijednost, a igrom slucaja sam dump-ovao kljuceve u else (cisto da vidim sta se desava) i nisam primijetio "anomaliju".

inace uvijek stavljam ==/!== kad (ne)ocekujem boolean, kao i sa ostalim vrijednostima, ali eto, pametovanje me kostalo dodatnog vremena u trenucima kad ono i ne stoji bas na mojoj strani :)

znaci, busted :)

ivanhoe 22. 07. 2006. 17:36

e vidis ovo je vrlo originalan pristup ovom problemu, ovu foru sa next nisam jos nikad video.

Obicno se ovo pise ili kao ova tvoja petlja, pa se onda samo na kraju odbaci zadnji karakter (a to je zarez viska), ili se elementi stavljaju u niz koji se onda na kraju join-uje zarezom.

oliver 22. 07. 2006. 18:35

sjetio sam se danas i toga, da odbacim zadnji karakter, al' sam bio tvrdoglav pa izgurao sa pozicioniranjem elemenata u nizu :)

BraMom 22. 07. 2006. 18:35

Upinjući se da objasnim razliku između equal i identical operatora, zaboravio sam da napomenem da koristim slicnu f-ju, tj. metodu klase, koja u jednoj od reinkarnacija izgleda ovako:
Kôd:

        function InsertRecord($table, $values)
        {
                $query = "INSERT INTO $table SET ";
                foreach($values as $key=>$value)
                        $query .= "$key = '$value',";
                $query = substr($query, 0, -1);
                $this->query($query);
                return $this->res;
        }

Prilično je "divlja", ali i nešto kraća od Oliverovog rešenja.

oliver 22. 07. 2006. 19:21

:1021: Evo update :)

PHP kôd:

function insertRow($table$data) {
    
$dbFieldNames $dbFieldValues "";
    foreach (
$data as $field=>$value) {
        
$comma next($data) !== false "," "";
        
$dbFieldNames .= $field.$comma;
        
$dbFieldValues .= "'".$value."'".$comma;
    }
    return 
$this->rawQuery("INSERT INTO $table ($dbFieldNames) VALUES ($dbFieldValues)");



zextra 22. 07. 2006. 20:44

Ili, mozda ovako...
PHP kôd:

function quoteMe($str) { return "'" $str "'"; }
function 
insertRow($table$data) {
    
$dbFieldNames implode','array_keys$data ) );
    
$dbFieldValues implode','array_map'quoteMe'$data );
    return 
$this->rawQuery("INSERT INTO $table ($dbFieldNames) VALUES ($dbFieldValues)");




Vreme je GMT +2. Trenutno vreme je 11:30.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.