使用PHP在mysql更新中受影响的行

时间:2009-09-28 15:24:31

标签: php mysql

如何查找我的更新是否成功?我使用where uniqueName = name更新,所以我应该总是只更新0行或1.检查我是否更新了一行的好方法是什么?

10 个答案:

答案 0 :(得分:14)

mysql_affected_rows()将返回受更新影响的行数。

http://us.php.net/manual/en/function.mysql-affected-rows.php

答案 1 :(得分:7)

真的没办法知道它。 假设表tbl_numbers(id,value)有行(1,“one”)和(2,“two”);

$result1="update tbl_numbers set value='first' where id=1";

如果在if子句中检查$ result1,则返回true,mysql_affected_rows()返回1.

然而,$result2="update tbl_numbers set value='two' where id=2"; 如果在if子句中检查$ result2,则返回true,mysql_affected_rows()返回0.

而且,$result3="update tbl_numbers set value='three' where id=3"; 如果在if子句中检查$ result3,则返回true,mysql_affected_rows()返回0。

答案 2 :(得分:3)

答案 3 :(得分:3)

答案 4 :(得分:2)

那么如果用户重新提交与数据库中的信息相同的数据呢?如果内存服务会返回值为0的mysql_affected_rows(),因为根据定义,在该过程中没有更新任何行。然而查询本身就是成功的。

对此的解决方法是在插入之前证明您的内容或使用:

$result = mysql_query($q);
if( mysql_affected_rows() == 0 )
    $state = $result ? "Success" : "Fail";

通过这种方式,您可以检查行是否已更新,如果不是,您可以检查是否出现故障或仅重复数据。

答案 5 :(得分:0)

如果您的更新查询位于名为$ query的变量中,则可以执行;

$result = mysql_query($query);
if($result){
    //succes!
} else {
    //fail!
}

希望这会有所帮助。如果您只想知道您的查询是否已成功执行,则可以执行此操作。如果您真的想知道受影响的行数,请使用其他建议。

答案 6 :(得分:0)

我已经很晚了,但你总是可以通过改变你的查询来强制失败。

对于列'ID'和'value'的表'foo'。匹配表达式:ID = 4

update foo
join (select ID as nearID,
ID = 4
as matched from foo order by matched desc limit 0, 1) as t on nearID = ID
set value='somedata2'    
, ID = if(matched, nearID, 'nomatch')

尽管如此,更改表格以包含更新时间戳或序列号可能更容易。 (因为每次更新都会改变)

答案 7 :(得分:0)

mysql_affected_rows($ link)正确但折旧了.. 现在应该使用mysqli_affected_rows($ link)。

http://php.net/manual/en/function.mysql-affected-rows.php

答案 8 :(得分:0)

如果使用PDO,可以使用rowCount()函数获取受影响的行,如下所示:

@Service
public class ApiUserDetailsService implements UserDetailsService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Value("${spring.queries.users.query}")
  private String usersQuery;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    List<UserDetails> usersBasedOnUserName = getUsersBasedOnUserName(username);

    if (usersBasedOnUserName.size() == 0) {
      throw new UsernameNotFoundException("Username " + username + " not found");
    }
    return usersBasedOnUserName.get(0);
  }

  private List<UserDetails> getUsersBasedOnUserName(String username) {
    return jdbcTemplate.query(this.usersQuery, new String[] {username}, new RowMapper<UserDetails>() {
      @Override
      public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
        String username = rs.getString(1);
        String password = rs.getString(2);
        return new User(username, password, AuthorityUtils.NO_AUTHORITIES);
      }
    });
  }

}

答案 9 :(得分:0)

If you are using prepared statement..

//query
$stmt = $conn->prepare("UPDATE user SET name = 'Jack' WHERE id = ?");

//bind parameters
$stmt->bind_param("i", $id);

//execute
$stmt->execute();

//updated row count
echo $stmt->affected_rows;
echo " rows updated";