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 przez mysqli_stmt_bind_result() i mysqli_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()