Webbysite
(Emiliano Gatti)
June 14, 2011, 10:18am
1
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!!!
mdomba
(Maurizio Domba Cerin)
June 14, 2011, 10:30am
2
La prima cosa che ho notato e "24ORDER" e "distanceLIMIT"
le frasi sono incolatte!
Webbysite
(Emiliano Gatti)
June 14, 2011, 1:57pm
3
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?
Webbysite
(Emiliano Gatti)
June 14, 2011, 2:16pm
4
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…
zaccaria
(Matteo Falsitta)
June 14, 2011, 2:49pm
5
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.
Webbysite
(Emiliano Gatti)
June 14, 2011, 2:56pm
6
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…
zaccaria
(Matteo Falsitta)
June 15, 2011, 6:39am
7
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.