Joomla.it Forum
Non solo Joomla... => Sviluppo => : phcaze 11 Dec 2010, 19:55:24
-
Ciao a tutti, sono nuovo, avrei bisogno di aiuto per implementare in Joomla 1.5 un'idea che ho avuto.
Sono un Ingegnere delle Telecomunicazioni quindi tutto quello che so di programmazione si ferma al C e al C++ per ora :)
Praticamente sul mio pc ho un database generato da un software (vari file in formato dbf). Devo mettere a disposizione degli utenti registrati al mio sito alcune informazioni di questo database, ogni utente deve poter vedere solo le sue, e magari in futuro permettere anche agli utenti di modificare i propri parametri. Questo database si aggiorna giornalmente quindi dovrà essere uppato sul server ogni giorno immagino.
Il database funziona così grossomodo:
una tabella riporta i dati del cliente ed associa al nome del cliente un id univoco. Id che viene poi usato in un'altra tabella per indicare cosa questo cliente ha prenotato da me (prodotto con un suo codice univoco), poi c'è un ulteriore tabella che associa il codice prodotto a tutte le sue varianti, ognuna con un codice, ecc. Io vorrei poter far vedere al cliente cosa ha prenotato (sia solo prodotto che solo varianti. Per esempio il Corriere della Sera (prodotto) per tutte le sue uscite, o solo l'uscita del 11/12 (variante)) e se mi è arrivato in negozio e può passare a ritirarlo.
è una cosa che mi piacerebbe imparare a fare, posso metterci tutto il tempo che voglio.
Qualche consiglio per iniziare?
Molte grazie
-
dovresti cercare se esiste una classe che interfaccia php ai database dbf.... in questi modo, una volta caricato il db direttamente sul sito, potresti scegliere di interrogarlo direttamente o fare un batch che mappa dbf a mysql e caricarlo quotidianamente.....
-
Ciao scarinciotto.
Benvenuto nel forum di joomla :D
Partiamo da un presupposto: i dati che i clienti possono vedere devono risiedere sul database di Joomla.
Nel database di Joomla la struttura delle tabelle che conterrano i dati che i clienti potranno consultare deve essere simile a quella del database di origine.
In ogni caso dovrà essere presente una tabella in più che mappi gli utenti/clienti registrati sul sito (tabella jos_users) con quella dei clienti che hai sul database di origine.
Questo perchè gli id dei clienti sul database di origine non sono gli stessi id degli utenti registrati al sito.
Si tratta quindi di tenere allineate le tabelle del database del sito con le tabelle del database di origine e per farlo, in genere, si usa il linguaggio SQL e uno script php creato appositamente ed esterno a joomla (quindi php puro e semplice)
Se hai la possibilità di utilizzare il servizio cron di linux sul web server, puoi temporizzare l'esecuzione dello script in modo da tenere allineati i dati tra i due database.
E questo è solo l'inizio perchè poi bisognerà realizzare un componente per consentire agli utenti/clienti di consultare i dati secondo le modalità che tu desideri.
Io considererei però l'idea di utilizzare i componenti chronoforms e cronoconnectivity in abbinamento. C'è un articolo della community che recensisce questi due componenti.
-
beh in realtà se trovasse la classe per interrogare il bdf, ci sarebbe una strada più corta! Potrebbe interrogare direttamente il db e visualizzarlo attraverso il componente Jumi (http://edo.webmaster.am/jumi).....
-
Grazie a tutti per le risposte e BUON NATALE! :)
Ho cercato un pò e ho trovato DBF reader (http://forum.joomla.org/viewtopic.php?f=40&t=187130&view=previous) per joomla (non funziona perchè manca la php_dbase.dll, devo vedere un pò come risolvere), però è un estensione che compare come menù sulla sinistra del sito, immagino serva per far visualizzare il database agli utenti collegati.
Volendo per iniziare, potrei convertirmi io in locale il database in formato mysql (avete qualche programma da consigliare?)
Grazie
-
Ciao, convertendo il database manualmente e uppandolo sul mio server sto riuscendo a fare quello che voglio.. Piano piano, imparando il php. Il problema viene nella creazione delle tabelle sql..
Alcuni campi del vecchio database dbf contengono nomi con apostrofo e qui viene il problema, sql non me li importa. Per esempio viene tradotto:
INSERT INTO titoli values ( 45, 203, '000000169', 1122807, 0, 36, 74, 0, 'TELEPIU'', '', '4', '');
INSERT INTO titoli values ( 45, 203, '000000169', 1122807, 0, 36, 74, 0, 'QUELL'APE'', '', '4', '');
Quelli apostrofi in più non mi permettono di generare le tabelle sql.
Come posso fare?
Molte grazie
-
basta che ne aggiungi uno:
Sant'Angelo -> Sant''Angelo ....
-
Grazie per la risposta, però come faccio ad aggiungerlo il '? SOno 5000 voci, non posso farlo a mano. Io ho questo file .sql, se gli dico di sostituire ' con '' viene fuori un casino perchè me li sostituisce tutti
Grazie
-
capito....
allora ci sono varie strade, dipende da come generi il file, comunque io te ne scrivo un paio che mi vengono in mente al volo:
- se il file viene generato da codice (PHP per esempio):
$var_ok = str_replace("'",""",$testo_che_contiene_apice);
- se devi sostituire il carattere con un editor, puoi fare così:
1-trova/sostituisci (' con il testo apiceinizio (o come vuoi....)
2-trova/sostituisci ') con il testo apicefine (o come vuoi....)
3-trova/sostituisci ' con doppio apice
4-trova/sostituisci apiceinizio con ('
5-trova/sostituisci apicefine con ')
-
addslashes();
http://php.net/manual/en/function.addslashes.php
magic quote com'è? ... disabilitato?
M.
-
a volta con addslashes ho trovato qualche problemino...... ma magari erano casi particolari adesso non ricordo...
-
prova con mysql_real_escape_string()
Ciao
-
- se devi sostituire il carattere con un editor, puoi fare così:
1-trova/sostituisci (' con il testo apiceinizio (o come vuoi....)
2-trova/sostituisci ') con il testo apicefine (o come vuoi....)
3-trova/sostituisci ' con doppio apice
4-trova/sostituisci apiceinizio con ('
5-trova/sostituisci apicefine con ')
Così funziona , molte grazie. Perdo però le parole accentate, perchè nel database originale sono messe con l'apostrofo tipo CIVILTA'. Però non è un grosso problema potrebbe andare bene lo stesso.
prova con mysql_real_escape_string()
Ciao
Cosa fa questo comando?
Grazie
-
Così funziona , molte grazie. Perdo però le parole accentate, perchè nel database originale sono messe con l'apostrofo tipo CIVILTA'. Però non è un grosso problema potrebbe andare bene lo stesso.
non è vero..... il terzo passaggio ti aggiunge il doppio apostrofo anche in quelle!!!!
All'editor non importa se la città si chiama SANT'ANTONIO o CIVILTA' .... lui con trova e sostituisci se ne trova 1 ne mette 2 se ne trova 2 ne mette 4 e così via.....
-
Cosa fa questo comando?
http://php.net/manual/en/function.mysql-real-escape-string.php (http://php.net/manual/en/function.mysql-real-escape-string.php)
In parole povere formatta la stringa in modo tale che la query sia sicura, quindi se c'e un apostrofo gli aggiunge un escape, questa funzione è fondamentale per evitare l'sql injection ma si presta anche al tuo caso
-
Grazie a tutti per le risposte. Con il metodo di sostituzione ho risolto e adesso ho pronte le tabelle nel database. Ho scritto qualche riga in php in modo da fare i collegamenti con i database per riportare i miei dati e funziona, però vorrei riportarli in una tabellina html, statica per ora, ma proprio non ci riesco :( Mi da errore. Utilizzo Jumi e nella articolo riporto semplicemente il nome del file php a cui connettermi.
-
secondo me è un problema di path...... però sarebbe utile sapere l'errore.... :-\
-
Dunque il codice php è il seguente:
<?php
global $my;
mysql_connect("IP", "nome_utente", "pass") or die(mysql_error());
mysql_select_db("nome_database") or die(mysql_error());
$result = mysql_query("SELECT colonna2, colonna FROM associazione WHERE colonna2='$my->id'")
or die(mysql_error());
$row = mysql_fetch_array( $result );
$result1 = mysql_query("SELECT colonna, colonna1 FROM clienti WHERE colonna='$row[1]'")
or die(mysql_error());
$row1 = mysql_fetch_array( $result1 );
echo "".$row['1'];
echo " ".$row1['1'];
echo " ".$row2['1'];
?>
E questo funziona, mi restituice quello che voglio. Adesso vorrei formattare un pò il modo in cui mi restituisce i risultati.
Vorrei creare una tabella html, e ci sono riuscito con il seguente codice d'esempio:
<table border="1">
<tr>
<td><? include("database.php") ?></td>
<td>seconda cella</td>
</tr>
</table>
Adesso vorrei fare un passo ulteriore. Praticamente cercare in una colonna di una tabella del database un certo valore, e visualizzare tutte le occorrenze che trova, una per riga di una tabella html. Non so se mi sono spiegato :)
Molte Grazie
-
Sono riuscito a risolvere adattando una funzione che ho trovato su un forum :)
function SQLResultTable($Query)
{
$link = mysql_connect(HOST, USER, PASS) or die('Could not connect: ' . mysql_error()); //build MySQL Link
mysql_select_db(DB) or die('Could not select database'); //select database
$Table = ""; //initialize table variable
$Table.= "<table border='1' style=\"border-collapse: collapse;\">"; //Open HTML Table
$Result = mysql_query($Query); //Execute the query
if(mysql_error())
{
$Table.= "<tr><td>MySQL ERROR: " . mysql_error() . "</td></tr>";
}
else
{
//Header Row with Field Names
$NumFields = mysql_num_fields($Result);
$Table.= "<tr style=\"background-color: #000066; color: #FFFFFF;\">";
for ($i=0; $i < $NumFields; $i++)
{
$Table.= "<th>" . mysql_field_name($Result, $i) . "</th>";
}
$Table.= "</tr>";
//Loop thru results
$RowCt = 0; //Row Counter
while($Row = mysql_fetch_assoc($Result))
{
//Alternate colors for rows
if($RowCt++ % 2 == 0) $Style = "background-color: #00CCCC;";
else $Style = "background-color: #0099CC;";
$Table.= "<tr style=\"$Style\">";
//Loop thru each field
foreach($Row as $field => $value)
{
$Table.= "<td>$value</td>";
}
$Table.= "</tr>";
}
$Table.= "<tr style=\"background-color: #000066; color: #FFFFFF;\"><td colspan='$NumFields'>Query Returned " . mysql_num_rows($Result) . " records</td></tr>";
}
$Table.= "</table>";
return $Table;
}
//Call the function like this:
echo SQLResultTable("SELECT * FROM TABLE");
-
si dobrebbe funzionare.... anche se non scrivo mai il codice php in mezzo a quello html.... però vabbé.... tanto joomla è fatto tutto così...
-
Sono sempre io, adesso lo script fa la maggior parte di quello che mi interessa :) Però manca ancora qualcosa e chiedo consiglio. Attualmente viene generata la tabella html i cui campi vengono presi da più tabelle del database in base all'ID dell'utente loggato in joomla.
Adesso, in altre colonne della tabella html (prezzo, numero, data, periodicità), devo sempre mettere dei dati presi da una tabella del database, dove però deve essere posta una condizione. Questo perchè la query non restituisce un solo valore ma più di uno. Per farvi capire, in base al titolo di un libro, mi vengono riportate le varie versioni e nella tabella html devono essere stampati i dati relativi solo all'ultima versione, quella con la data più recente. Qualche idea? Servirà un if ma non so come metterlo giù.
Il codice attualmente in uso è il seguente (è stata omessa la prima parte di connessione ad DB):
$Table.= "</tr>";
//Loop thru results
$RowCt = 0; //Row Counter
while($Row = mysql_fetch_assoc($Result))
{
//Alternate colors for rows
if($RowCt++ % 2 == 0) $Style = "background-color: #FFFFFF;";
else $Style = "background-color: #C0C0C0;";
$Table.= "<tr style=\"$Style\">";
//Loop thru each field
// foreach($Row as $field => $value)
// {
// $Table.= "<td>$value</td>";
// }
//Loop thru each field
foreach($Row as $field => $value)
{
//$Table.= "<td>$value</td>";
$testata = mysql_query("SELECT titolo, sottotitolo FROM titoli WHERE id_titolo='$value'"); //Execute the query
$Row1 = mysql_fetch_assoc( $testata );
$dati = mysql_query("SELECT nome FROM clienti WHERE id_prova='$Row3[id_prova]'"); //Execute the query
$Row2 = mysql_fetch_assoc( $dati );
$Table.= "<td>".$Row1['titolo']."</td>";
$Table.= "<td>".$Row1['sottotitolo']."</td>";
$titoli = mysql_query("SELECT prezzo, numero_uscita, data_numero, periodicita FROM numeri WHERE id_titoli='$value'"); //Execute the query
$Rowtitoli = mysql_fetch_assoc( $titoli );
$Table.= "<td>".$Rowtitoli['prezzo']."</td>";
$Table.= "<td>".$Rowtitoli['numero_uscita']."</td>";
$Table.= "<td>".$Rowtitoli['data_numero']."</td>";
$Table.= "<td>".$Rowtitoli['periodicita']."</td>";
}
$Table.= "</tr>";
}
// $Table.= "<tr style=\"background-color: #FFFFFF; color: #000000;\"><td colspan='$NumFields'>Query Returned " . mysql_num_rows($Result) . " records</td></tr>";
}
$Table.= "</table>";
return $Table;
}
//Call the function like this:
echo SQLResultTable("SELECT * FROM TABLE");
?>
Non sarà molto elegante ma funziona e per uno alle prime armi come me va bene così :)