Change your original code to reflect bound parameters using mysqli, this is more secure and should work     
$query="select * from members where useremail='$user_email' and password='$password'";
    $result=$db->query($query);
    $row = $db->fetch_array($result);
    echo $row['id'];
to bound parameters using mysqli prepared statements
$query="select id from members where useremail=? and password=?";   // Don't use select *, select each column, ? are placeholders for your bind variables
$stmt = $connection->prepare($query);
if($stmt){
  $stmt->bind_param("ss",$user_email,$password);   // Bind in your variables, s is for string, i is for integers
  $stmt->execute();  
  $stmt->bind_result($id);  // bind the result to these variables, in the order you select
  $stmt->store_result();   // Store if large result set, can throw error if server is setup to not handle more than x data
  $stmt->fetch();
  $stmt->close();
  }
echo $id;  // this would be same as $row['id'], $id now holds for example 5. 
If you select multiple things, such as "SELECT id,name FROM...", then when you bind_result(..), just bind them n there. $stmt->bind_result($id,$name);
now $id and $name hold the column data for that row matching your query.  If there would be multiple rows matching, instead of $stmt->fetch() you'd do
while($stmt->fetch()){    // just like while($row = $result->fetch_assoc()){}
   echo $id;
   echo $name
}