Joomla.it Forum
Non solo Joomla... => Sviluppo => : brando16 12 Mar 2013, 18:56:11
-
Ciao a tutti,
Sto cercando di inserire l'indirizzo ip dei visitatori per un modulo che sto sviluppando, ma non riesco ad inserire alcun record in una tabella creata da me.
Ho cercato ovunque ma tutti gli esempi che ho letto non hanno funzionato.
Riporto il codice che sto utilizzando in una funzione.
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query = "INSERT INTO #__visit_counter (ip) VALUES (".$ip.")";
$db->setQuery($query);
$db->query();
Vi ringrazio anticipatamente per le risposte è urgente grazie mille ancora
-
http://docs.joomla.org/Accessing_the_database_using_JDatabase/2.5#Inserting_a_Record (http://docs.joomla.org/Accessing_the_database_using_JDatabase/2.5#Inserting_a_Record)
Qui trovi tutto quello che ti serve per inserire un record.
Comunque penso che il tuo problema dipende dal fatto che non quoti l'ip cioe l'indirizzo deve avere un apice prima e dopo xche suppongo che tu lo salvi come varchar nel database e non gli piace un value senza apici
-
Inoltre se non fai dei controlli sull'ip rischi di riempire la tabella se hai un numero discreto di visite, cioe per come sembra io se carico 1000 volte una pagina mi inserisce 1000 volte il mio indirizzo ip
-
Ciao Simone83,
certamente infatti prima di fare quell'insert c'è una if che controlla il valore del check ip cioè una funzione che estrae tutti gli ip e controlla se l'ip del visitatore esiste se no mi restituisce 0 altrimenti 1.
Ma ho seguito quella guida e non riesce ad inserire nulla non da errori di nessun tipo e nessuna info che possa aiutarmi!!!
Sto impazzendo....
-
ip che tipo di dato prevede nel mysql?
-
io lo passo come stringa e il campo è un varchar limitato a 15 di lunghezza.
Pensi che sia il tipo di dato sbagliato?
-
posta come li inserisci ora cosi ti so dire, magari potresti allegare un esportazione della tabella
-
comunque potresti essere in ipv6 che non ha 16 caratteri, comunque gli indirzzi ip andrebbero salvati come interi con $ipl=sprintf('%u', ip2long($ip));
-
allora la tabella è fatta da due colonne ID e IP la prima è primary ed è int la seconda è varchar 15.
ti inserisco il codice:
function insert($ip) {
$db = JFactory::getDBO();
$visita = new JObject();
$visita->ip = $ip;
$result = $db->insertObject('#__visit_counter', $visita);
}
La variabile $ip la prendo con la variabile server del php ($ip= $_SERVER['REMOTE_ADDR'];)
aiutami ti pregooo!!!
-
Ci sto provando, comunque
1 prova a mettere varchar 100, un numero a caso
2 sei sicuro che la colonna id abbia auto increment settato?
3 l'ip prendilo con eusta funzione
function getVisitorIP() {
$ip = "0.0.0.0";
if( ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) && ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif( ( isset( $_SERVER['HTTP_CLIENT_IP'])) && (!empty($_SERVER['HTTP_CLIENT_IP'] ) ) ) {
$ip = explode(".",$_SERVER['HTTP_CLIENT_IP']);
$ip = $ip[3].".".$ip[2].".".$ip[1].".".$ip[0];
} elseif((!isset( $_SERVER['HTTP_X_FORWARDED_FOR'])) || (empty($_SERVER['HTTP_X_FORWARDED_FOR']))) {
if ((!isset( $_SERVER['HTTP_CLIENT_IP'])) && (empty($_SERVER['HTTP_CLIENT_IP']))) {
$ip = $_SERVER['REMOTE_ADDR'];
}
}
return $ip;
}
-
La funzione funziona benissimo la sto usando funziona come la stringa del server però fa più controlli mi piace.
Varchar impostato a 150
ID sicuro che ha autoincrement e primary
ma non inserisce nulla.
Ora ho provato al posto della variabile ip ho inserito una stringa ma nulla non inserisce nulla
non riesco a capire sono su joomla 2.5
-
ma id è maiuscolo o minuscolo?
-
tutto minuscolo sia ip che id
ma non è che devo settare qualcosa in joomla! tipo accetta script esterni?
Mi sa venedo in mente che potrebbe essere qualche permesso anche se mi sembra impossibile anche perchè io essendo in locale sto lavorando da root quindi ho tutti i permessi
-
xche script esterni? è un modulo creato secondo gli standard? sei sicuro che c'entri in quella funzione?
-
Script esterni era una mia paranoia, si è il modulo hello world modificato con le funzioni che mi interessano, quindi ho una cartella mod_conta e dentro tutti i file helper mod_conta.php mod_conta.xml index e la cartella tmpl dove dentro c'è il file default.php.
ora in mod_conta.php richiamo la funzione inserendo la classe dell'helper e la funzione per la precisione
modHelloWorldHelper::insert($ip);
ti inserisco tutto il file mod_conta.php cosi puoi seguirmi meglio.
defined( '_JEXEC' ) or die( 'Restricted access' );
require_once( dirname(__FILE__).DS.'helper.php' );
$ip= modHelloWorldHelper::getVisitorIP();
//$hello = modHelloWorldHelper::getHello( $params );
$controllo = modHelloWorldHelper::check($ip);
if($controllo==1) {
$visite = modHelloWorldHelper::counter();
}
else {
$id = modHelloWorldHelper::insert($ip);
$visite = modHelloWorldHelper::counter();
}
require( JModuleHelper::getLayoutPath( 'mod_conta' ) );
?>
[size=78%]vedi se trovi qualcosa che non va, considera che la tabella è vuota e quindi il controllo non è mai 1. la cosa più strana è che la funzione counter() effettua una select count degli id e mi restituisce il valore corretto!!! mentre l'insert non va ma allucinante [/size]
-
pubblica anche l'helper completo vai, perche io 5 minuti fa ho fatto una cosa molto piu complessa che utilizza la stessa funzione e non ho avuto nessun problema
-
<?php
class modHelloWorldHelper
{
function getVisitorIP() {
$ip = "0.0.0.0";
if( ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) && ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif( ( isset( $_SERVER['HTTP_CLIENT_IP'])) && (!empty($_SERVER['HTTP_CLIENT_IP'] ) ) ) {
$ip = explode(".",$_SERVER['HTTP_CLIENT_IP']);
$ip = $ip[3].".".$ip[2].".".$ip[1].".".$ip[0];
} elseif((!isset( $_SERVER['HTTP_X_FORWARDED_FOR'])) || (empty($_SERVER['HTTP_X_FORWARDED_FOR']))) {
if ((!isset( $_SERVER['HTTP_CLIENT_IP'])) && (empty($_SERVER['HTTP_CLIENT_IP']))) {
$ip = $_SERVER['REMOTE_ADDR'];
}
}
return $ip;
}
function check($ip) {
//
$ips = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('ip');
$query->from('#__visit_counter');
$db->setQuery($query);
$rows = $db->loadObjectList();
foreach($rows as $row){
//
$ips[]=$row->ip;
}
$check=array_search($ip,$ips);
if($check >= 0)
{$checkip=1;}
else{ $checkip=0;}
return $checkip;
}
function counter() {
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query= "SELECT count(id) as cont from #__visit_counter";
$db->setQuery($query);
$tot = $db->loadResult();
return $tot;
}
function insert($ip) {
$db = JFactory::getDBO();
$visita = new JObject();
$visita->ip = $ip;
$result = $db->insertObject('#__visit_counter', $visita);
}
}
?>
beato te io sto perdendo i capelli non ci credo ora se riesco ti posto anche la tabella cosi hai il modulo totalmente da te
-
Simone ho trovato l'errore il problema è sul controllo che faccio sull'ip cioè array_search quindi non entrava mai nel ciclo di insert ora lo inserisce perfettamente quindi la funzione di insert è perfetta ma non capisco come controllare questo benetto array di ip con l'ip che ricavo dal visitatore!!!
ora controllo meglio la funzione.
-
Stavo scrivendo qusta risposta
Va beh oggi ho deciso che volevo buttare via un po di tempo e l'ho riprodotto in locale, ma non ti sei reso conto che quella funzione non viene mai richiamata?
Il problema non è li ma in check che non si capisce che avresti voluto fare, ti sei complicato di molto la vita e male direi
se la cambi con
function check($ip) {
//
$ips = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('id');
$query->from('#__visit_counter');
$query->where('ip = '.$db->quote($ip));
$db->setQuery($query);
return $db->loadResult();
}
che ti serve fare un array search dopo un ciclo quando puoi ottere se l'ip è presente con una query semplicissima.
poi cambia l'if
if($controllo) {
$visite = modHelloWorldHelper::counter();
}
else {
$id = modHelloWorldHelper::insert($ip);
$visite = modHelloWorldHelper::counter();
}
-
Hai ragione Simone83 ma considera che è il mio primo modulo che sto sviluppando e non mi ero reso conto che non richiamava la funzione, per la query si giustamente molto più veloce e semplice sei un grande grazie mille.
metto risolto
-
di nulla, ciao
-
Simone oggi ti perseguito giuro che è l'ultima domanda:
ma come faccio ad installare il modulo facendogli creare la tabella ho messo nel file xml install con il path sul sql ma non lo fa!!!
ti metto il file xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="2.5.0" client="site">
<name>Contatore Visite</name>
<author>Andrea Manca</author>
<version>1.0.0</version>
<description>Un semplice contatore visite e utenti online.</description>
<install>
<sql>
<file charset="utf8" driver="mysql">install.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file charset="utf8" driver="mysql">uninstall.sql</file>
</sql>
</uninstall>
<files>
<filename>mod_contatore.xml</filename>
<filename module="mod_contatore">mod_contatore.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
<filename>sql/install.sql</filename>
<filename>sql/unistall.sql</filename>
</files>
<config>
</config>
</extension>
giuro che ti metto come autore anche a te!!! ;) ;D
-
non ne ho idea. non ho mai provato e non so neanche se si puo fare, cerca su google
-
ma anche tutto quel casino per controllare l'ip è inutile così come è inutile vedere se viene da un proxi col forwarded... l'unico è il remote address.
Una volta J aveva funzionalità di filtro... ma in mancanza di queste puoi usare quella di php filter() che ha la possibilitù di validare gli ip.
poi ci sono gli ipv4 e gli ipv6...
piuttosto puoi fare una richiesta inversa per il dns