Yii Framework Forum: [Risolto] Verifica Univocità Di Una Tripla - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Risolto] Verifica Univocità Di Una Tripla Strano comportamento in fase di creazione Rate Topic: -----

#1 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 699
  • Joined: 03-October 12
  • Location:Ferrara

Posted 17 October 2012 - 05:51 AM

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 if (!$this->isNewRecord) ?

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.

Esiste un'altra soluzione ?

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

A cosa è dovuto ?
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#2 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 17 October 2012 - 06:50 AM

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

#3 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 699
  • Joined: 03-October 12
  • Location:Ferrara

Posted 17 October 2012 - 07:00 AM

$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.
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#4 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 699
  • Joined: 03-October 12
  • Location:Ferrara

Posted 17 October 2012 - 07:39 AM

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è...)
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#5 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 699
  • Joined: 03-October 12
  • Location:Ferrara

Posted 17 October 2012 - 07:41 AM

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) {

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#6 User is offline   Nicola 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 265
  • Joined: 13-March 11
  • Location:Italy

Posted 18 October 2012 - 03:55 AM

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!
1

#7 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 699
  • Joined: 03-October 12
  • Location:Ferrara

Posted 18 October 2012 - 05:32 AM

già, difatti ho cambiato approccio, verificando se l'id è diverso dall'id attuale, e quello fa funzionare il tutto
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users