DETROIT -- Roy Williams found a way to silence his critics.
Playing an entire game for the first time since Oct. 2, Williams had seven receptions for 117 yards and caught TD passes of 7, 21 and 29 yards. The last Lion to catch three TDs in a game was Herman Moore in 1995.
Williams had been out with a quadriceps injury until returning last week, when he was in for three plays. Early in the season, teammate Kevin Jones screamed at him on the sideline for a route he ran, and Williams publicly lamented a lack of chemistry with Harrington.
"Winning cures all," Williams said with a grin.
The second-year receiver might be forgiven after his latest performance, in which he made Harrington look good by making tough catches.
"You don't have to be perfect with him," Harrington said. "A guy like Roy can make plays that aren't there."
Harrington was 22-of-32 for 231 yards with three TDs and no interceptions. He started his second straight game in place of the banged-up Jeff Garcia and didn't hear many boos at home for a change.
"You complete balls and people tend to keep the boos in their pocket," Harrington said.
Detroit (4-5) ended a two-game losing streak and Arizona (2-7) lost its third straight.
The Lions led 19-3 at halftime and by 15 with 8:35 left before Arizona came back.
The Cardinals pulled to 29-21 with 2:24 left on Kurt Warner's 8-yard pass to Larry Fitzgerald. After not recovering the onside kick, Arizona got the ball back at its 18 with 1:01 left. The Cardinals' hopes ended at their 39 with a deflected pass on fourth down.
"It was obviously good to see everybody fought in the second half and put ourselves in a position to win," Warner said. "But I guess when you spot someone 30 minutes it's tough to battle back in this league, no matter who you're playing."
Unlike Arizona, the Lions had some success running the ball with Jones gaining 81 of Detroit's 157 yards rushing.
Cardinals coach Dennis Green said his defense had its worst tackling game of the season.
"We didn't really make any big plays on defense," he said.
Warner started for the Cardinals over Josh McCown and completed 29 of 45 passes for a season-high 359 yards with a TD and no interceptions. Fitzgerald had nine receptions for 141 yards and a score.
The Cardinals had their first TD rushing this year when J.J. Arrington scored from 1 yard in the third quarter, but they had just 38 yards on the ground.
"They throw the ball well, but when we can take away the run it makes them one-dimensional," Lions coach Steve Mariucci said.
Despite Harrington's performance, Mariucci wouldn't say if he would start next week at Dallas.
Arizona had to rely on its kicker to be a bright spot, as usual. Neil Rackers connected from 51 and 28 yards, making him 28-for-28 on field goals this season. He also made two tackles on kickoffs, one that might've prevented a TD.
"He's like a safety," Detroit returner Eddie Drummond said.
The Lions had a pair of 16-point leads before Arizona mounted a failed comeback in the final minutes.
- Lions wide receiver Mike Williams (knee) was not active, but wide receiver Charles Rogers caught a pass for 4 yards in his first game since Oct. 2 after serving a four-game suspension and not traveling to Minnesota last week after a bad week of practice.
- Arizona was without receivers Anquan Boldin (knee) and Bryant Johnson (shoulder).
- Already missing its top two cornerbacks, Detroit was without its third best, Andre Goodman (hamstring).
- Cardinals guard Reggie Wells (ankle), linebacker Karlos Dansby (groin), tight end Eric Edwards (head) and Detroit linebackers Boss Bailey (ankle) and Earl Holmes (knee) left the game with injuries.
- Detroit defensive tackle Dan Wilkinson had his first career safety.