Credo di conoscerla io la soluzione a questo problema .
Devi trasformare gli apostrofi passati nel campo in " &#39 ", e poi inviarli al php.
Poi quando hai finito tutti i controlli a fine pagina se non vuoi salvare i dati come " &#39 " , ma come semplici apostrofi fai così:
Codice PHP:
$campo_con_apostrofo str_replace("&#39""'"$campo_con_apostrofo); 
Invece per bloccare l'invio quando vedi un'apostrofo in javascript fai così:
codice:
	var prendi_valore_campo = document.nome_form.nome_campo.value;/*questo è solo per far vedere più avanti la variabile da dove veniva presa*/
	var apostrofo = /^[']+$/;/*così accertiamo grazie a questa variabile che non ci sia un apostrofo nel campo più avanti*/
	if (apostrofo.test(nome_campo) == false){
          alert('apostrofo non consentita nel campo');
          return false;/*questo per bloccare lo script*/
		}
Naturalmente ho fatto in modo che javascript rifiuti i valori con l'apostrofo, mentre php li trasformi alla fine della pagina.
Quello che manca è una trasformazione javascript di tutti i valori con l'apostrofo in #&39, in caso tu li voglia passare(visto che dici ti danno problemi, trasformati in quel modo non dovrebbero darteli più), ma non ricordo bene come si faccia in javascript dei caratteri, prova a cercarla su google, oppure aspetta che mi ritorni in mente .
Fammi sapere se era la soluzione al tuo problema.