Joomla.it Forum
Non solo Joomla... => Sviluppo => : Giode 17 Mar 2010, 13:30:22
-
Ciao a tutti ragazzi!
Mi sono iscritto oggi per chiedere se qualcuno ha la soluzione a questo mio problema..
Allora sto creando un nuovo componente per l'aggiunta di alcuni prodotti. Ecco il codice della funzione che uso:
<?php
defined('_JEXEC') or die('Restricted access');
//echo '<div class="componentheading">Registrazione Prodotti</div>';
jimport('joomla.application.helper');
require_once(JApplicationHelper::getPath('html'));
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables');
switch($task) {
default:
showProdotti($option);
break;
}
function showProdotti($option) {
$user =& JFactory::getUser();
$userid = $user->get('id');
$db =& JFactory::getDBO();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' ");
$try = $db->query();
if ($db->getNumRows($try) == 0)
{
$db->setQuery("INSERT INTO `#__user_products` SET `id`=NULL, `userid`='$userid', `nome1`=NULL, `codice1`=NULL, `data1`=NULL, `nome2`=NULL, `codice2`=NULL, `data2`=NULL, `nome3`=NULL, `codice3`=NULL, `data3`=NULL, `nome4`=NULL, `codice4`=NULL, `data4`=NULL, `nome5`=NULL, `codice5`=NULL, `data5`=NULL");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$db->query();
}
else
{
$db->setQuery("UPDATE `#__user_products` SET `userid`='$userid', `nome1`='$_POST[nome1]', `codice1`=NULL, `data1`=NULL, `nome2`=NULL, `codice2`=NULL, `data2`=NULL, `nome3`=NULL, `codice3`=NULL, `data3`=NULL, `nome4`=NULL, `codice4`=NULL, `data4`=NULL, `nome5`=NULL, `codice5`=NULL, `data5`=NULL WHERE `userid`='$userid' LIMIT 1");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$db->query();
}
$rows = $db->loadObjectList();
HTML_prodotti::showProdotti($rows, $option);
}
?>
Questo è invece il codice della pagina prodotti.html.php dove sta il form per l'inserimento:
<?php
//no direct access
defined('_JEXEC') or die('Restricted access');
class HTML_prodotti {
function showProdotti($rows, $option) {
?>
<img src="images/stories/banner_regprodotti.gif" /><br/>
<form method="post" action="<?php echo JRoute::_('index.php?option=com_prodotti&task=showProdotti') ?>" name="formProdotti" id="formProdotti">
<?php foreach ($rows as $row) { ?>
<p><b><u>PRODOTTO 1</u></b></p>
<table cellpadding="0" cellspacing="0">
<tr>
<td><?php echo 'Nome Prodotto' ; ?></td>
<td width="40"></td>
<td><?php echo 'Codice Seriale' ; ?></td>
<td width="40"></td>
<td><?php echo 'Data di Acquisto' ; ?></td>
</tr>
<tr>
<td><input type="text" name="nome1" id="nome1" value="<?php echo $row->nome1; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="codice1" id="codice1" value="<?php echo $row->codice1; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="data1" id="data1" value="<?php echo $row->data1; ?>" class="DatePicker" tabindex="1" /></td>
</tr>
</table><br/>
<p><b><u>PRODOTTO 2</u></b></p>
<table cellpadding="0" cellspacing="0">
<tr>
<td><?php echo 'Nome Prodotto' ; ?></td>
<td width="40"></td>
<td><?php echo 'Codice Seriale' ; ?></td>
<td width="40"></td>
<td><?php echo 'Data di Acquisto' ; ?></td>
</tr>
<tr>
<td><input type="text" name="nome2" id="nome2" value="<?php echo $row->nome2; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="codice2" id="codice2" value="<?php echo $row->codice2; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="data2" id="data2" value="<?php echo $row->data2; ?>" class="DatePicker" tabindex="1" /></td>
</tr>
</table><br/>
<p><b><u>PRODOTTO 3</u></b></p>
<table cellpadding="0" cellspacing="0">
<tr>
<td><?php echo 'Nome Prodotto' ; ?></td>
<td width="40"></td>
<td><?php echo 'Codice Seriale' ; ?></td>
<td width="40"></td>
<td><?php echo 'Data di Acquisto' ; ?></td>
</tr>
<tr>
<td><input type="text" name="nome3" id="nome3" value="<?php echo $row->nome3; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="codice3" id="codice3" value="<?php echo $row->codice3; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="data3" id="data3" value="<?php echo $row->data3; ?>" class="DatePicker" tabindex="1" /></td>
</tr>
</table><br/>
<p><b><u>PRODOTTO 4</u></b></p>
<table cellpadding="0" cellspacing="0">
<tr>
<td><?php echo 'Nome Prodotto' ; ?></td>
<td width="40"></td>
<td><?php echo 'Codice Seriale' ; ?></td>
<td width="40"></td>
<td><?php echo 'Data di Acquisto' ; ?></td>
</tr>
<tr>
<td><input type="text" name="nome4" id="nome4" value="<?php echo $row->nome4; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="codice4" id="codice4" value="<?php echo $row->codice4; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="data4" id="data4" value="<?php echo $row->data4; ?>" class="DatePicker" tabindex="1" /></td>
</tr>
</table><br/>
<p><b><u>PRODOTTO 5</u></b></p>
<table cellpadding="0" cellspacing="0">
<tr>
<td><?php echo 'Nome Prodotto' ; ?></td>
<td width="40"></td>
<td><?php echo 'Codice Seriale' ; ?></td>
<td width="40"></td>
<td><?php echo 'Data di Acquisto' ; ?></td>
</tr>
<tr>
<td><input type="text" name="nome5" id="nome5" value="<?php echo $row->nome5; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="codice5" id="codice5" value="<?php echo $row->codice5; ?>" /></td>
<td width="40"></td>
<td><input type="text" name="data5" id="data5" value="<?php echo $row->data5; ?>" class="DatePicker" tabindex="1" /></td>
</tr>
</table><br/> <?php } ?>
<p><?php echo '<button type="submit" >'.INVIA.'</button>' ?></p>
</form>
<?php
}
}
?>
Funziona tutto però quando riaggiorno la pagina il campo nome1 si svuota cioè ritorna vuoto sia nell'input del form sia nel database..
Qualcuno può aiutarmi?
Grazie in anticipo!
-
il campo nome1 si svuota
-------------------------
solo quello?
M.
-
si perchè sto provando solo con quel campo infatti se vedi nelle query ho messo solo a nome1 la variabile $_POST.. gli altri infatti sono NULL e rimangono NULL
-
ciao,
da una occhiata veloce il flusso, ad ogni caricamento della pagina, è:
leggi il db
è vuoto?
sì:
inserisci un record
leggi il primo record
no:
aggiorna il record
leggi il primo record
visualizza il record
il problema è che l'aggiornamento viene fatto indipendentemente dal fatto che ci sia un submit o meno!!
btw:
1. per fare cinque gruppi uguali si usa un for
2. i vettori si esprimono in colonne e non in righe (fondamentale regola di normalizzazione)
ciao,
marco
-
Ciao Marco ti ringrazio per la tua risposta!
Potresti farmi degli esempi a livello di codice di come potrei risolvere gentilmente?
Grazie ancora
-
basta che verifichi se in $_POST è presente uno dei campi...
btw: sai che con quel codice ti bucano il sito in tre secondi? NON SI PRENDE IL CONTENUTO DI POST E LO SI METTE IN UNA QUERY COSÌ COME È!! >:( >:(
mi spiace ma è tutto sbagliato, sia la logica che l'implementazione :(
ti consiglio di ripartire dal wiki di joomla: studia gli articoli sulla costruzione di un componente e su come creare ed inizializzare le tabelle del db in fase di installazione.
ciao,
marco
-
Ho risolto in questo modo!
<?php
defined('_JEXEC') or die('Restricted access');
//echo '<div class="componentheading">Registrazione Prodotti</div>';
jimport('joomla.application.helper');
require_once(JApplicationHelper::getPath('html'));
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables');
switch($task) {
default:
showProdotti($option);
break;
}
function showProdotti($option) {
$user =& JFactory::getUser();
if($user->id == 0) {
echo "Occorre effettuare il login per visualizzare questa pagina";
}
else {
$user =& JFactory::getUser();
$userid = $user->get('id');
$db =& JFactory::getDBO();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' ");
$query = $db->query();
if ($db->getNumRows($query) == 0)
{
//echo 'entro nell\'if senza un valore nel db';
$db->setQuery("INSERT INTO `#__user_products` SET `id`=NULL, `userid`='$userid', `nome1`=NULL, `codice1`=NULL, `data1`=NULL, `nome2`=NULL, `codice2`=NULL, `data2`=NULL, `nome3`=NULL, `codice3`=NULL, `data3`=NULL, `nome4`=NULL, `codice4`=NULL, `data4`=NULL, `nome5`=NULL, `codice5`=NULL, `data5`=NULL");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$try1 = $db->query();
$rows = $db->loadObjectList();
HTML_prodotti::showProdotti($rows, $option);
}
if ($db->getNumRows($query) != 0)
{
//echo 'entro nell\'if con un valore nel db - ';
if(isset($_POST['submit'])) {
//echo 'entro nell\'if con submit settato';
$db->setQuery("UPDATE `#__user_products` SET `userid`='$userid', `nome1`='$_POST[nome1]', `codice1`='$_POST[codice1]', `data1`='$_POST[data1]', `nome2`='$_POST[nome2]', `codice2`='$_POST[codice2]', `data2`='$_POST[data2]', `nome3`='$_POST[nome3]', `codice3`='$_POST[codice3]', `data3`='$_POST[data3]', `nome4`='$_POST[nome4]', `codice4`='$_POST[codice4]', `data4`='$_POST[data4]', `nome5`='$_POST[nome5]', `codice5`='$_POST[codice5]', `data5`='$_POST[data5]' WHERE `userid`='$userid' ");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$try2 = $db->query();
$rows = $db->loadObjectList($try2);
HTML_prodotti::showProdotti($rows, $option);
}
}
if(!isset($_POST['submit'])) {
//echo 'entro nell\'if con submit non settato';
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' ");
$query = $db->query();
$rows = $db->loadObjectList($query);
HTML_prodotti::showProdotti($rows, $option);
}
} }
?>
Qualsiasi consiglio per migliorarlo è ben accetto
grazie a tutti!
-
Ciao Giode, ma tu leggi i post degli altri o solo i tuoi?
Giusto sopra il tuo ultimo post ti è stato spiegato che quel codice che hai scritto ha gravi problemi di sicurezza. E tu avanti tutta senza curarti dell'avviso? ;D
-
ho editato il codice affinchè si piu sicuro gia da prima io intendevo la struttura della funzione.. comunque ecco il codice adesso:
<?php
defined('_JEXEC') or die('Restricted access');
//echo '<div class="componentheading">Registrazione Prodotti</div>';
jimport('joomla.application.helper');
require_once(JApplicationHelper::getPath('html'));
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables');
switch($task) {
default:
showProdotti($option);
break;
}
function showProdotti($option) {
$user =& JFactory::getUser();
if($user->id == 0) {
echo "Occorre effettuare il login per visualizzare questa pagina";
echo '<img src="images/ritenta.gif" />';
}
else {
$user =& JFactory::getUser();
$userid = $user->get('id');
$fullname = $user->get('name');
$db =& JFactory::getDBO();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' ");
$query = $db->query();
if ($db->getNumRows($query) == 0)
{
//echo 'entro nell\'if senza un valore nel db';
$db->setQuery("INSERT INTO `#__user_products` SET `id`=NULL, `userid`='$userid', `fullname`=NULL, `nome1`=NULL, `codice1`=NULL, `data1`=NULL, `nome2`=NULL, `codice2`=NULL, `data2`=NULL, `nome3`=NULL, `codice3`=NULL, `data3`=NULL, `nome4`=NULL, `codice4`=NULL, `data4`=NULL, `nome5`=NULL, `codice5`=NULL, `data5`=NULL");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$try1 = $db->query();
}
if ($db->getNumRows($query) != 0)
{
//echo 'entro nell\'if con un valore nel db - ';
if(isset($_POST['submit'])) {
//echo 'entro nell\'if con submit settato';
$db->setQuery("UPDATE `#__user_products` SET `userid`='$userid', `fullname`='$fullname', `nome1`='".mysql_real_escape_string($_POST['nome1'])."', `codice1`='".mysql_real_escape_string($_POST['codice1'])."', `data1`='".mysql_real_escape_string($_POST['data1'])."', `nome2`='".mysql_real_escape_string($_POST['nome2'])."', `codice2`='".mysql_real_escape_string($_POST['codice2'])."', `data2`='".mysql_real_escape_string($_POST['data2'])."', `nome3`='".mysql_real_escape_string($_POST['nome3'])."', `codice3`='".mysql_real_escape_string($_POST['codice3'])."', `data3`='".mysql_real_escape_string($_POST['data3'])."', `nome4`='".mysql_real_escape_string($_POST['nome4'])."', `codice4`='".mysql_real_escape_string($_POST['codice4'])."', `data4`='".mysql_real_escape_string($_POST['data4'])."', `nome5`='".mysql_real_escape_string($_POST['nome5'])."', `codice5`='".mysql_real_escape_string($_POST['codice5'])."', `data5`='".mysql_real_escape_string($_POST['data5'])."' WHERE `userid`='$userid' ");
$db->query();
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' LIMIT 1 ");
$try2 = $db->query();
$rows = $db->loadObjectList($try2);
HTML_prodotti::showProdotti($rows, $option);
}
}
if(!isset($_POST['submit'])) {
//echo 'entro nell\'if con submit non settato';
$db->setQuery("SELECT * FROM `#__user_products` WHERE `userid`='$userid' ");
$query = $db->query();
$rows = $db->loadObjectList($query);
HTML_prodotti::showProdotti($rows, $option);
}
} }
?>
-
senti Giode,
ti spiacerebbe proprio evitare di continuare a postare tutto questo codice?
dubito che possa servire a qualcuno, al più serve solo come esempio di che cosa non deve essere MAI fatto. È sbagliata la logica, è sbagliata la progettazione, è sbagliata l'implementazione nel framework, è sbagliato il disegno del db: solo per citare gli aspetti più rilevanti.
dico, ma lo hai visto o no che hai la stessa query ripetuta QUATTRO volte? non ti viene il dubbio che ci sia un problema di disegno?
ciao,
marco
-
piu che altro mi viene da chiedere: perchè mi dite che è sbagliata ma non mi fate capire dove e perchè? grazie
-
perchè bisognerebbe avere la capacità di spiegare, con i limiti di un forum, il concetto di classe e di mvc... e non la vedo semplice.
M.
-
Ti ringrazio mau per la risposta! Senza entrare nel codice potreste dirmi in modo teorico dove ho sbagliato e perchè? In questo modo mi informerò e non ripeterò gli errori..
Grazie
-
dovresti prendere un componente già esistente (semplice) e tentare di modificarlo inserendo il tuo codice.
Credo esiste (forse nel sito di Flavio,nn ricordo) proprio un tutorial di un form.
Tutto questo ti obbligherebbe a seguire scelte che probabilmente ti sembreranno poco logiche (capita con i framework) ma necessarie per rispettare l'mvc, che è un compromesso tra logica e funzionalità.
Ti accorgi che quell'helper contiene un po' troppe cose, che ripetere 4 volte una query alla stessa tabella potrebbe giustificare la costruzione di un metodo apposito, che istanziare in un helper quell'html non è proprio corretto... etc.
M.
-
senti Giode,
ti spiacerebbe proprio evitare di continuare a postare tutto questo codice?
mi accodo, esiste il pastebin per queste cose :) è un servizio molto utile, e migliora la leggibilità del tuo codice per noialtri
-
Va bene mau!
Ti ringrazio per la dritta mi informerò di più e cercherò di implementare del codice in qualche componente esistente per inpratichirmi...
mi accodo, esiste il pastebin per queste cose :) è un servizio molto utile, e migliora la leggibilità del tuo codice per noialtri
Hai ragione la prossima voltà userò pastebin ;)