Pogledajte određenu poruku
Staro 05. 05. 2006.   #1
ivanhoe
Ivan Dilber
Sir Write-a-Lot
 
Avatar ivanhoe
 
Datum učlanjenja: 18.10.2005
Lokacija: Bgd
Poruke: 5.320
Hvala: 104
2.344 "Hvala" u 583 poruka
ivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svima
Pošaljite poruku preko Skype™ za ivanhoe
Default gremlini na serveru

Odrzavam jedan server koji je postao prilicno popularan u poslednje vreme i zbog toga na momente vrlo (pre)opterecen, i verovatno zbog toga, krenule su da mi se desavaju neke jako cudne stvari.

PHP kôd:
$sql "SELECT * FROM members WHERE (email='$email' OR username='$email')";
    
$db->query($sql);
    if(
$db->next_record()) {
        
$processed $db->f("processed");
        
$member_id $db->f("id");
    }
    
    if (
$processed=='y') { 
        
$error USER_EXISTS;
    } else {
        
        if(
$member_id) {// just update existing record
            
$sql "UPDATE members SET first_name='$first_name', last_name='$last_name', pword='$password', source=".HUB_SOURCE_ID." WHERE id='$member_id'";
            
$db->query ($sql);
            
$last_id $member_id;
            
        }else {
// insert a new one
            
$sql "INSERT INTO members (email, first_name, last_name, pword, active, processed, source, first_contact)  VALUES ('$email', '$first_name', '$last_name', '$password', 'n', 'n', ".HUB_SOURCE_ID.", NOW())";
            
$db->query ($sql);
            
$sql "SELECT * FROM members WHERE email='$email' AND pword='$password'";
            
$db->query ($sql);
            
$db->next_record();
            
$last_id $db->f('id');
        } 
Ovaj komad koda koji sluzi da kreira usera i onda se dalje korisnik salje na paypal. Bitna stvar ovde je $last_id, tj. id pod kojim je user upisan u bazu, jer se to koristi da se kad uplata prodje aktivira taj nalog. I ovo je sve normalno radilo godinama, ali kad se mysql server (i ceo server) nadje pod opterecenjem, pocelo je da se desava da se paypalu prosledi pogresna vrednost za $last_id...

Proveravao sam u bazi i postoji samo jedan user record sa tim emailom, ali poslednji upit na neku foru vrati pogresan ID ??? Jel ima neko ideju kako je to moguce da se desi???

Ovaj $db objekat je iz phplib, i da je bilo neke mysql greske desio bi se die() odmah, tako je namesteno. Znaci nije bilo greske, ali je vracen pogresan podatak (npr. 487522 umesto 487556, pri cemu record sa ID=487522 ima skroz drugaciji email i pass znaci nikako nije smeo da se nadje u rezultatu)

Da li postoji neki nacin da se zastitim od ovakvih stvari? Uradicu uskoro load-balancing, cim klijenta ubedim da da kintu za dodatni server, ali ipak bih voleo i da ovo predupredim za ubuduce, ako je moguce..
__________________
Leadership is the art of getting people to want to do what you know must be done.
ivanhoe je offline   Odgovorite uz citat