Back to top

Autore Topic: getNumRows() in una query di tipo SELECT [RISOLTO]  (Letto 4985 volte)

Offline nofc_nofc

  • Appassionato
  • ***
  • Post: 255
    • Mostra profilo
getNumRows() in una query di tipo SELECT [RISOLTO]
« il: 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 :(


Codice: [Seleziona]
<?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 :)
« Ultima modifica: 25 Nov 2013, 14:13:00 da nofc_nofc »

Offline mmleoni

  • Global Moderator
  • Instancabile
  • ********
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT
« Risposta #1 il: 24 Nov 2013, 15:48:02 »
Codice: [Seleziona]
<?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



mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline nofc_nofc

  • Appassionato
  • ***
  • Post: 255
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT
« Risposta #2 il: 24 Nov 2013, 16:32:47 »
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 ?

Codice: [Seleziona]
<?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 :)

Offline mmleoni

  • Global Moderator
  • Instancabile
  • ********
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT
« Risposta #3 il: 25 Nov 2013, 08:56:51 »
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

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline nofc_nofc

  • Appassionato
  • ***
  • Post: 255
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT
« Risposta #4 il: 25 Nov 2013, 11:50:37 »
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:
Codice: [Seleziona]
<?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!!!";
}
?>
« Ultima modifica: 25 Nov 2013, 14:12:44 da nofc_nofc »

Offline mmleoni

  • Global Moderator
  • Instancabile
  • ********
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT [RISOLTO]
« Risposta #5 il: 25 Nov 2013, 15:35:46 »
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ì:

Codice: [Seleziona]
<?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

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline nofc_nofc

  • Appassionato
  • ***
  • Post: 255
    • Mostra profilo
Re:getNumRows() in una query di tipo SELECT [RISOLTO]
« Risposta #6 il: 25 Nov 2013, 15:48:44 »
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

 



Web Design Bolzano Kreatif