método de declaración preparado .. confundido

No sé lo que falta o por qué no muestra datos. Mi código funciona si no estoy usando declaraciones preparadas. Cuando utilicé declaraciones preparadas, parece que el código ya no funciona.

db.php

Class Database{


public $mysqli;
public function __construct($db_host, $db_user, $db_password, $db_name){

    $this->con = new mysqli($db_host, $db_user, $db_password, $db_name);

}

    public function selectUserInfo($id){

        $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id = ?");
        $stmt->bind_param("s", $id);
        if($stmt->execute() == FALSE){
            trigger_error($stmt->error, E_USER_ERROR);
        }else{
            $data = array();
            while($row = $stmt->fetch()){
                $data[] = $row;
            }
            return $data;
        }

}
}

config.php

define("DBHOST","somehost");
define("DBUSER","someroot");
define("DBPASS","somepassword");
define("DB","my_database");

Así es como lo mostraría en mi página.

require 'global/db.php';
require_once 'config.php';
$db = new Database(DBHOST, DBUSER, DBPASS, DB);
$data = $db->selectUserInfo($_GET['name']);
foreach ($data as $key) {
    # code...
    echo $key['os_fname'];
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta