Stringhe: confrontare immissione con stringa d'esempio e costruire stringhe da più campi

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Salve a tutti!
Sto costruendo un database per una biblioteca e sto effettuando la sua gestione tramite PHP.

Volevo fare in modo che i vari controlli 'blindassero' le varie possibilità di immissione, e tra questi volevo controllare l'inserimento del codice dei libri per l'aggiunta al database di nuovi volumi.

Il codice è formato per la maggior parte dei casi da un carattere alfabetico che ne rappresenta la categoria, da uno o più numeri che rappresentano l'ordine. Per intenderci:

A 58

Mi chiedevo se fosse possibile effettuare un confronto con una stringa generalizzata per fare in modo che siano tollerate solo immissioni di questo tipo, così che una stringa del tipo "pippo" fosse considerata errata dal sistema.

Stavo pensando di confrontare le varie sottostringhe ma non so se è il sistema più rapido.

Continuando a parlare di codici, questi vengono registrati nel database come

A 58/1-5

dove "/1-5" rappresenta il numero di volumi con quello stesso codice. I volumi sono inseriti separatamente in un altro campo del form (Un menu a tendina "Volumi" con numeri selezionabili).

Come posso fare per unificare la stringa in modo da inserirla nel campo 'codice' del mio database?
 
ciao
se devi verificare l'input alfabetico o numerico a alfanumerico dai un occhio a preg_match
http://it2.php.net/manual/en/function.preg-match.php
se, da quello che ho capito, vuoi dare un codice al volume es quello che hai scritto A 58/1-5
selezionata la categoria
il numero
e il volume
il codice completo puo risultare da
PHP:
<?php
//.....
//esempio
$categoria="A";
$numero="58";
$numero_volume="2";
$codice_volume="$categoria $numero/$numero_volume";//concatenamento delle stringhe
echo $codice_volume;//output => A 58/2
//....
?>
 
Grazie mille della risposta, borgo!

Ho un piccolissimo problema, l'inserimento dello spazio nella stringa!
Ho scritto la mia porzione di codice così:

PHP:
$Codice = $_POST['ADD_Codice'];
		$pattern = '/[A-Z]\H[0-9]{1,4}/';
		$cfr = preg_match($Codice, $pattern);
		
		if ($cfr != 1) {
			$err_cod = 'Inserire un codice valido!';
		
			$_SESSION['Errori'] = serialize($err_cod);
			
			$flag = 'false';
			
			$_SESSION['Flag'] = serialize($flag);

			echo "<meta http-equiv='Refresh' content='0; URL=URLPAG'>";

Dove \H dovrebbe essere il carattere che indica lo spazio...
Inoltre non so se il mio pattern è corretto per una struttura come quella che serve a me...
 
ciao
prova con questo esempio, se vuoi aumentare il numero di lettere e/o cifre aumenta rispettivavemente il secodo numero N di
{1,N}

PHP:
<?php
$stringhe_prova=array('A 68', 'B 7', 'A58','d 37','z 99','8 bb', 'AA 58','U 888');
$pattern="/^[A-Z]{1,1}+ +[0-9]{1,2}$/";
foreach($stringhe_prova as $ch => $va){
	if(preg_match($pattern, $va)){
		echo "la stringa $va è valida<br />";
	}else{
		echo "la stringa $va NON è valida<br />";
	}
}
?>
 
C'è qualcosa che non va...

Ho assegnato il valore inserito come codice ad una variabile, ho usato il pattern che mi hai consigliato
Ho ciclato sul preg_match in questi modi differenti:

PHP:
$Codice = $_POST['ADD_Codice'];
$pattern = '/^[A-Z]{1,1}+ +[0-9]{1,4}$/';
$cfr = preg_match($Codice, $pattern);

// IN QUESTO CASO, HO POSTO $cfr NELL'IF SUCCESSIVO

PHP:
$Codice = $_POST['ADD_Codice'];
$pattern = '/^[A-Z]{1,1}+ +[0-9]{1,4}$/';
 if (preg_match($Codice, $pattern) [...]) {...}

// IN QUESTO CASO HO PARAGONATO IL PREG_MATCH A '1', '0', 1, 0, true, false, SIA CON "==" CHE CON "==="

Il risultato è sempre l'errore. Nel caso in cui metto 1 nel confronto del preg_match, invece, mi viene sempre data come vera.

Cosa c'è che non va?

Il codice 'completo'

PHP:
if (isset($_POST['VER:B_Codice']) && $_POST['VER:B_Codice'] == 'Verifica Codice') { 
	
		// Controllo che il campo sia pieno
		
		$Codice = $_POST['ADD_Codice'];
		$pattern = '/^[A-Z]{1,1}+ +[0-9]{1,4}$/';
		
		// QUESTO E' UNO DEI TENTATIVI

		if (preg_match($Codice, $pattern) == 0) {
			$err_cod = 'Inserire un codice valido!';
		
			$_SESSION['Errori'] = serialize($err_cod);
			
			$flag = false;
			
			$_SESSION['Flag'] = serialize($flag);

			echo "<meta http-equiv='Refresh' content='0; URL=/miapagina.php'>";	
	
		} else {
			
		$flag='true';
			$_SESSION['Flag'] = serialize($flag);
			$_SESSION['Codice'] = serialize ($_POST['ADD_Codice']);

			echo "<meta http-equiv='Refresh' content='0; URL=/miapagina.php'>"
		}
 
Perdonatemi se riapro la discussione, ma dato che il problema è simile ho creduto fosse meglio non aprirne altre...

In sostanza, oltre al già risolto problema della stringa "A 51" ora se n'è presentato un altro.
C'è la possibilità, infatti, che la stringa sia del tipo "A 51 bis".
Ho provato a fare un doppio confronto, con una preg_match che mi confronta la solita stringa "A 51" e un altro che mi confronta l'eventuale "A 51 bis".

Avevo in mente di strutturare il codice in modo che se uno dei due casi sia vero, allora la 'registrazione' avvenga correttamente, ma a quanto pare salto qualche passaggio...

PHP:
$Codice = strtoupper($_POST['ADD_Codice']);
		$pattern = '/^[A-Z]{1,1}+ +[0-9]{1,4}$/';
		$pattern2 = '/^[A-Z]{1,1} + + [0-9]{1,4} +  + [A-Z]{1,3}/';		
		if ((preg_match($pattern, $Codice) === 0)) // qui dovrei inserire l'altra condizione del tipo "(preg_match($pattern2, $Codice) === 0)" {
			$err_cod = 'Inserire un codice valido! (Esempio "A 58" o "A 58 bis")';
[....]
 
ciao
prova questo (ho tralasciato l'upper)
PHP:
<?php
$da_verificare=array('A 51','A 51 BIS','333', 'A51', 'A51 BISCH','AA 51');
$pat="/^[A-Z]{1,1}[ ]{1,1}[0-9]{1,4}[ ]{0,1}[A-Z]{0,3}$/"; 
foreach($da_verificare as $val){
	if(preg_match($pat,$val)){
		echo "codice $val giusto<br>";
	}else{
		echo "codice $val errato<br>";
	}
}
?>
output
codice A 51 giusto
codice A 51 BIS giusto
codice 333 errato
codice A51 errato
codice A51 BISCH errato
codice AA 51 errato

p.s.
un consiglio cercati un manuale che insegni a costruire i codici
 

Discussioni simili