mysqli_stmt_execute
mysqli_stmt_execute($stmt, $params = null)
Wykonuje zapytanie przygotowane z wartościami, jakie w tej chwili mają zmienne związane przez mysqli_stmt_bind_param(). Od PHP 8.1 wartości można przekazać wprost w tablicy (wszystkie jako ciągi znaków). Zwraca true, w razie błędu wyjątek albo false.
Parametry
- $stmt – zapytanie przygotowane.
- $params – od PHP 8.1: tablica z wartościami dla znaków zapytania (zamiast
mysqli_stmt_bind_param).
Przykłady
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect("localhost", "user", "password", "shop");
mysqli_set_charset($db, "utf8mb4");
$stmt = mysqli_prepare($db, "UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?");
mysqli_stmt_bind_param($stmt, "iii", $qty, $id, $qty);
$qty = 2;
$id = 1;
var_dump(mysqli_stmt_execute($stmt)); // bool(true)
echo mysqli_stmt_affected_rows($stmt); // 1
// towar z mniejszym stanem niż żądany nie zostanie zdjęty z magazynu
$qty = 5;
$id = 3;
mysqli_stmt_execute($stmt);
echo mysqli_stmt_affected_rows($stmt); // 0
Na co uważać
- Po wykonaniu SELECT jego wynik odczytasz przez
mysqli_stmt_get_result()albo przezmysqli_stmt_bind_result()imysqli_stmt_fetch(). - Tablica parametrów w
mysqli_stmt_execute($stmt, array(…))działa dopiero od PHP 8.1; starsze wersje jej nie przyjmą. - Warunek
stock >= ?w jednym zapytaniu jest bezpieczniejszy niż dwa zapytania „sprawdź i odejmij” – w międzyczasie ktoś inny mógłby kupić towar.
Powiązane funkcje:
mysqli_prepare()
mysqli_stmt_bind_param()
mysqli_stmt_get_result()
mysqli_affected_rows()