Yii Framework Forum: ricerca basata sulla formula Haversine - Yii Framework Forum

Jump to content

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

ricerca basata sulla formula Haversine Rate Topic: -----

#1 User is offline   webby 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 24-March 11

Posted 14 June 2011 - 05:18 AM

Salve, sto realizzando una action di ricerca che ordina dei negozi per distanza in base all'indirizzo di partenza e il raggio di ricerca, ho una tabella vetrina in cui ho inserito tra i vari campi latitudine,longitudine e link_sconto (in realtà è il campo che popolo con il raggio entro cui fare la ricerca) ecc... ora eseguendo la action mi da il seguente errore

CDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '<24ORDER BY distanceLIMIT 0,20' at line 1

questa è la mia action $model->latitudine, $model->longitudine, $model->link_sconto sono i parametri che ricevo dalla view al submit

public function actionRicerca()
{
$model=new Vetrina('search');
$model->unsetAttributes(); // clear any default values
if(isset($_POST['Vetrina'])){
$model->attributes=$_POST['Vetrina'];

//crea query
$connection = Yii::app()->db;
$sql = 'SELECT id_vetrina,proprietario,indirizzo,cap,municipio,logo,telefono,sito,descrizione,categoria,sottocategoria,pubblicato,( 3959 * acos( cos( radians('.$model->latitudine.') ) * cos( radians( latitudine ) ) * cos( radians( longitudine ) - radians('.$model->longitudine.') ) + sin( radians('.$model->latitudine.') ) * sin( radians( latitudine ) ) ) ) AS distance FROM vetrina';
$sql .= 'HAVING distance<'.$model->link_sconto;
$sql .= 'ORDER BY distance';
$sql .= 'LIMIT 0,20';


$command = $connection->createCommand($sql);
$results = $command->queryAll();

$this->render('index',array(
'dataProvider'=>$results,
));
}else {

$this->render('ricerca',array(
'model'=>$model,
));
}
}

da quanto ho capito il problema dovrebbe essere nella parte SQL prima di FROM ma dove??? sembra tutto corretto!!!
0

#2 User is offline   Maurizio Domba Cerin 

  • Yii - Yesss It Is !!!
  • Yii
  • Group: Yii Dev Team
  • Posts: 4,353
  • Joined: 12-October 09
  • Location:Croatia

Posted 14 June 2011 - 05:30 AM

La prima cosa che ho notato e "24ORDER" e "distanceLIMIT"

le frasi sono incolatte!
Find more about me.... btw. Do you know your WAN IP?
0

#3 User is offline   webby 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 24-March 11

Posted 14 June 2011 - 08:57 AM

Esatto!! hai fatto una grande osservazione!!!! era quello il problema lo spazio...
Ora
ammesso che la query dia risultati, la parte di codice che segue è corretta??

$command = $connection->createCommand($sql);
$results = $command->queryAll();

$this->render('index',array(
'results'=>$results,'sql'=>$sql,
));

poi dalla view ho fatto un test con soli due campi

?php echo foreach( $results as $data ): ?>

<div class="view">

<b><?php ///echo CHtml::encode($data->getAttributeLabel('id_vetrina')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->id_vetrina), array('view', 'id'=>$data->id_vetrina)); ?>
<br />

<b><?php //echo CHtml::encode($data->getAttributeLabel('proprietario')); ?>:</b>
<?php echo CHtml::encode($data->proprietario); ?>
<br />

</div>
<?php endforeach; ?>


ma sembra come se $results non fosse passato alla view! sbaglio qualcosa????
0

#4 User is offline   webby 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 24-March 11

Posted 14 June 2011 - 09:16 AM

Funziona perfettamente!!! mia culpa!!! nella view sbagliavo il modo di leggere i dati,
foreach( $results as $data ) qui $data è un array e per leggere il contenuto basta fare

<?php echo $data[proprietario]; ?> ecc...
0

#5 User is offline   zaccaria 

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

Posted 14 June 2011 - 09:49 AM

Perche' non usi un model? Puoi fare tutto benissimo con un CDbCritera, e non rischi di sbagliare a scrivere sql.

Inoltre puoi scrivere le funzioni per la visualizzazione dei dati nel model, lasciando il codice molto piu' ordinato.
0

#6 User is offline   webby 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 24-March 11

Posted 14 June 2011 - 09:56 AM

Buona idea, ci vorrei provare, ma con criteria non so come trattare la mega funzione con sin e cos... per il calcolo della vicinanza!!!!

sto cercando di vedere come funziona, tanto ho già il model per la tabella "vetrina" su cui ho realizzato un crud...
0

#7 User is offline   zaccaria 

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

Posted 15 June 2011 - 01:39 AM

E' molto semplice, basta fare:

$criteria= new CDbCriteria;
$criteria->select= "id_vetrina,proprietario,indirizzo,cap,municipio,logo,telefono,sito,descrizione,categoria,sottocategoria,pubblicato,( 3959 * acos( cos( radians('.$model->latitudine.') ) * cos( radians( latitudine ) ) * cos( radians( longitudine ) - radians('.$model->longitudine.') ) + sin( radians('.$model->latitudine.') ) * sin( radians( latitudine ) ) ) ) AS distance";
$criteria->having = ...



Devi anche aggiungere un parametro al model:

public $distance;


Questa cosa la puoi scrivere nella funzione search che trovi nel model, in modo da preparare un CActiveDataProvider con i dati che ti servono.

Cosi' puoi addirittura usare CGridView o CListView, avere il paging e il sorting gia' gestito, insomma, tutto piu' facile.
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