GLENDALE, Ariz. -- The NFC championship banner was freshly hanging from the stadium rafters. The offense that helped Arizona win it was rarely on display.
San Francisco's, on the other hand, showed up just enough.
The 49ers went three-and-out on five of their six second-half possessions on Sunday, but Shaun Hill directed a masterful 15-play, 80-yard drive on the other. His 3-yard touchdown pass to Frank Gore with 7:26 to play was the difference in the 49ers' 20-16 victory over the Cardinals.
"It wasn't anything necessarily that I said," Hill said. "The whole unit was saying the same thing: 'Hey, it's time to go.'"
The Cardinals looked a lot like the team that went 0-4 in the preseason and not much, at least on offense, like the one that won three playoff games before a near-miss against Pittsburgh in the Super Bowl just a few months ago.
"We're just not meshing," said Kurt Warner, who threw two interceptions and faced a fierce pass rush much of the afternoon. "We never seem to get into a rhythm. There always seems to be something to stop us."
The 49ers, who endured a brutal training camp under coach Mike Singletary, gave the coach a victory in his first opener after taking over for the fired Mike Nolan seven games into last season. It was Arizona's first loss to an NFC foe in two seasons.
"To come in their backyard, after everything they've accomplished, we knew it was going to be a tremendous challenge," Singletary said.
For the seventh time in the last eight meetings between the teams, the final margin was seven points or less.
Arizona rallied from 10 points down to go up 16-13 on Neil Rackers' 44-yard field goal with 14:52 to play, but the 49ers regained control with a drive that used up nearly half of the final quarter.
"We're definitely too good to be having these kind of performances," the Cardinals' Larry Fitzgerald said.
The Cardinals held Gore to 30 yards in 22 carries and sacked Hill four times, but Arizona committed 12 penalties for 82 yards and had its pass protection break down at crucial times.
"The one thing I want to say for us is that you can't have penalties, you can't have mistakes and expect to win," Cardinals coach Ken Whisenhunt said.
After the 49ers had to punt from their 1 late in the game, the Cardinals had first down at the San Francisco 39.
But a false-start penalty and a holding call pushed Arizona back 15 yards and the threat ended when Warner was leveled by Justin Smith as he threw on fourth-and-5 at the San Francisco 33 with 1:51 to play.
"I'm really most upset by getting the ball back in the fourth quarter in the plus territory and going back 15 yards," Whisenhunt said. "That's horrible. That's unacceptable, and it's what causes you to lose football games. I said to the team afterward, guys that make penalties are not going to play."
Arizona had it once more, this time at the 46 at the finish, but another fierce rush by Smith forced Warner's fumble as the game ended.
Hill completed 18 of 31 passes for 209 yards and one touchdown and wasn't intercepted. Warner was 26 of 44 for 288 yards and one touchdown with two interceptions.
Arizona's Tim Hightower caught 12 passes for 121 yards, the second-most receptions by a running back in Cardinals history. Fitzgerald, who didn't make a catch until the final seconds of the first half, had six for 71 yards. Anquan Boldin, playing despite a sore hamstring, caught one for five yards.
Arizona was without its No. 3 receiver Steve Breaston because of a sprained kneecap.
The 49ers went three-and-out on five of their six possessions in the second half.
But one drive was a doozy.
"We just moved the chains," Hill said. "I don't believe we got any big plays on it, just executing and moving the change."
After the Cardinals had scored 13 points in a row to take the lead, Hill drove the team downfield, converting four third-down opportunities in the process, two on passes to the venerable Isaac Bruce, who had a 50-yard catch in the first half.
On third-and-goal at the 3, the 49ers sent Gore out on the flat and no one followed him. He caught the short pass and scored with no one near him.
"We made a play here, a play there, and we won," Gore said.
The record for catches by a Cardinals running back is 13 by Larry Centers against St. Louis in 1996. ... The two teams opened the season against each other for the fourth straight time. ... San Francisco's Joe Nedney kicked a 50-yard field goal, making him 14 of 30 from 50 or longer in his career.