2012-07-24 10 views
14

Chciałabym wiedzieć, czy mogę przygotować jedno oświadczenie mysqli, który wykonuje kilka zapytań:mysqli: czy potrafi przygotować wiele zapytań w jednym wyciągu?

mysqli->prepare(query1 ...1,2,3 param...; query2...4,5 param...); 
or 
mysqli->prepare(insert into ...1,2,3 param...; insert into...4,5 param...); 
and after all 
mysqli->bind_param("sssss", 1, 2, 3, 4, 5); 

W ten sposób to zrobić error: Zadzwoń do bind_param funkcji członka() na non-object in ...

$stmt = $sql->getQueryPrepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?); INSERT INTO process (id_user, idp) VALUES (?,?);"); 

$stmt->bind_param("ssssss",$id, $username, $pw, $email, $id, $idp); 

$stmt->execute(); 
$stmt->close(); 
+0

Czy możesz zamieścić faktyczny kod źródłowy? Jakiego obiektu wywołujesz 'bind_param()' on? – Tchoupi

+1

@GermannArlington, czy znasz różnicę między Javą i PHP? – Pacerier

Odpowiedz

20

Przygotowana instrukcja może wykonać tylko jedno zapytanie MySQL. Możesz przygotować dowolną liczbę instrukcji w różnych zmiennych:

$stmtUser = $sql->prepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?)"); 
$stmtProc = $sql->prepare("INSERT INTO process (id_user, idp) VALUES (?,?);"); 

A następnie wykonać je później. Jeśli chcesz mieć pewność, że żadna z nich nie zostanie uruchomiona, dopóki obie nie będą w stanie działać, musisz przejrzeć transakcje, jak powiedział Thomas.

Ogólna wskazówka: "wywołanie funkcji członka na obiekcie" jest standardowym błędem, który pojawia się, gdy prepare() ulega awarii, więc $stmt nie jest faktycznie przygotowanym obiektem instrukcji. Zazwyczaj oznacza to, że musisz szukać błędu w swoim oświadczeniu prepare(), a nie później.

+0

Wielkie dzięki;) – Donovant

+1

Ale przygotowanie wielokrotności nie jest procesem atomowym? – Donovant

+1

Prawidłowo, robienie tego przy wielu przygotowaniach nie jest atomowe. – octern

15

Nie, pojedyncze wywołanie funkcji mysqli prepare() nie może przygotować wielu zapytań jednocześnie. Można jednak przygotować więcej niż jedno zapytanie do wykonania, używając różnych zmiennych. The documentation for this function is available here.

Wygląda na to, że próbujesz skonfigurować transakcję, co jest inne niż zadawane. Jeśli tak naprawdę chcesz wiedzieć, musisz podać więcej informacji na temat konfiguracji bazy danych i prawdopodobnie więcej szczegółów na temat przypadku użycia, który próbujesz rozwiązać.

+1

Mimo że możesz przygotować więcej niż jedną kwerendę do wykonania przy użyciu różnych zmiennych, ** nie możesz jej przeciąć **. [Nie zadziała] (http://stackoverflow.com/questions/11632902/mysqli-can-it-prepare-multiple-queries-in-one-statement#comment50240272_11635679). – Pacerier