Skip Schumaker went 2-for-4 with an RBI and two runs scored while Yadier Molina was 2-for-3 with an RBI and a run scored for the Cardinals, who snapped a four-game skid. Jamie Garcia (6-2) threw five innings and was charged with just one run on four hits with five walks and four strikeouts.
Adam LaRoche drove in both runs for the Diamondbacks, who have dropped four of their last six. Rodrigo Lopez (2-5) dropped his third straight decision as he was banged up for five runs on six hits with four strikeouts over seven innings.
St. Louis grabbed the lead in the second inning. Matt Holliday led off with a double and came home two batters later on a double from Schumaker. Molina then singled home Schumaker for a 2-0 lead.
Arizona hit into double plays in the second and third innings and Lopez grounded out with the bases loaded in the fourth.
The Diamondbacks got on the board in the fifth. With one out, Conor Jackson doubled and, after a strikeout byJustin Upton and intentional walk to Mark Reynolds, LaRoche smacked a double to right to score Jackson.
After the Molina RBI single, Lopez retired the next 16 batter he faced, but the Cardinals padded their lead in the seventh. With two outs Schumaker and Molina singled and Ryan followed with a shot over the left field wall for a 5-1 lead.
Arizona got one back in the home seventh on an RBI single from LaRoche that plated Upton, who hit a one-out single and moved to third on Reynolds' single. Jason Motte, though, was able to limit the damage as he struck out Chris Young and Chris Snyder to end the frame.
The Diamondbacks put runners on first and second with one out in the eighth, but Ryan Franklin came on and got Jackson to fly out and Upton looking at strike three to end the frame.
Franklin stayed on for the ninth and loaded the bases, but it was with two outs and Carlos Rosa lined out to center to give Franklin his 11th save of the season.
Garcia has won his past three decisions...St. Louis has taken 10 of the last 13 against Arizona...Arizona stranded 16 runners as the team went just 2- for-14 with runners in scoring position...Lopez fell to 2-2 in five career starts against St. Louis.