A placeholder ?can only be used in a prepared statement when replacing values, and not for field names, table names, or statement names.
You are trying to use it for a field name.
You can create a query string
$stmt = $this->con->prepare("SELECT " . $what . " FROM `shop_items` WHERE `id` = ?");
, , $what, sql.
$stmt = $this->con->prepare("SELECT * FROM `shop_items` WHERE `id` = ?");
(. http://it1.php.net/manual/en/mysqli-result.fetch-assoc.php), , $what