Unfortunately, you have a malformed url query string, so a regex technique is most appropriate.  See what I mean.
There is no need for capture groups.  Just match id= then forget those characters with \K, then isolate the following one or more digital characters.
Code (Demo)
$str = 'producturl.php?id=736375493?=tm';
echo preg_match('~id=\K\d+~', $str, $out) ? $out[0] : 'no match';
Output:
736375493
For completeness, there 8s another way to scan the formatted string and explicitly return an int-typed value. (Demo)
var_dump(
    sscanf($str, '%*[^?]?id=%d')[0]
);
The %*[^?] means: greedily match one or more non-question mark characters, but do not capture the substring.  The remainder of the format parameter matches the literal sequence ?id=, then greedily captures one or more numbers.  The returned value will be cast as an integer because of the %d placeholder.