Dovresti usare, javascript, con jQuery.append.
ecco come:
codice:
<html>
<head>

<style>
	body{padding:0;
		margin:0;}
	#insert{/*È il campo con il textfield da riempire con il nome che si vuole dare al campo che si sta per creare */
		padding:0;
		margin:0;
		position:absolute;
		left:50%;
		top:50%;
		background-image:url(img/BR1Back2.gif);
		margin-left:-150px;
		margin-top:-150px;
		width:300px;
		height:190px;
		display:none;
		opacity:1;
		text-align:center;
		padding-top:110px;
		}
	#over_flow{/*Serve per creare un piccolo effetto overFlow per creare il campo*/
		padding:0;
		margin:0;
		position:absolute;
		width:100%;
		height:100%;
		background-color:#666666;
		opacity:0.8;
		display:none;
		}
	.plus{/*Mi gestisco gli effetti sul simbolo più per renderlo "più interattivo"*/
		cursor:pointer;
		}
	.plus:hover{
		text-decoration:underline;
		}

</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.js"></script>
<script>

	function nascondi(){//Nascondo i div Overflow(un mega div con trasparenza per creare il distacco dal resto della pagina) e Insert un div con il campo da riempire con il nome del campo che stiamo per creare, viene richiamata quando clicco sull'overFlow
		$('#insert').fadeOut(0,0);
		$('#over_flow').fadeOut(0,0);
	}
	function mostra(){// funzione iinversa di quello sopra, viene chiamata quando si clicca su uno dei più che stanno accanto ai campi
		$('#insert').fadeIn(0,1);
		$('#over_flow').fadeIn(0,1);
	}
	
	function crea(){//WOWOWO ci siamo Funzione cre richiamata quando clicco su "Crea Campo"
		var name=$('#nome_campo_nuovo').val();//Prendo il valore del campo con id=nome_campo_nuovo
		name=name.split(' ').join('_')//Sostituisco gli spazi con gli _(underscore) nel contenuto della variabile name
		if(name!=null && name!="" && name!="_"){//se la variabile name contiene altro oltre ad un underscore o se NON contiene ""(cioè se non contiene il non nulla) allora:
		$('form').append("<label>"+name+"</label><input type='text' name='"+name+"' id='"+name+"'/><span class='plus' onclick='mostra()'>+</span> ");//appendo al div con id=campi nuovi il codice che mi crea un nuovo textField che ha come label  e come name e id il nome inserito nel apposito campo
		}
		else// la variabile name è nulla o vuota o ha un solo _(underscore) allora mi fa un alert e mi avverte dell'errore.
		alert('Nome campo errato!');
		nascondi();
		}
</script>
</head>
<body background="img/bg.png" text="#FFFFFF">
<div id="over_flow" onclick="nascondi()"></div>
<div id="insert">
<label>Nome campo:</label><input type="text" name="nome_campo_nuovo" id="nome_campo_nuovo" />

Crea Campo
</div>
<div>
    <form action="img/tuapagina_php.php" method="post">
    <label>Nome</label><input type="text" name="nome"  /><span class="plus" onclick="mostra()">+</span> 
    <div id="campi nuovi"></div>   
    </form>
</div>    
</body>
</html>


E nella pagina php quando ricevi i dati inviati dal form tramite GET o POST dovrai scorrere l'array POST per vedere che cosa ti entra e che nome ha.. oppure crei nello script di Javascript un sistema che ti crea i campi con id sequenziale, resta il problema di identificare il campo se fai così... oppure fai tu delle checkbox con varie scelte senza far viaggiare troppo di fantasia i tuoi utenti. e tu hai un range di ID, chiaramente ogni id si può ripetere solo una volta quindi dovrai disabilitare la check box... queste sono solo miei consigli l'esempio ce l'hai... ciao!