Automatische pagina's aanmaken?

Status
Niet open voor verdere reacties.

Colinch

Gebruiker
Lid geworden
22 nov 2012
Berichten
36
Hallo,

Ik heb een beginnersvraag maar hoe werkt het precies als je bijvoorbeeld veel items in een database hebt en van ieder item een pagina wil?

Hier is een voorbeeld: www.futhead.com

Op deze site kun je voetballers uit het spel fifa zoeken en ieder heeft een eigen pagina. Er zijn 1000+ spelers.
Als je er een zoekt en in de url kijkt zie je zoiets:(bijvoorbeeld) /pages/player/3738/

Maar als ik zelf zoiets wil maken dan moet ik alles handmatig doen en dan zou het er zo uit zien: /pages/player/3738.php

Is er dan een manier dat paginas automatisch worden aangemaakt of is dit gewoon een kwestie van hoe je naar die pagina linkt?
Als dat het geval is, hoe zou je dan van zoveel items het best voor ieder een pagina aan kunnen maken?

Ik wil ongeveer hetzelfde maken, dus ik hoop dat iemand me kan helpen, alle items staan in een database en ik heb zelfs al zo'n autocomplete input veld zoals op de voorbeeld site.

Ik ben nog niet heel bekend met programmeren maar ben druk aan het leren!

Alvast bedankt
 
Ik heb even naar futhead gekeken en wat zij doen is het volgende

Elke speler heeft dezelfde php pagina
Alleen ziet de PHP url variable voor welke speler hij in de database moet zoeken.
Als gebruiker zien wij de url variable niet omdat zij die met een .htaccess bestand verbergen maar het nummer zoals 3738 is het database id dat wordt getoont op de site.

hier wat leesvoer over het aanpassen van een url met .htaccess http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html


wat je bijvoorbeeld bij futhead eigenlijk opent is het volgende /index.php?type=fifa&section=players&id=3738
Let op dit is niet de werkelijke url van futhead maar een voorbeeld.

De php weet nu welke data hij uit de databse moet halen en moet laten zien. Dit lijkt een compleet andere pagina voor elke gebruiker maar dat is in de werkelijkheid niet zo.
 
Hey, bedankt voor je reactie!

Die uitleg over .htaccess is ook erg handig.

Maar kun je dan bijvoorbeeld naar die pagina linken door /fifa/players/3837/ in de href te zetten? dus dan zet je in de link /fifa/players/3837/ dan zet hij hem om naar /index.php?type=fifa&section=players&id=3738 dus dan weet de database welke data hij moet hebben en dan zet hij hem in de url weer om in /fifa/player/3837/.
Óf moet je wel echt zo linken in de href /index.php?type=fifa&section=players&id=3738
Het maakt in principe niet veel uit maar als je in de href gewoon /fifa/players/3837/ kunt typen dan is dat iets makkelijker dan die andere vind ik.

Verder echt bedankt ik kan er mee aan de slag, alleen nog 1 dingetje. Op welke term moet ik zoeken als ik wil weten hoe je met php dus die gegevens uit de url kunt halen?
Ik neem aan dat je dan zoiets moet gaan maken:

playerid = "playerid uit de url"
 
Laatst bewerkt door een moderator:
Hey, bedankt voor je reactie!

Die uitleg over .htaccess is ook erg handig.

Maar kun je dan bijvoorbeeld naar die pagina linken door /fifa/players/3837/ in de href te zetten? dus dan zet je in de link /fifa/players/3837/ dan zet hij hem om naar /index.php?type=fifa§ion=players&id=3738 dus dan weet de database welke data hij moet hebben en dan zet hij hem in de url weer om in /fifa/player/3837/.
Óf moet je wel echt zo linken in de href /index.php?type=fifa§ion=players&id=3738
Het maakt in principe niet veel uit maar als je in de href gewoon /fifa/players/3837/ kunt typen dan is dat iets makkelijker dan die andere vind ik.

Dit durf ik niet met zekerheid te zeggen ik werk hier zelf namelijk niet vaak mee omdat ik zelf vaak een CMS die dit standaard ondersteunen gebruik voor mijn projecten. Dit ik je het beste testen door het gewoon even een keer uit te proberen.

Over het weer uithalen van url variable verwijs ik even naar http://www.helpmij.nl/forum/showthread.php/756906-iets-achter-php-zetten. Heb ik daar helemaal uitgelegd.
 
Trouwens, ik heb nog wel een vraagje die eigenlijk off-topic is maar op die site doen hun zeg maar als je op een item uit die autocomplete-list klikt dan wordt je meteen doorgelinkt. Ik heb zo'n zelfde soort dropdown list en als je dan op een item klikt dan wordt het dus in het textfield (input) gezet.
 
Om ook een auto doorlink te krijgen moet je simpel een javascript form submit functie toevoegen aan een onchange attribuut. zet in het zoekveld (on the html code) ge volgende text:

Code:
onchange="document.forms['HIER_JOUW_FORM_ID'].submit();"

Op futhead hebben zij het anders gedaan maar dit is voor jouw waarschijnlijk de beste oplossing.

Op futhead hebben zij een AJAX script geschreven dit een html list creëert met daarin allemaal html linken die je gewoon doorstuurt omdat het geen form is maar een link. Geef ook eens even een link naar je webpagina. Dan kan ik eens kijken hou jouw systeem in elkaar steekt. Dat helpt makkelijker.

Op http://shoutfm.nl/ (site door mij ontwikkeld) heb ik ook zo'n auto submit script zitten op het zoekform.
 
Ik was nog niet ver dus heb even hetzelfde gemaakt als het idee van futhead (spelers opzoeken):
http://colinch.com/fut/

Het auto-complete script heb ik van: http://www.htmlblog.us/jquery-autocomplete/

Ik heb er even een paar toegevoegd, als je "es" intypt krijg je drie opties.

Die code die je gaf voor het zoekveld werkt volgens mij wel alleen linkt hij nog niet helemaal goed door, ik heb nu de link weggehaald omdat het script zelf al een a tag neerzet en als ik die dan bijvoorbeeld in de php code zet maakt hij 2 a tags aan.

De site van jou ziet er goed uit trouwens!
 
Het probleem bij jouw zit hem in het auto-complete. Mag ik de url (bijvoorbeeld: speler.php?id=23) waar de pagina naar to moet gaan wanneer iemand op een item klikt? Dan schrijf ik morgen even een ander auto-complete script voor je dat wel werkt. De auto-complete functie die je nu gebruikt werkt niet voor in jou situatie. Die is gemaakt om een form in te vullen en niet om een doorlink te hebben.

Ook zou ik graag een kopie van je suggest_zip.php willen hebben om wat aanpassingen te maken in de json output. (let wel op dat wanneer er een mysql connectie in doe pagina zit dat je je wachtwoorden even veranderd naar ***** zodat niet al je gegevens op internet staan.
 
Laatst bewerkt:
Hey, ik heb een drukke week gehad dus vandaar de vrij late reactie.

Ik heb nog geen pagina, maar speler.php lijkt mij goed.
Hier de sugest_zip.php:

PHP:
<?php

if ( !isset($_REQUEST['term']) )
    exit;

$dblink = mysql_connect('localhost', 'colin78955_fut', '*******') or die( mysql_error() );
mysql_select_db('colin78955_fut');

$rs = mysql_query('select zip, lvl, inform, rating, city, county, state from zipcode where zip like "%'. mysql_real_escape_string($_REQUEST['term']) .'%" order by rating desc limit 0,10', $dblink);

$data = array();
if ( $rs && mysql_num_rows($rs) )
{
    while( $row = mysql_fetch_array($rs, MYSQL_ASSOC) )
    {
	

        $data[] = array(
        'label' => "<span class='flag'><img src='http://www.colinch.com/fut/flags/{$row['county']}' height='18' width='25' style='vertical-align: middle;' /></span><span class='rating {$row['lvl']} {$row['inform']}'>{$row['rating']}</span> <span class='tekstvlak'>{$row['zip']}</span>, {$row['city']} {$row['state']} "  ,    
	 'value' => $row['zip']
        );
    }
}

echo json_encode($data);
flush();

Zoals je ziet zijn bepaalde dingen nog niet aangepast, "zip" gebruik ik hier bijvoorbeeld voor de spelernamen.
 
Laatst bewerkt door een moderator:
oke hier heb ik wat aan. Ik schrijf morgen avond(zondag) wel even een nieuwe code voor je die precies doet wat je wild. Maar even voordat ik een code schrijf die jouw server niet aan kan. Welke php versie heb je?

Om dit te kunnen zien maak je even een nieuw bestandje aan op je webserver en noemt dit bijvoorbeeld versie.php
Zet deze code in versie.php en roep die aan met je browser.
PHP:
<?php phpinfo(); ?>

Ik vraag het omdat ik standaard gebruik maak van classes (php 5+) en mysqli (php 5.3+). Wanneer jij een lagere versie hebt moet ik ff mijn code daarop aanpassen. Ook geen probleem maar liever maak ui gebruik van de nieuwste mogelijkheden.
 
ik weet voldoende. Jou server ondersteund alles wat ik nodig heb. versie.php mag je van mij weer verwijderen. Helaas zag ik je bericht te laat maar in een paar dagen geef ik je je script.
 
De scripts

Hierbij een vervangend script voor je speler zoek functie.

Plaats alle pagina's in je root van je site http://colinch.com/fut/ Lees boven elk script wat je daar nog moet doen om hem werkend te krijgen.

index.php (Hier hoef je niets aan te passen)
PHP:
<?php
define('_COLLINCH', '1.0');

// HIER JOUW WEB ROOT - HEB IK AL GOED GEZET
$homeurl = 'http://colinch.com/fut/';


$docroot = dirname(__FILE__);
define('DS', DIRECTORY_SEPARATOR);
define('DOCROOT', $docroot);
define('HOMEURL', $homeurl);

if(isset($_GET['page'])){
	$page = $_GET['page'];
	switch($page){
		case 'player':
			require DOCROOT . DS . 'player.php';
			break;
		case 'ajax':
			require DOCROOT . DS . 'ajax.php';
			break;
		default:
			require DOCROOT . DS . 'search.php';
	}
}
else{
	require DOCROOT . DS . 'search.php';
}

ajax.php (Hier hoef je niets aan te passen)
PHP:
<?php
function ajaxsearch(){
	// Maak een database object aan.
	if(!class_exists('dbo')){ require DOCROOT . DS . 'database.php'; }
	$db = new dbo();
	$zoekdata = '';

	// Ontvang de opgegeven letters uit het zoekveld en maak er een mysql zoekstring van.
	if(isset($_GET['term']) and !empty($_GET['term'])){
		$term = $_GET['term'];
		$zoekstring = '%'.$term.'%';
		$zoekdata = $db->Quote($zoekstring);
	}
	else{
		return 'Geen gegevens ingevoerd';
	}
	// de mysql zoek opdracht
	$query = "
		SELECT
			zip, lvl, inform, rating, city, county, state 
		FROM
			zipcode
		WHERE
			zip LIKE ".$zoekdata." 
		ORDER BY
			rating DESC
		LIMIT 0,10
	";
	$result = $db->loadAssoc($query);
	return $result;
}



// AJAX Echo
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
echo '<players>'."\n";
$sqldata = ajaxsearch();
if(is_array($sqldata) and !empty($sqldata)){
	foreach($sqldata as $player){
		$zip = $player['zip'];
		$lvl = $player['lvl'];
		$inform = $player['inform'];
		$rating = $player['rating'];
		$city = $player['city'];
		$county = $player['county'];
		$state = $player['state'];
		echo "\t".
			'<player zip="'.htmlspecialchars(utf8_encode($zip)).'" lvl="'.htmlspecialchars(utf8_encode($lvl)).'" inform="'.htmlspecialchars(utf8_encode($inform)).'" rating="'.htmlspecialchars(utf8_encode($rating)).'" city="'.htmlspecialchars(utf8_encode($city)).'" county="'.htmlspecialchars(utf8_encode($county)).'" state="'.htmlspecialchars(utf8_encode($state)).'" />'."\n";
	}
}
else if(!empty($sqldata)){
	echo "\t".'<player zip="ERROR" msg="'.htmlspecialchars(utf8_encode($sqldata)).'" />'."\n";
}
else{
	echo "\t".'<player zip="ERROR" msg="'.htmlspecialchars(utf8_encode('Er is een onbekende fout opgetreden bij het zoeken naar gegevens')).'" />'."\n";
}
echo '</players>'."\n";

search.php (Hier hoef je niets aan te passen)
PHP:
<?php
defined('_COLLINCH')or die('No direct access');
?>
<html>
	<head>
		<title>Zoek speler</title>
		<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
		<script>
			var playersearch = {
				homeurl: '<?php echo HOMEURL; ?>',
				searchinput: 'zoekveld',
				searchframid: 'framezoekveld',
				zoeklijst: 'zoeklijst',

				getNum: function(){
					result = Math.floor(Math.random()*5);
					return result;
				},
				
				ajax_init: function(){
					var req;
					if(window.XMLHttpRequest){
						req = new XMLHttpRequest();
					}
					else if(window.ActiveXObject){
						req = new ActiveXObject("Microsoft.XMLHTTP");
					}
					else{
						alert('Uw browser ondersteund geen XMLHTTP request. Overweeg eens om uw browser te updaten');
						req = false;
					}
					return req;
				},
				
				ajax_search: function(){
					var countmin = 2;
					var zoeklijst = document.getElementById(this.zoeklijst);
					if(zoeklijst){
						var pardiv = zoeklijst.getParent();
						pardiv.removeChild(zoeklijst);
					}
					var searchbox = document.getElementById(this.searchinput);
					var searchvalue = searchbox.value;
					if(searchvalue.length >= countmin){
						var method = 'GET';
						var http = this.ajax_init();
						var url = this.homeurl+"index.php?page=ajax&term="+searchvalue+"&rnum="+this.getNum();
						var xml;
						var txt;
						http.onreadystatechange=function(){
							if(http.readyState==4 && http.status==200){
								xml = http.responseXML;
								var sqldata = "";
								var x = xml.getElementsByTagName('player');
								var firstID = x[0].attributes.getNamedItem("zip").value;
								if(firstID == "ERROR"){
									var msg = x[0].attributes.getNamedItem("msg").value;
									sqldata = "<li>"+msg+"</li>";
								}
								else{
									for(i=0;i<x.length;i++){
										var zip = x[i].attributes.getNamedItem("zip").value;
										var lvl = x[i].attributes.getNamedItem("lvl").value;
										var inform = x[i].attributes.getNamedItem("inform").value;
										var rating = x[i].attributes.getNamedItem("rating").value;
										var city = x[i].attributes.getNamedItem("city").value;
										var county = x[i].attributes.getNamedItem("county").value;
										var state = x[i].attributes.getNamedItem("state").value;
										var gourl = playersearch.homeurl + 'index.php?page=player&zip='+encodeURI(zip);

										var listhtml = '<span class="flag">'+
															'<img src="'+playersearch.homeurl+'flags/'+county+'" height="18" width="25" style="vertical-align: middle;" />'+
														'</span>'+
														'<span class="rating '+lvl+' '+inform+'">'+
															rating+
														'</span>'+
														'<span class="tekstvlak">'+
															zip+
														',</span>'+
														'<span class="citystate">'+
															city+' '+state+
														'</span>';
										sqldata = sqldata + '<li class="playerli"><a href="'+gourl+'" style="text-decoration:none;">'+listhtml+'</a></li>';
									}
								}
								var searchbox = document.getElementById(playersearch.searchinput);
								var fromleft = searchbox.offsetLeft;
								var zoekboxlist = document.createElement('ul');
								zoekboxlist.setAttribute('id', playersearch.zoeklijst);
								zoekboxlist.setAttribute('style', 'left:'+fromleft+'px;');
								zoekboxlist.innerHTML = sqldata;
								document.getElementById(playersearch.searchframid).appendChild(zoekboxlist);
							}
						}
						http.open(method, url, true);
						http.send();
					}
				},

				gopage: function(sid){
					var url = this.homeurl + 'index.php?page=player&zip='+encodeURI(sid);
					window.location = url;
				}
			};

			$(document).on('mouseup',function(e){
				var tid = $(e.target).closest('li').parent().attr('id');
				var zoeklist = playersearch.zoeklijst;
				if(tid != zoeklist){
					$('#'+zoeklist).remove();
					$('#zoekveld').val('');
				}
			});
		</script>
		<style>
			#zoeklijst{
				border:1px solid #AAAAAA;
				list-style:none;
				border-radius:5px 5px;
				width:300px;
				padding:0;
				margin:0;
				position:absolute;
			}
			.rating{
				float:right;
				margin:0 4px 0 0;
			}
			.toty {
				background-color: #0f6acd;
				color: white;
				border: 1px solid;
			}
			li.playerli{
				height:20px;
				margin:0;
				padding:2px;
				overflow:hidden;
				cursor:pointer;
			}
			li.playerli:hover{
				background:#e9e9e9;
			}
			li.playerli a,
			li.playerli a:hover,
			li.playerli a:visited{
				color:#000000;
			}
		</style>
	</head>
	<body>
		<div id="framezoekveld">
			<label for="zoekveld">Zoek speler:</label>
			<input type="text" id="zoekveld" onkeyup="playersearch.ajax_search()"/>
		</div>
	</body>
</html>

player.php (Dit is de php die aangeroepen wordt wanneer de link is aangeroepen. heb hier een voorbeeldje ingemaakt. Deze kun je naar eigen ingeving aanpassen.)
PHP:
<?php

defined('_COLLINCH')or die('No direct access');

function getplayer(){
	// Maak een database object aan.
	if(!class_exists('dbo')){ require DOCROOT . DS . 'database.php'; }
	$db = new dbo();
	$player = '';

	// Ontvang de opgegeven letters uit het zoekveld en maak er een mysql zoekstring van.
	if(isset($_GET['zip']) and !empty($_GET['zip'])){
		$zip = urldecode($_GET['zip']);
		$player = $db->Quote($zip);
	}
	else{
		return 'geen speler opgegeven';
	}
	// de mysql zoek opdracht
	$query = "
		SELECT
			*
		FROM
			zipcode
		WHERE
			zip = ".$player;
	$result = $db->loadAssoc($query);
	return $result;
}

?>
<html>
	<head>
		<title>Speler getegevens</title>
	</head>
	<body>
		<?php
			if(isset($_GET['zip']) and !empty($_GET['zip'])){
				$zip = urldecode($_GET['zip']);
				$player = getplayer($zip);
				echo 'Alle data van de speler '.$zip.' wordt gezocht. <br/><hr/><br/>';
				if(is_array($player)){
					print_r($player);
				}
				else{
					echo $player;
				}
			}
			else{
				echo 'Geen spelersnaam opgegeven.';
			}
		?>
	</body>
</html>

database.php (Pas hier op regel 8 t/m 12 de gegevens aan naar jouw mysql server.)
PHP:
<?php
// Beveilig deze pagina zodat hij nooit direct is aan te roepen
defined('_COLLINCH')or die('No direct access');
// Class om een mysql database te maken
class dbo extends mysqli{

	// Configuratie
	private $config_host = 'localhost';				// MySQL Server
	private $config_port = 3306;					// MySQL Server Port
	private $config_user = 'colin78955_fut';		// MySQL Gebruikersnaam
	private $config_pass = '****';					// MySQL Wachtwoord
	private $config_data = 'colin78955_fut';		// MySQL Databse


	// !!! -- MAAK GEEN AANPASSINGEN HIERONDER -- !!!

	// Maakt connectie naar jouw mysql server
	public function __construct(){
		$host = $this->config_host;
		$port = $this->config_port;
		$user = $this->config_user;
		$pass = $this->config_pass;
		$db = $this->config_data;	
		parent::__construct($host, $user, $pass, $db, $port);
		if(mysqli_connect_error()){
			$code = 'MySQLI';
			$title = 'MySQLI - '.mysqli_connect_errno();
			$text = 'MySQLI load error: '.mysqli_connect_error();
			die($code. $title. $text);
		}
		
    }

	// Wordt gebruikt voor mysql Query's die geen data terug krijgen bijvoorbeeld: UPDATE/INSERT/DELETE
	public function setQuery($query){
		$this->query($query);
		$result = $this->affected_rows;
		if($result > 0){ return $result; }
		else if($this->errno){ return $this->error; }
		else{ return 0; }
	}

	// Wordt gebruikt om Gegevens uit de MySQL server te halen bijv: SELECT
	public function loadAssoc($query){
		$return = array();
		$data = array();
		if($result = $this->query($query)){
			while($row = $result->fetch_assoc()){
				$data[] = $row;
			} $return = $data;
			$result->free();
			return $return;
		}
		else if($this->errno){
			return $this->error;
		}
		else{
			return $return;
		}
	}

	// Maakt een quote of de gegeven data vervanger voor MYSQL_REAL_ESCAPE_STRING()
	public function Quote($data){
		if(is_int($data)){
			$result = $this->real_escape_string($data);
		} else{
			$firstchar = substr($data, 0, 1);
			$lastchar = substr($data, -1, 1);
			if($firstchar == '%' and $lastchar == '%'){
				$string1 = substr($data, 0, -1);	// removes the last char
				$string2 = substr($string1, 1);	// removes the first char
				$result = "'%".$this->real_escape_string($string2)."%'";
			}
			else if($firstchar == '%'){
				$string = substr($data, 1);	// Removes the first char
				$result = "'%".$this->real_escape_string($string)."'";
			}
			else if($lastchar == '%'){
				$string = substr($data, 0, -1);	// removes the last char
				$result = "'".$this->real_escape_string($string)."%'";
			}
			else{
				$result = "'".$this->real_escape_string($data)."'"; }
		}
		return $result;
	}

	// Sluit de mysql connectie
	public function __destruct(){
		
		parent::close();
	}
}
Voorbeeld van dit script is op http://home.paules.eu zoek op es
Je eigen bestanden kan je dus verwijderen behalve de map waar al je plaatjes in zitten. Voor extra help kan je ook mailen: webmaster@paules.eu
succes ermee :D
 
Wow echt super bedankt! Hier kan ik zeker wat mee! :D

Ik ben op het moment met nog iets bezig waar ik dit ook goed voor kan gebruiken, maar daar maak ik gebruik van een api met xml file waar de data uit moet worden gehaald.
Zou ik deze code ook daarvoor kunnen gebruiken?
Hier een link naar de api: http://wiki.thegamesdb.net/index.php?title=API_Introduction
Onderin zie je een aantal Calls, ik heb nog nooit gewerkt met zoiets als xml, dus vraag me af of ik dit ook kan gebruiken met het script, zou geweldig zijn!

Nogmaals super bedankt!
 
Yep

Het script dat ik geschreven heb werkt ook met een xml ajax functie.

Op search.php lijn 35 t/m 98 maak ik een AJAX connectie naar een XML pagina (ajax.php). Eigenlijk is dat precies hetzelfde als die API.
 
Ok dan ga ik dat ook maar eens proberen!

Alleen zie ik dat wanneer ik een speler heb gezocht hij de data een beetje verkeerd laat zien, http://colinch.com/fut/index.php?page=player&zip=Mesut Ozil

En als ik zeg maar search.php wil aanpassen voor die api moet ik de url veranderen, dus zoiets?
var url = thegamesdb.net/api/+"GetGamesList.php?name=ajax&term="+searchvalue+"&rnum="+this.getNum();
 
Laatst bewerkt:
Die website api laat een compleet andere indeling in je kan dit niet verkrijgen door alleen maar een url aan te passen. Je moet ook nog de rest van die code aanpassen om hem voor die api te gebruiken. Heb jij skype? bel me dan ff. Dat gaat wat makkelijker dan zo.
 
Ik heb skype, heb je toegevoegd alleen mijn microfoon werkt niet :S Maar het is handiger als we via daar kunnen praten dus laat maar wat weten zodra je tijd hebt ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan