It ended Bradford’s run of six home league matches without a win and marked a losing return to Valley Parade for former City manager Gary Bowyer.
Leading scorer Brandon Thomas-Asante put Salford ahead in the 35th minute, shaking off the challenge of defender Niall Canavan before scoring.
Eight minutes later he was sent off after striking O’Connor with his elbow.
Ashley Hunter missed a good chance for Salford before City equalised in the 57th minute, Andy Cook, who who had come off the bench three minutes earlier, saw his header deflected over the head of Tom King.
Bradford pressed for the winner and were rewarded in the 85th minute when O’Connor scored with a header from substitute Callum Cooke’s cross.
Adams said: “Paudie showed his bravery at the end to get that header. He has lost a tooth and has to get some dental surgery,
“I thought it was a really good performance. We started very well and dominated the first half. We were unlucky to go a goal down which came out of nothing, but we got the win we deserved.”
Adams praised Jamie Walker, on loan from Hearts until the end of the season. He said: “I thought he was the best player on the pitch with the way he took the ball and opened up the defence. He looked a class act.”
Bradford City: Hornby, Cousin-Dawson (Cook 54), O’Connor, Canavan; Ridehalgh, Watt, Sutton, Gilliead, Walker (Songo’o 87); Vernam (Cooke 82), Angol. Unused substitutes: O’Donnell, Foulds, Robinson, Lavery.
Salford City: King, Vassell, Eastham, Turnbull, Love; Lund (Elliott 69), Lowe, Morris (Oteh 87), Watson; Hunter (Kelly 72), Thomas-Asante. Unused substitutes: Ndaba, McAleny, Bughail-Mellor, Torrance.
Referee: J Oldham (England).