Url öffnen nach dem Zählen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Maffy
Mitglied
Beiträge: 158
Registriert: 16.07.2002 17:14
Wohnort: Steinach
Kontaktdaten:

Url öffnen nach dem Zählen

Beitrag von Maffy »

Ich erstelle z.Z. eine kleine Linkliste. Beim klick auf einen Link, soll er mir den klick zählen, die Website in einem neuen Fenster öffnen und die Linkliste aktualiesieren.

Das Problem ist: er zählt den Klick öffnet aber die Homepage nicht.
Hier kommt eine Fehlermeldung mit header already send ...

Code: Alles auswählen

<?php 

#######################################
# EZ - WebLink Click Counter          #
#######################################

// --> Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');


$linkid = $_GET['link_id']; 

// --> Link Daten holen
$linksql = 'SELECT * FROM ' . ezlink_LINK_TABLE . ' WHERE link_id = $linkid ';
$link_ds = $db->sql_fetchrow($linksql);

$url = 'http:// '.$link_ds['link_url'].' ';

// --> Update den link clicks counter

$sql = 'UPDATE ' . ezlink_LINK_TABLE . ' SET link_clicks = link_clicks + 1 WHERE link_id = '.$linkid.' ';
if ( !$db->sql_query($sql) )
{
	message_die(GENERAL_ERROR, "Could not update link hits.", '', __LINE__, __FILE__, $sql);
}

header('Location: ' . $url);
exit();

?> 
Leben und Leben lassen.
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag von larsneo »

du solltest zuerst einmal die mögliche sql-injection fixen :roll:
schon einmal überlegt, was passiert wenn $linkid beispielsweise einen UNION select auf die usertabelle beinhaltet (oder den update auf die berechtigung ummünzt...)?
als nächstes die wildcard selektion rausnehmen um performance zu sparen, dann die zusammengebaute url einmal mit einem echo ausgeben...
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
sonic-ac
Mitglied
Beiträge: 14
Registriert: 18.02.2005 18:02
Wohnort: Aachen

Beitrag von sonic-ac »

Hi,

das mit der sql-injection solltest du wirklich als erstes fixen :o

unabhängig davon scheint das script da oben ja nur die halbe miete zu sein !
du greifst auf phpbb-funktionen und deklarationen zu, die garnicht included werden, bekommst aber keinen fehler in dieser richtung.
daraus schliesse ich mal : das script wird garnicht direkt aufgerufen, sondern ist in einem anderen included !
vermutlich wird dann in dem aufrufendem script schon der header gesendet :roll:
Bye
C.
hab natürlich auch ein kleines Forum
Maffy
Mitglied
Beiträge: 158
Registriert: 16.07.2002 17:14
Wohnort: Steinach
Kontaktdaten:

Beitrag von Maffy »

Das Zählen funktioniert ja soweit nur das öffnen der Homepage nicht.

Hier ist mal der Code der link seite

Code: Alles auswählen

<?PHP

#######################################
# EZ - WebLink				          #
#######################################

// --> Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

// --> Benötigte Dateien und Variablen von EZ - WebLink
include($phpbb_root_path . 'link/constants.'.$phpEx);
include($phpbb_root_path . 'link/functions.' . $phpEx );
   
// --> Welcome Text
$CFG['welcome_text'] = '<b> +++ Weblink Database +++ </b>';

$CFG['text'] = '
<div class="gen" align="center">Dieser Bereich ist noch in Arbeit</div>
';

$CFG['titel_adlink'] = '<b> +++  Link hinzufügen +++ </b>';

// --> Session auslesen und Benutzer-Informationen laden
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);

// --> Selectfeld sort by days
$previous_days = array(0, 1, 7, 14, 30, 90, 180, 364);
$previous_days_text = array($lang['All_Links'], $lang['1_Day'], $lang['7_Days'], $lang['2_Weeks'], $lang['1_Month'], $lang['3_Months'], $lang['6_Months'], $lang['1_Year']);

$select_link_days = '<select name="linkdays">';
for($i = 0; $i < count($previous_days); $i++)
{
	$selected = ($link_days == $previous_days[$i]) ? ' selected="selected"' : '';
	$select_link_days .= '<option value="' . $previous_days[$i] . '"' . $selected . '>' . $previous_days_text[$i] . '</option>';
}
$select_link_days .= '</select>';

// --> Link Template laden
$page_title = $lang['Links'];
include($phpbb_root_path . 'includes/page_header.'.$phpEx);

include($phpbb_root_path . 'link/link_header.'.$phpEx);

$template->set_filenames(array(
	'body' => 'links.tpl'));
	
$template->assign_vars(array(
		
	// --> Titel, Text
	'WELCOME_TEXT' => $CFG['welcome_text'] ,
	'TEXT' => $CFG['text'],
	'PAGETITEL'=> $CFG['pagetitel'],
	
	// --> Previous Days
	'S_SELECT_TOPIC_DAYS' => $select_link_days,
	
	// Navigation in der Seite
	'L_LINK_INDEX' => $lang['Link_title'],
	'U_LINK_INDEX' => append_sid('links.'.$phpEx),
	
	'L_LINK_ADD' => $lang['Link_add'],
	'U_LINK_ADD' => append_sid( this_link_url( "mode=add" ) ),	
	
	'L_MOST_POPULAR' => $lang['Link_most_popular'],
	'U_MOST_POPULAR' => append_sid( this_link_url( "mode=stats&stats=popular" ) ),
	
	'L_TOPLINK' => $lang['Link_toplink'],
	'U_LINK_INDEX' => append_sid( this_link_url( "mode=stats&stats=toplink" ) ),
	
	'L_LATEST' => $lang['Link_latest'],
	'U_LATEST' => append_sid( this_link_url( "mode=stats&stats=latest" ) ) 
	
));


// --> Link daten holen
	$linksql = 'SELECT * FROM ' . ezlink_LINK_TABLE . ' ORDER BY link_id ASC';
	
	if(!$getlink = $db->sql_query($linksql)) {
	message_die(GENERAL_ERROR, 'fehler beim auslesen der link - informationen', '', __LINE__, __FILE__, $cat_sql);
	}
				
	// --> Link ausgeben		
	while($link_row = $db->sql_fetchrow($getlink)) {
		
	// MYSQL DB link_id, link_description, link_date, link_url, link_titel, link_clicks, link_rating, link_totalvotes
	
	$link_id = $link_row['link_id'];
								
	$template->assign_block_vars('link', array(
	'ID' => $link_row['link_id'],
	'DESC' => $link_row['link_description'],
	'CREATE' => $link_row['link_date'],
	'U_VIEWLINK' => append_sid( this_link_url( "mode=click&link_id=$link_id" ) ),
	'HITS' => $link_row['link_clicks'],
	'URL' => $link_row['link_url'],
	'TITEL' => $link_row['link_titel']	
	));
	
	//
	// No topics
	//
	$no_links_msg = "Keine Links gefunden";
	$template->assign_vars(array(
		'L_NO_LINKS' => $no_links_msg)
	);

	$template->assign_block_vars('switch_no_topics', array() );
		
	
	}

// --> Seiten entsprechend dem Mode laden
if (isset($_REQUEST["mode"])) {
	$mode = $_REQUEST["mode"];
	}



if (isset($_REQUEST["mode"])) {
	switch ($_REQUEST["mode"]) {

	case "add":				include( $link_root_path . 'link/link_add.' . $phpEx );
	case "edit":			include( $link_root_path . 'link/link_edit.' . $phpEx );
	case "drop": 			include( $link_root_path . 'link/link_drop.' . $phpEx );		
	case "click": 			include( $link_root_path . 'link/link_click.' . $phpEx );
	
	}
}
	
$template->pparse('body');

include($phpbb_root_path . 'link/link_footer.'.$phpEx);
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);


?>

Leben und Leben lassen.
Benutzeravatar
sonic-ac
Mitglied
Beiträge: 14
Registriert: 18.02.2005 18:02
Wohnort: Aachen

Beitrag von sonic-ac »

Hi,

naja, jetzt fehlt eigentlich nur noch, wie die includete datei heisst, die ganz oben als code steht ;-)

ich tippe mal, es ist "link_click" die in

Code: Alles auswählen

if (isset($_REQUEST["mode"])) {
   switch ($_REQUEST["mode"]) {

   case "add":            include( $link_root_path . 'link/link_add.' . $phpEx );
   case "edit":         include( $link_root_path . 'link/link_edit.' . $phpEx );
   case "drop":          include( $link_root_path . 'link/link_drop.' . $phpEx );      
   case "click":          include( $link_root_path . 'link/link_click.' . $phpEx );
   
   }
} 
aufgerufen wird.
VIEEEL weiter oben wird aber schon

Code: Alles auswählen

include($phpbb_root_path . 'includes/page_header.'.$phpEx);
der kopfbereich einer phpbb-seite erzeugt => header schon gesendet => fehlermeldung.
Nehm den entsprechenden case-zweig mal raus und mach eine gesonderte if-abfrage am besten vor "/ --> Selectfeld sort by days" für den mode.
die weiterleitung endet ja mit einem exit, sollte also dann da oben rechtzeitig das script beenden ;-)
Bye
C.
hab natürlich auch ein kleines Forum
Maffy
Mitglied
Beiträge: 158
Registriert: 16.07.2002 17:14
Wohnort: Steinach
Kontaktdaten:

Beitrag von Maffy »

Ja, es ist link/link_click.
Hier wird der Link gezählt und erfolgt die Weiterleitung.

Auf meiner Privaten Homepage hatte ich das, den Switch Bereich, so im link sript gemacht und das hat auch funktioniert.

Deshalb habe ich das auch so in die phpBB Anpassung übernommen.

Ist es nicht sinvoller das ganze in einem Script zumachen, anstatt für jeden Befehl eine extra Seite zu öffnen.
Leben und Leben lassen.
Maffy
Mitglied
Beiträge: 158
Registriert: 16.07.2002 17:14
Wohnort: Steinach
Kontaktdaten:

Beitrag von Maffy »

Die Alten Datensätze, die ich bei der DB Installation mit angelegt habe lassen sich öfnen.

Neu Datensätze die ich über das Formular angelegt habe jedoch nicht.

Die Daten werden aber richtig in der DB gespeichert.

Link code:

Code: Alles auswählen


<?PHP

#######################################
# EZ - WebLink				          #
#######################################

// --> Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

// --> Benötigte Dateien und Variablen von EZ - WebLink
include($phpbb_root_path . 'link/constants.'.$phpEx);
include($phpbb_root_path . 'link/functions.' . $phpEx );

// --> Check Mode
if (isset($_REQUEST["mode"])) {
$mode = $_REQUEST["mode"];
}

// --> Check Aktion
if (isset($_REQUEST["aktion"])) {
$aktion = $_REQUEST["aktion"];
}

// --> Check Link ID
if (isset($_REQUEST["linkid"])) {
$linkid = $_REQUEST["linkid"];
}

// --> Check MSG
if (isset($_REQUEST["msg"])) {
$msg = $_REQUEST["msg"];
}

// Link öffnen und update machen
if($mode == "click"){
		
	// counter update durchfüren	
	update_hits($linkid);

	// get link
	get_link($linkid);
}


// --> Neuen Link hinzufügen
if($mode == "drop"){

	// Link löschen
	delete_link($linkid);

}
	 
// --> Session auslesen und Benutzer-Informationen laden
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);

// --> Templates laden
$page_title = $lang['Links'];
include($phpbb_root_path . 'includes/page_header.'.$phpEx);
include($phpbb_root_path . 'link/link_header.' . $phpEx );

$template->set_filenames(array('body' => 'links.tpl'));
		
$template->assign_vars(array(
		
	// --> Titel, Text
	'WELCOME_TEXT' => $CFG['welcome_text'] ,
	'PAGETITEL'=> $CFG['pagetitel'],
	
	// --> Previous Days
	'S_SELECT_TOPIC_DAYS' => $select_link_days,
	
	// Navigation in der Seite
	'L_LINK_INDEX' => $lang['Link_title'],
	'U_LINK_INDEX' => append_sid('links.'.$phpEx),
	
	'L_LINK_ADD' => $lang['Link_add'],
	'U_LINK_ADD' => append_sid( "links.php?mode=addnew" )
	
));

// --> Linkformular öffnen
if($mode == "addnew"){

	// --> Page Titel
	$pagetitle = $lang['Link_pagetitle_add'];
	
	// Linkformular ausgeben		
	$template->set_filenames(array('linkadd' => 'links_add.tpl'));
	$template->assign_vars(array('TITEL'=> $pagetitle));
	$template->pparse('linkadd');
	
}

// --> Neuen Link hinzufügen
if($aktion == "savenew"){

	// Variablen umschreiben
	$linktitel 			= $_REQUEST['linktitel'];
	$linkdesc			= $_REQUEST['beschreibung'];
	$linkurl			= $_REQUEST['link'];
	$linkposter 		= $_REQUEST['linkposter'];
	$linkposteremail 	= $_REQUEST['linkposteremail'];
	
	$zeit 				= time();
	
	// --> frm_Daten prüfen
	if( empty( $linkdesc ) || empty( $linkurl ) || empty( $linkposter ) || empty( $linkposteremail ) ){
	$msg 	= 'Die Daten sind nicht Vollständig. Bitte füllen Sie umbedingt alle Felder aus.';
	$template->set_filenames(array('linkerror' => 'links_error.tpl'));	
	$template->assign_vars(array('ERROR' => $msg ));
	$template->pparse('linkerror');
	exit;
	}
	
	// --> Link in die DB hinzufügen wenn Daten in Ordnung sind
	// MYSQL DB link_id, link_description, link_date, link_url, link_titel, link_clicks
	
	$sql = 'INSERT INTO '. ezlink_LINK_TABLE .' 
			VALUES (" ", " ' .$linkdesc. ' ", " ' .$zeit. ' " , " ' .$linkurl. ' " , " ' .$linktitel. ' ", 0);';

	if(! $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'fehler beim anlegen des links - informationen', '', __LINE__, __FILE__, $cat_sql);
	}
	
	// --> Link Template laden
	$pagetitle = $lang['Link_pagetitle_addsave'];
	
	// Template laden		
	$template->set_filenames(array('linkaddsave' => 'links_addsave.tpl'));
			
	$template->assign_vars(array(
	
	// frm ausgabe
	'LINKTITEL' => $linktitel,
	'LINKDESC' => $linkdesc,
	'LINKURL' => $linkurl,
	'LINKPOSTER' => $linkposter,
	'LINKPOSTEREMAIL' => $linkposteremail,
	
	// Navigation in der Seite
	'L_LINK_INDEX' => $lang['Link_title'],
	'U_LINK_INDEX' => append_sid('links.'.$phpEx),	
	));
	
	$template->pparse('linkaddsave');
	exit;

}

// --> Linkliste anzeigen wenn kein mode gewählt wurde
if($mode == ""){

// --> Link daten holen
	$linksql = 'SELECT * FROM ' . ezlink_LINK_TABLE . ' ORDER BY link_id ASC';
	
	if(!$getlink = $db->sql_query($linksql)) {
	message_die(GENERAL_ERROR, 'fehler beim auslesen der link - informationen', '', __LINE__, __FILE__, $cat_sql);
	}
				
	// --> Link ausgeben		
	while($link_row = $db->sql_fetchrow($getlink)) {
		
	// MYSQL DB link_id, link_description, link_date, link_url, link_titel, link_clicks, link_rating, link_totalvotes
	
	$linkid 	= $link_row['link_id'];
	$linkdesc 	= $link_row['link_description'];
	
	$link		= append_sid('links.php?mode=click&linkid='.$linkid.'');
	
	// Navigation anzeigen wenn der ADMIN oder ein MOD Online ist
	if($userdata['user_level'] == ADMIN || $userdata['user_level'] == MOD ){
	
	$linkid = $link_row['link_id'];	
	
	$drop 		= append_sid('links.php?mode=drop&linkid='.$linkid.'');
	$navdrop 	= '<a href=' . $drop . ' class="gensmall"> Delete</a>';

	} else {

	$navdrop = "&nbsp;";

	}
	
	$date = create_date( $board_config['default_dateformat'], $link_row['link_date'], $board_config['board_timezone'] ); 
								
	$template->assign_block_vars('link', array(
	'ID' => $link_row['link_id'],
	'DESC' => $link_row['link_description'],
	'LINKDATE' => $date,
	'U_VIEWLINK' => $link,
	'HITS' => $link_row['link_clicks'],
	'URL' => $link_row['link_url'],
	'TITEL' => $link_row['link_titel'],
	'DROP' => $navdrop	
	));
			
	}
	
$template->pparse('body');
}

include($phpbb_root_path . 'link/link_footer.'.$phpEx);
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);

?>

functions code

Code: Alles auswählen

<?PHP

// --> link counter update

function update_hits($linkid){

global $db, $linkid;

$sql = 'UPDATE ' . ezlink_LINK_TABLE . ' SET link_clicks = link_clicks + 1 WHERE link_id = '.$linkid.' ';
if ( !$db->sql_query($sql) )
{
	message_die(GENERAL_ERROR, "Could not update link hits.", '', __LINE__, __FILE__, $sql);
}

}

// --> URL anzeigen

function get_link($linkid){

global $db, $linkid;

	$linksql = "SELECT * FROM " . ezlink_LINK_TABLE . " WHERE link_id = $linkid ";
	
	if(!$getlink = $db->sql_query($linksql)) {
	message_die(GENERAL_ERROR, 'fehler beim auslesen der link - informationen', '', __LINE__, __FILE__, $cat_sql);
	}
	
	$link_row = $db->sql_fetchrow($getlink);
	$url = $link_row['link_url'];
	
	header('location: http://'.$url);
	exit;
  	
}

function delete_link($linkid){

global $db, $linkid;

	$sql = "DELETE FROM " . ezlink_LINK_TABLE . " WHERE link_id = $linkid ";

	if(!$droplink = $db->sql_query($sql)) {
	message_die(GENERAL_ERROR, 'fehler beim löschen des links ', '', __LINE__, __FILE__, $cat_sql);
	}	

	
}

?>
Leben und Leben lassen.
Maffy
Mitglied
Beiträge: 158
Registriert: 16.07.2002 17:14
Wohnort: Steinach
Kontaktdaten:

Beitrag von Maffy »

Weis zwar nicht genau wo der fehler war, aber jetzt geht es plötzlich.

Maffys ezLinkliste
Leben und Leben lassen.
Antworten

Zurück zu „Coding & Technik“