En vez de estar comprobando y demás, es mucho más rápido, eficiente y cómodo hacer que el mysql (por general cualquier base de datos sql) impida la introducción de registros repetidos.
Imaginemos la siguiente estructura de una tabla:
id_usuario //del usuario a votar
id_foto //de la foto a ser votada
fecha_voto //la fecha del día que se vota (sin la hora)
.
. //demás información que quieras meterle
.
creamos unas key
key(id_usuario)
key(id_foto)
key(fecha_voto)
.
.
.
.
y a continuación un únique con estos datos:
unique(id_usuario,id_foto,fecha_voto)
con esto, lo que ocurre, es que, el servidor de sql va a impedir que metas un registro nuevo con el mismo usuario, foto y fecha. Por lo tanto, si el mismo usuario quiere votar la misma foto, hasta el día siguiente no podrá.
Al únique le puedes poner más campos, pero será más restrictivo, piensa que con estos tres campos ya obligas la votación al día siguiente.
De esta manera, por mucho que intentes insertar un registro con los tres (como minimo) campos iguales en contenido, mysql lo impedirá, ahorrando un huevo de recursos. Puesto que usar los condicionales if consumen más recursos al ser lenguajes interpretados que poner restricciones al sql, que trabaja en binario.
Así no hay que etar comprobando nada, solamente un insert y punto.
Luego, para saber cuantos votos a recibido tal foto, simplemente con un count: select count(*) from votaciones where id_foto=23; el valor resultante es el numero de votos recibidos por dicha foto.