Ciclo di verifica multipla su campo DB mysql

dynamicdevotion

Nuovo Utente
11 Ott 2011
5
0
0
www.dynamicdevotion.com
Buongiorno a tutti, spero che il titolo renda l'idea di ciò che sto cercando di fare...

Devo creare degli slug per dei permalink ricavandoli da un form (campo Titolo) e memorizzarli in un campo di una tabella, per esempio:
Titolo: "Buongiorno a tutti"
slug: "buongiorno-a-tutti"

Tutto liscio, finchè il titolo non si ripete, quindi con un query ne verifico l'esistenza ed aggiungo un valore numerico alla stringa:
Titolo: "Buongiorno a tutti" (secondo inserimento)
slug: "buongiorno-a-tutti-1"

Ovvio che se si dovesse ripetere il titolo ancora una volta, sarebbe necessario intervenire così:
Titolo: "Buongiorno a tutti" (terzo inserimento)
slug: "buongiorno-a-tutti-2"

Ecco il problema: devo verificare che lo slug esista già nella tabella, nel caso in cui esista devo verificarlo nuovamente aggiungendo il valore numerico (incrementandolo se ne trovo ancora) finchè non lo trovo più, quindi inserirlo nella tabella.
Il ciclo più sensato sarebbe il while:

PHP:
$perma_title = 'buongiorno-a-tutti';
$slug_ok = 0;
$nr = 0;
	
while ($slug_ok == 1)
	{
	$query = "SELECT * FROM tabella WHERE perma_titolo = ".$perma_title;
	$result = mysql_query($query, $db);
	if ($result)
		{$perma_title_temp = $perma_title.'-'.$nr;}
	else
		{
		$perma_title = $perma_title_temp;
		$slug_ok = 1;
		}
	$nr++;
	}

Non funziona, mi salva sempre 'buongiorno-a-tutti'.:skull:
Il query l'ho testato e funziona senza il ciclo while, e non so cos'altro testare, lo script è semplice e non c'è molto da verificare.
Di fatto non va...

Mi chiedo se c'è un bug, oppure se c'è un modo diverso per interrogare il database più volte se trovo i valori all'interno.


Grazie in anticipo:)
 
Insert

Si effettivamente ho tralasciato la parte successiva in quanto senza while tutto funziona:

PHP:
$query = "INSERT INTO tabella (perma_titolo) VALUES ('$perma_title')";
mysql_query($query, $db);

In realtà l'INSERT ha più campi da inserire, l'ho qui semplificato.
Il problema è la creazione corretta di '$perma_title'.
Grazie
 
ciao
se non ho capito male (correggimi se sbaglio)
tu inserisci per la prima volta il titolo (Buongiorno a tutti) - domanda: proviene da un campo di input di un form? -
se non esiste vuoi insereire nella tabella Buongiorno-a-tutti
se tu o chicchessia inserisce un'altra volta Buongiorno a tutti vuoi che quel Buongiorno-a-tutti diventasse Buongiorno-a-tutti-1, e così di seguito (-2, -3,...).
ti indico come farei io (ipotesi come detto proviene da un campo di un form), ti metto riga per riga, poi puoi semplificare
PHP:
<?php
$titolo=$_POST['titolo'];//da verificare comunque se vuoto o con qualche altra porcheria
//tolgo spazi iniziali e finali,poi lo metto (es.) tutto in minuscolo perche se cerco Buongiorno e c'è buongiorno non lo trovo
$titolo=trim($titolo);//spazi
$titolo=strtolower($titolo);//BuOngIorno a tuTTi diventa buongiorno a tutti
$perma_title=preg_replace(" ","-",$titolo);//sostituisco gli spazi con -
/*e qui la parte più complessa
devo verificare se nella tabella esiste già buongiorno-a-tutti indipendentemente che sia senza nulla o termini con
-1
-2
ecc...
*/
//faccio la query
$sql="SELECT * FROM tabella WHERE perma_titolo LIKE '$perma_title%'";//dovrebbe trovare tutii i buongiorno-a-tutti , -1, -2 ecc
$ris=mysql_query($sql);
//verifico se esistono, e nel caso quanti
$esitono=mysql_num_rows($ris);
if($esistono==0){
	//non esiste quindi inserisco
	$sql_1="INSERT INTO tabella(perma_titolo) VALUES('$perma_title')";
	$ris_1=mysql_query($sql_1);//+ verifica dell'insert
}else{//uno o più, es. esiste di già buongiorno-a-tutti quindi il valore di $esiste==1 (o più), quindi uppo
	$perma_title_agg = $perma_title."-".$esitono;//concateno mantenendo l'originale $perma_title
	$sql_1="UPDATE tabella SET perma_titolo='$perma_title_agg' WHERE perma_titolo LIKE '$perma_title%'";
	$ris_1=mysql_query($sql_1);//e qui dovrebbe aggiornarti il perma_link
}
//....
?>
il tutto S.E.O. (in questo caso Salvo Errori e Omissioni)

prova, eventualmente non funzia
 
1000 punti a borgo italia!

Grandioso, mi hai risolto un gran rompicapo.
Grazie infinite!

Non ho potuto testare il tuo codice alla lettera, ma ho capito bene che con LIKE (e % solo alla fine) posso vedere e contare quante stringhe "potenzialmente uguali" ci sono nel database, e se ci sono uso il numero di stringhe presenti per definire il suffisso del nuovo permalink da generare.
In un quarto di codice e di tempo ho risolto il problema...
Ecco come, semplificando in base alle mie esigenze:

Funzione crea permalink:
PHP:
function create_perma($permatext)
	{
	$permatext = strtolower($permatext);
	$permatext = preg_replace("/[^0-9A-Za-z ]/", "", $permatext);
	$permatext = str_replace(" ", "-", $permatext);
	while (strstr($permatext, "--"))
		{$permatext = preg_replace("/--/", "-", $permatext);}
	return $permatext;
	}

Verifica esistenza della stessa stringa (si, proviene da un campo di form):
PHP:
$title = htmlspecialchars ($_POST['title']);
$perma_title = create_perma($title);

$query = "SELECT * FROM tabella WHERE perma_titolo LIKE '".$perma_title."%'";
$result = mysql_query($query, $db);
$esitono = mysql_num_rows($result); 

if ($esitono != 0)
	{$perma_title = $perma_title.'-'.$esitono;}

Poi procedo all'INSERT dopo altri controlli derivati dal form, l'importante è inserire in '$perma_title' il giusto valore.
Testato ed inserito nel lavoro, funziona tutto perfettamente!


GRAZIE GRAZIE GRAZIE GRAZIE GRAZIE!
:beer:
 

Discussioni simili