peklo
28.06.2013, 14:09:26
witam
mam taki problem
Chciałbym wykonać rejestrację użytkowników i muszę dodać dane do 3 tabel. Problem polega na tym, że jak mam np insert do trzech tabel i np w drugim zapytaniu jest błąd to pierwszy insert i tak się doda, dwa kolejne natomiast nie. Chciałbym zeby skrypt tak działał,że jeśli w drugim lub trzecin insercie jest błąd to żeby i pierwsze zapytanie również się nie wykonało.
Insert do jednej tabeli wyglada tak. Co i gdzie mam dodać żeby kolejne inserty wykonywały się poprawnie lub nie wykonywały się jeśli jest jakiś błąd. oto częśc kodu. Prosze o pomoc w którym miejscu mam dodać kolejne inserty.
<?php
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "INSERT INTO users(username, password) VALUES(:username, :password)";
$stmt = $con->prepare( $sql );
$stmt->bindValue( "username", $this->username, PDO::PARAM_STR );
$stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );
$stmt->execute();
return "Rejestracja powiodła sie <br/> <a href='../index.php'>Zaloguj sie</a>";
}catch( PDOException $e ) {
return $e->getMessage();
}
?>
peklo
28.06.2013, 14:50:00
czytałem o tym ale nie wiem jak to zastosować bo miałem jakiś błląd
nospor
28.06.2013, 15:08:59
To jak sie ma jakis blad to sie go nam pokazuje..... Jak mamy ci pomoc nie wiedzac jakie masz bledy? 5latek skonczyles juz?
peklo
28.06.2013, 15:35:56
no już dawno jakieś 30 lat temu. A teraz wywala mi taki błąd
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
a kod mam taki
try {
$id_lic .= rand(10000, 99999);
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$con->beginTransaction();
$sql = "INSERT INTO users(username, password,id_lic) VALUES(:username, :password,:id_lic)";
$stmt = $con->prepare( $sql );
$stmt->bindValue( "username", $this->username, PDO::PARAM_STR );
$stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );
$stmt -> bindValue(':id_lic', $id_lic, PDO::PARAM_STR);
$sql ='INSERT INTO uprawnienia (id_lic,dostep_adm) VALUES (:id_lic,:dostep_adm)';
$stmt -> bindValue(':id_lic', $id_lic, PDO::PARAM_STR);
$stmt -> bindValue(':dostep_adm',1, PDO::PARAM_INT);
$stmt->execute();
return "Rejestracja powiodla sie <br/> <a href='../index.php'>Zaloguj sie</a>";
}catch( PDOException $e ) {
$con->rollBack();
return $e->getMessage();
}
nospor
28.06.2013, 15:38:24
1) Drugie zapytanie też ma miec prepare
2) Jakis czas temu zarobiles ostrzezenie za niestosowanie bbcode. Kolejny post bez bbcode zakonczy się kolejnym ostrzeżeniem
3) No jak wszystok jest ok to ma byc jeszcze COMMIT
ps: no to po 35 letnim chlopie nie spodziewalbym sie, ze nie umie zadac pytania na forum
peklo
28.06.2013, 16:23:11
ok wiem że commit na końcu ale w którym miejscu?
nospor
28.06.2013, 16:28:32
Po wykonaniu wszystkich zapytan - to chyba logiczne

U ciebie bedzie to przed
return "Rejestracja powiodla sie <br/> <a href='../index.php'>Zaloguj sie</a>";
peklo
28.06.2013, 16:43:34
ok mądralo. dodałem
$stmt->execute();
$con->commit();
return "Rejestracja powiodla sie <br/> <a href='../index.php'>Zaloguj sie</a>";
i dodaje mi sie do tabeli uprawnienia a do pierwszej już nie

musze Cię trochę pomęczyć żebyśł mi pomógł

oki już sobie porzdziłem dzięki