[Risolto] Verifica Univocità Di Una Tripla

Ho un validator che verifica la validità di una tripla Tipo-Conf-Size




$where = 'itemTypeId=:myTypeId AND itemConfId=:myConfId AND itemSizeId=:mySizeId';

	        

	    $params = array(':myTypeId'=>$this->itemTypeId, 

                         ":myConfId"=>$this->itemConfId, 

                         ":mySizeId"=>$this->itemSizeId

	                   );

	    

	    // In base di modifica devo permettere di salvare il record se la tripla è presente in QUESTO record

	    if (!$this->isNewRecord) {

	        $where .= " AND id!=:myId";

	        $params [":myId"] = $this->id;

	    }


$item = $this->model()->find($where, $params);



Notate che ho dovuto inserire un [font="Courier New"]if (!$this->isNewRecord)[/font] ?

Praticamente in fase di creazione devo, ovviamente verificare che NON esista in tabella un’altra tripla identica.

Anche in fase di modifica devo fare la verifica, ma in questo caso mi da un falso errore, perchè il record attuale, che è in modifica, ha proprio quella tripla, quindi devo escludere l’id del record corrente da quelli che matchano.

[b]Esiste un’altra soluzione ?

[/b]

Se lascio [font="Courier New"] AND id!=$this->id [/font], in fase di salvataggio NON SO PERCHè ma il controllo passa anche se la tripla esiste.

A cosa è dovuto ?

Mi sembra che in sql si scriva $where .= " AND id <> :myId";




$where = 'itemTypeId=:myTypeId AND itemConfId=:myConfId AND itemSizeId=:mySizeId AND id<>:myId';

	        

	    $params = array(':myTypeId'=>$this->itemTypeId, 

                         ":myConfId"=>$this->itemConfId, 

                         ":mySizeId"=>$this->itemSizeId,

	                     ':myId'=>$this->id,

	                   );




$item = $this->model()->find($where, $params);

if (!is_null($item)) {

  ... add error .. 

}



… ci stavo quasi sperando, ma anche così, in fase di creazione, il risulta è sempre null , e non capisco come è possibile !

Il sql composto è fatto così

SELECT * FROM tbl_items t

WHERE itemTypeId=:myTypeId

AND itemConfId=:myConfId

AND itemSizeId=:mySizeId

AND id<>:myId

LIMIT 1

Ho verificato che in caso di creazione il sql fa id<>NULL … non so se forse è questo che fa strippare mysql, ma da phpmyadmin sembra tutto ok.

revoca.

DA PhpMyAdmin, usando l’espressione and id<>NULL si ottiene sempre un insieme vuoto, anche se senza questo and una riga effettivamente c’è.

usando AND id IS NOT NULL ho addirittura un errore SQL (sono su INNODB, e non chiedetemi perchè…)

HO RISOLTO così:




 $where = 'itemTypeId=:myTypeId AND itemConfId=:myConfId AND itemSizeId=:mySizeId';

	        

	    $params = array(':myTypeId'=>$this->itemTypeId, 

                         ":myConfId"=>$this->itemConfId, 

                         ":mySizeId"=>$this->itemSizeId,

	                   );

	    

        $item = $this->model()->find($where, $params);

        if ( $item->id <> $this->id) {



Anche se hai risolto, mi sembra molto strano che una query semplice come quella dia problemi di… sql.

Una cosa tipo


SELECT * FROM pippo WHERE nome = 'ciao' AND id <> 2

è corretta (puoi anche usare !=) e funziona egregiamente, usare invece id <> NULL non è consentito, oddio puoi farlo ma non avrai mai un risultato perché la comparazione aritmetica con NULL da sempre NULL, mentre id IS NOT NULL è la via corretta.

Che tu usi InnoDB è cosa buona altrimenti non potresti impostare chiavi straniere :)

Premesso questo se il tuo ‘:myId’ che passi alla query può essere NULL allora devi prima convertire quel NULL a 0 o cambiare approccio!

già, difatti ho cambiato approccio, verificando se l’id è diverso dall’id attuale, e quello fa funzionare il tutto