Star San Francisco receiver Terrell Owens also was elected to the Pro Bowl for the third time, but he sat out with a strained groin. Garcia adjusted without his best receiver, hitting Tai Streets eight times for 90 yards and connecting with fullback Fred Beasley on a 25-yard touchdown.
"We're a different team without T.O., but we had some receivers make some plays for us today," said Garcia, who completed 23 of 39 passes. "Tai had a lot of catches and J.J. (Stokes) and Cedrick Wilson made some plays as well. Their contributions can only help us in the playoffs."
The 49ers (10-5) clinched the NFC West title two weeks ago and are locked into the fourth playoff seed. That was probably the main reason Owens decided to rest after playing last week with a similar injury in a 20-14 loss to Green Bay.
"He (Owens) hadn't practiced all week, and I want to freshen him up for the playoffs," 49ers Coach Steve Mariucci said.
The loss was the eighth in nine games for the Cardinals (5-10), who started the skid with a 38-28 defeat at San Francisco on Oct. 27.
Jake Plummer played in perhaps his final game at Sun Devil Stadium. Eligible for unrestricted free agency at the end of the season, he completed 16 of 26 passes for just 109 yards and two touchdowns with an interception.
After leading the Cardinals to the playoffs in 1998, Plummer was rewarded with a four-year, $30 million contract. But he should not count on getting another lucrative deal from the Cardinals after throwing for 57 touchdowns and 79 interceptions over the last four seasons.
"If you want the answer, call Miss Cleo," Plummer said, referring to the television psychic. "Whatever is going to happen will happen."
Kevin Kasper, who was waived earlier in the season by Seattle, caught touchdown passes of four and six yards for Arizona.
The 49ers nearly doubled the Cardinals in yardage, 358-184, but had two missed field goals by rookie Jeff Chandler in the first quarter and committed two turnovers in the second half, a fumble by Beasley at the Arizona 17 in the third quarter and an interception in the fourth.
"We made mistakes and our kicking problems continue, but Jeff was able to move the team down the field and our defense played well," Mariucci said.
Cornerback Renaldo Hill intercepted Garcia's deflected pass at the San Francisco 33 with 7:38 left in the fourth quarter.
Plummer hit tight end Steve Bush twice for 10 yards and Marcel Shipp ran four times for 17 yards before Plummer connected with Kasper on a six-yard touchdown, pulling the Cards within 17-14 with 4:08 to play.
But Plummer never got the ball back for a chance at what could have been his 22nd fourth-quarter comeback.
"We just couldn't get their offense off the field, and that was frustrating," Cardinals Coach Dave McGinnis said. "You got the feeling that if we were able to get the ball back, Jake might have had another comeback in him."
After Garcia hit Stokes with a 21-yard pass to midfield, the Cardinals used their second timeout with 3:34 left. But Kevan Barlow sealed the win for the 49ers, gaining 18 yards on three straight carries.
With no timeouts left after the two-minute warning, the Cardinals could only watch the clock run out as Garcia took a knee three times.
Barlow and Garrison Hearst again shared backfield duties and combined for 88 yards on 24 carries.
"It doesn't matter whether it's me or Garrison, but in the fourth quarter I got the call and the line gave me some holes to run through," Barlow said.
Shipp led the Cardinals with 84 yards on 20 carries and caught four passes for 31 yards but also fumbled away the ball at the San Francisco 17 midway through the third quarter.
Wearing red pants with their red jerseys for the first time, the Cardinals still resembled the team that has struggled for two months. On Arizona's first possession, Plummer fumbled, threw an incompletion and was sacked for a 10-yard loss by defensive end Andre Carter.
Garcia completed five of six passes for 59 yards on San Francisco's first drive, capping it with a 25-yard touchdown down the left sideline to Beasley, who took advantage of a mismatch against outside linebacker Michael Young.
After Kasper returned the ensuing kickoff 34 yards to the Arizona 39, Shipp broke off a 40-yard run. But the drive stalled and Bill Gramatica missed a 40-yard field goal attempt.
Garcia directed a 50-yard drive, hitting Streets twice for 22 yards, but Chandler sent a 42-yard field goal attempt wide right with 3:08 left in the period.
Chandler had a shot at another 42-yard field goal after safety Tony Parrish returned an interception 28 yards, but missed wide left with one second remaining in the quarter.
Plummer bounced back and engineered a 15-play, 68-yard drive that lasted nearly 7 1/2 minutes. He hit Kasper with a 15-yard pass on third and eight to keep the drive alive and scrambled 14 yards to the San Francisco four on third and nine. Two plays later, Plummer connected with Kasper on a four-yard touchdown to tie it at 7-7.
The 49ers consumed nearly seven minutes with a 16-play, 60-yard drive that stalled at the Arizona six. Chandler kicked the 24-yard chip shot with 45 seconds left to give San Francisco a 10-7 halftime lead.
After Wilson returned the second-half kickoff 37 yards to the Arizona 47, the 49ers needed just three plays to reach the end zone. Garcia hit Streets with a 33-yard pass and Hearst ran for six yards before bouncing off right tackle for an eight-yard touchdown just 98 seconds into the third quarter.
"Jeff gives you extra time with your routes because he has the ability to improvise in the pocket," Streets said. "That gives the receivers the chance to make plays."
Each team squandered scoring chances in the quarter. Shipp fumbled after being tackled for a six-yard loss by linebacker Derek Smith and Pro Bowl linebacker Julian Peterson recovered for the 49ers at their own 17.
Beasley returned the favor with a fumble at the Arizona 19, where safety Justin Lucas recovered for the Cardinals.