The upside: Even the worst defeats tend to feature a bright spot or two.
The 49ers remain in position to claim the No. 2 seed in the NFC playoff race. They hold the tiebreaker over 10-3 New Orleans.
San Francisco set a franchise record by holding its 14th consecutive opponent without a rushing touchdown. The 1985-86 Chicago Bears made it 15 consecutive games, the longest streak since at least the 1970 merger.
The 49ers extended their streak to 35 games without allowing a 100-yard rusher. That is the longest streak in the league since Minnesota went 36 games in 2007-09. The 49ers held Beanie Wells to 27 yards on 15 carries.
Frank Gore had a 37-yard touchdown run and passed 1,000 yards rushing for the season. He joined LaDainian Tomlinson, Steven Jackson, Thomas Jones and Ricky Williams as the only active running backs with five or more 1,000-yard seasons, according to the 49ers.
Ted Ginn Jr.s' 52-yard punt return deep in Cardinals territory helped the 49ers jump to a 19-7 lead.
The 49ers downed three punts inside the Arizona 20-yard line, including one at the 1. They prevented Patrick Peterson from hurting them with long returns, holding him to an 8.8-yard average and a long return of 19 yards.
The 49ers won the field-position battle. Their drives started at their own 38-yard line on average. The Cardinals' drives began at the Arizona 25 on average.
Looking ahead: The 49ers are home against the Pittsburgh Steelers on Monday night.