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..