Joomla.it Forum
Componenti per Joomla! => Gestione Form => : nofc_nofc 24 Nov 2013, 11:12:36
-
Salve a tutti,
Ho una query di selezione che mi stampa correttamente i risultati. Adesso volevo aggiungere una condizione if: se la query trova un risultato, stampa "x"; se la query non trova risultato, stampa "y". Così ho pensato di ricorrere al "getNumRows()" senza successo :(
<?php
$db =& JFactory::getDBO();
$db->setQuery("
SELECT ... FROM ... WHERE ...");
$list = $db->loadObjectList();
$num_rows = $db->getNumRows();
if($num_rows>0){
// $num_rows lo stampo per prova per vedere che numero esce!
echo "x" . $num_rows;
}
else{
echo "y" . $num_rows;
}
?>
In cosa sbaglio?
Grazie a tutti :)
-
<?php
$db = JFactory::getDBO();
$query = "SELECT COUNT(*) FROM `tabella` WHERE 1";
$db->setQuery($query);
if($db->loadResult()){
// almeno un record presente
}else{
// nessun record presente
}
?>
avete un po' tutti il vizio di usare i vettori quando vanno usati gli scalari... :(
dovrebbe essere corretta ma non la ho testata, ovviamente al posto di 'where 1' ci metti la tua condizione.
tanto per la didattica:
=& non va usato, dato che negli attuali php gli oggetti sono passati sempre per riferimento.
if ($num_rows>0) non è proprio il massimo, in php sarebbe meglio if ($num_rows), dato che il termine in questione o è zero o è maggiore di zero.
ciao,
marco
-
Grazie mille!! Ora torna :)
Mi dispiace fare degli errori un po' banali, ma purtroppo se una persona, che non è del campo, si mette a smanettare ed imparare da solo il PHP procede per errori, tutorial, videocorsi e per persone generose come te e molti altri che hanno la pazienza e la voglia di dedicare il loro tempo per aiutarci ad imparare ;D .
Un'ultima cosa collegata: posto che nel FROM ci sono due tabelle collegate con l'INNER JOIN, io carico gli oggetti con $list = $db->loadObjectList(); e come posso stamparli nella condizione dell'if ?
<?php
$query = "SELECT COUNT(*) FROM tabella1 INNER JOIN tabella2 WHERE condizione";
$db->setQuery($query);
//adesso carico gli oggetti
$list = $db->loadObjectList();
foreach ($list as $item)
foreach ($list as $item2)
{}
if($db->loadResult()){
// almeno un record presente
$testo = " //che parametro devo mettere?"
echo $testo;
?>
Io avevo provato con {$item->name} ma nulla :(
Grazie ancora :)
-
ora non torna a me. devi sapere se c'è un risultato o devi prendere il risultato?
COUNT(*) è la modalità più efficiente per sapere se c'è o non c'è un determinato record, ma non serve a restituire il record.
la JOIN tra tabelle unisce le tabelle in un unico recordset; dal punto di vista del codice a valle delle query non cambia niente se ci sia o non ci sia la join, perché il codice vede comunque solo il recordset restituito e non la struttura del database, pertanto la metodologia di accesso ai fields restituiti è sempre la stessa.
======
my two cents:
è bello che uno abbia voglia di imparare, un po' meno che vada a casaccio tentando codice a caso senza aver prima studiato e senza avere la minima idea di ciò che fa. finché uno lo fa sul suo pc sono solo problemi suoi, quando lo fa su internet e il suo sito viene bucato sono problemi anche di chi riceve spam, trova virus, o si trova l'hosting condiviso down.
vedrete che prima o poi i provider inizieranno a fare azioni di rivalsa contro chi crea danni al sistema per manifesta incompetenza; per il momento si limitano a bloccare i siti, ma il passo temo sia corto.
in altri termini: chiunque ha il diritto di imparare a sciare, ma nessuno ha il diritto di mettersi due sci ed entrare con gli altri in una pista nera se non sa sciare più che bene.
non voglio polemizzare e quindi ho separato questa riflessione dalla risposta tecnica e dal mio ruolo di mod, pertanto prendetela solo come spunto di riflessione e non state a rispondere qui.
ciao,
marco
-
Ciao :)
Risolto, dovevo fare due query: la prima era di SELECT COUNT e se c'era il risultato farne una seconda di SELECT ;D
***
Nel tuo excursus hai perfettamente ragione ;) Il sito che sto facendo è un sito che non richiede grande privacy, motivo per cui posso permettermi certe leggerezze, ma ho intenzione comunque di iscrivermi al corso di Joomla avanzato e sto mettendo da parte i soldi :) (Se divento un po' più bravo provo a darvi una mano nel forum :P )
***
Posto la soluzione:
<?php
$db =& JFactory::getDBO();
$query = "SELECT COUNT(*) FROM tabella1 INNER JOIN tabella2 WHERE condizione1";
$db->setQuery($query);
if($db->loadResult()){
//se c'è risultato allora procedi alla seconda query
$query2 = "SELECT * FROM tabella1 INNER JOIN tabella2 WHERE condizione1";
$db->setQuery($query2);
$list = $db->loadObjectList();
foreach ($list as $item)
foreach ($list as $item2)
{}
// almeno un record presente
$testo = "$item->nome_campo";
echo "$item->nome_squadra" . $testo;
}else{
// nessun record presente
echo "Non hai ancora inserito nessun record!!!";
}
?>
-
a dire il vero funziona solo perché il primo foreach percorre il recodset mentre itera il secondo foreach che non serve a niente... e non è che neanche il primo serva a molto :o
prova così:
<?php
$db = JFactory::getDBO();
$query = "SELECT * FROM tabella1 INNER JOIN tabella2 ON JoinCondition WHERE FilterCondition";
$db->setQuery($query);
if($db->getNumRows()){
// almeno un record presente, prendo il primo
$item = $db->loadObject();
echo "Squadra: {$item->nome_squadra}, Campo: {$item->nome_campo} ";
}else{
// nessun record presente
echo "Non hai ancora inserito nessun record!!!";
}
?>
non usare =&, vedi sopra.
manca la condizione di join o non la hai messa nell'esempio? sicuro di voler fare un cross join? ;D
ps: ti consiglio di imparare prima il PHP e lo SQL, altrimenti il corso di joomla non ti sarà di alcuna utilità.
ciao e buono studio ;)
marco
-
Perfetto modificato =& e tolto il foreach ;)
***
Avevo fatto un videocorso base di PHP, ma quello che usa Joomla è un po' diverso perché richiama molte funzioni che mano a mano sto scoprendo ;)
Grazie di tutto