Cuando ejecuta una declaración a través de mysqli, los resultados no están realmente en PHP hasta que los obtiene; el motor de base de datos conserva los resultados. Entonces el mysqli_stmt
El objeto no tiene forma de saber cuántos resultados hay inmediatamente después de la ejecución.
Modifique su código así:
$stmt->execute();
$stmt->store_result(); // pull results into PHP memory
// now you can check $stmt->num_rows;
Esto no se aplica a su ejemplo particular, pero si su conjunto de resultados es grande, $stmt->store_result()
consumirá mucha memoria. En este caso, si lo único que le importa es averiguar si se devolvió al menos un resultado, no almacene los resultados; en su lugar, simplemente verifique si los metadatos del resultado no son nulos:
$stmt->execute();
$hasResult = $stmt->result_metadata ? true : false;