Door
Max van den Bosch
op 10-06-2011 07:51
gewijzigd op 10-06-2011 13:49
3.226 views
Hallo PHPers...
Ik heb een scriptje gemaakt waarmee je het aantal online gebruikers kan lezen. Ook is er een functie bijingebouwd voor het weergeven van het aantal online leden.
Zouden jullie even willen kijken of deze snippet in de scriptdatabase kan? (eventuele fouten of tips melden)
<?php
session_start();
if (isset($_GET['destroy'])){
session_destroy ();
}
$ip=$_SERVER['REMOTE_ADDR'];
$time=time();
$timeout=120+$time; //is in seconden
$dbhost = ""; // MySQL host
$dbuser = ""; // MySQL gebruikersnaam
$dbpass = ""; // MySQL wachtwoord
$dbname = ""; // database naam
$sql="INSERT INTO onlineusers (ip, timeout";
if (isset($_SESSION['username'])){
$sql .=", username";
}
$sql.=") VALUES ('".$_SERVER['REMOTE_ADDR']."', $timeout";
if (isset($_SESSION['username'])){
$sql .=", '".$_SESSION['username']."'";
}
$sql .=")";
// Connect to MySQL Database
mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname) or die("Geen database geselecteerd");
if (!mysql_query($sql)){
echo "Er mislukte iets...</br>Technische informatie: ".mysql_error()."</br>";
}
$sql="DELETE FROM onlineusers WHERE timeout < ".$time;
if (!mysql_query($sql)){
echo "Er mislukte iets...</br>Techinische informatie: ".mysql_error();
}
$uitslag=mysql_query("SELECT DISTINCT ip FROM `onlineusers` WHERE `username` IS NULL") or echo "Ophalen van gegevens is mislukt (1)";
$aantal_ongeregistreert=mysql_num_rows($uitslag);
$uitslag2=mysql_query("SELECT DISTINCT ip FROM `onlineusers` WHERE `username` IS NOT NULL") or echo "Ophalen van gegevens is mislukt (2)";;
$aantal_geregistreert=mysql_num_rows($uitslag2);
echo "Online bezoekers: ".$aantal_ongeregistreert;
echo "</br>";
echo "Online leden: ".$aantal_geregistreert;
//BEKIJK timeout en time
//echo "</br>";
//echo "Timeout: ".$timeout;
//echo "</br>";
//echo "Time---: ".$time;
//echo "</br>";
//echo "time(); = ".time();
if ($time == $timeout){
echo "Error! Time en timeout zijn gelijk";
}
//Bugger, zodat eventuele fouten kunnen worden weergeven
mysql_close();
?>
Mysql_connect gewoon bovenaan je pagina neerknallen (na session_start). Zo weet je zeker dat je altijd verbinding hebt. En mysql_close() is overbodig. En natuurlijk de belangrijke punten van santhe.
Veranderd. Zo beter?
@Arjan
Ik heb geleerd dat je altijd zo laat mogelijk je verbinding moet openen, en zo vroeg mogelijk moet sluiten, i.v.m hacking en snelheid.
- Voeg eerst eens goede foutafhandeling toe: http://snipplr.com/view/45252/goede-foutafhandeling-mysql/
- Haal vervolgens alle backtricks ยด uit de SQL, deze horen hier niet.
- Maak je code ook wat netter door op een regelmatige manier tabs en enters te gebruiken.
Veranderd. Zo beter?
@Arjan
Ik heb geleerd dat je altijd zo laat mogelijk je verbinding moet openen, en zo vroeg mogelijk moet sluiten, i.v.m hacking en snelheid.
Dat het bovenaan moet staan is onzin. Dat je leert om het zo laat mogelijk te openen en zo vroeg mogelijk te sluiten vind ik ook erg apart. Een soort van schijnveiligheid. En dan het 'performanceverschil'. Het verschil tussen beide uitersten zal niet eens meetbaar zijn (tenzij je wellicht het proces 10.000x herhaalt en dat gaat meten). Dat is hetzelfde als onnodige id's gebruiken in database 'omdat dat sneller is'. Of zo weinig mogelijk commentaar gebruiken omdat PHP dat allemaal maar verwerken moet ;). Dus maak je niet druk om de positie.
<?php
session_start();
if (isset($_GET['destroy'])){
session_destroy ();
}
$ip=$_SERVER['REMOTE_ADDR'];
$time=time();
//WAARDEN DIE JE MOET VERANDEREN!!!!!!!!//////
$timeout=120+$time; //is in seconden //////
$dbhost = ""; // MySQL host //////
$dbuser = ""; // MySQL gebruikersnaam //////
$dbpass = ""; // MySQL wachtwoord //////
$dbname = ""; // database naam //////
//////////////////////////////////////////////
define('DEBUG_MODE', true); //DEBUG_MODE instellen, true is aan en false is uit.
if(DEBUG_MODE)
{ // Als de debug mode aanstaat
error_reporting(E_ALL | E_STRICT); //Laat alle errors zien
ini_set('display_errors', 1); // Nog een keer alle errors aanzetten
}
elseif(!DEBUG_MODE)
{ // Als de debug mode uitstaat
error_reporting(0); //Laat geen error zien.
ini_set('display_errors', 0); //idem
}
// Connect to MySQL Database
$mysqlconnector=mysql_connect($dbhost,$dbuser,$dbpass);
if(!$mysqlconnector)
{ //Als er geen verbinding is.
echo "Er kan geen verbinding worden gemaakt";
if(DEBUG_MODE)
{ //Als debug_mode aanstaat.
echo "<br />".mysql_error($mysqlconnector);
}
}
else
{ //Als er verbinding is
$db = mysql_select_db($dbname,$mysqlconnector)
if(!$db)
{ //Als er geen database is gevonden
echo "Er kan geen databasecontact worden gemaakt";
if(DEBUG_MODE)
{
echo "<br />".mysql_error($db);
}
}else{
$sql="INSERT INTO onlineusers (ip, timeout";
if (isset($_SESSION['username'])){
$sql .=", username";
}
$sql.=") VALUES ('".$_SERVER['REMOTE_ADDR']."', $timeout";
if (isset($_SESSION['username'])){
$sql .=", '".$_SESSION['username']."'";
}
$sql .=")";
$return1=mysql_query($sql);
if (!$return1){
echo "Er mislukte iets!";
if(DEBUG_MODE)
{
echo "<br />".mysql_error($return1)."<br />".$sql; //Query echoen om te zien of daar iets fout in is
}
}
$sql="DELETE FROM onlineusers WHERE timeout < ".time();
$return2=mysql_query($sql);
if (!$return2){
echo "Iets mislukte!";
if(DEBUG_MODE)
{
echo "<br />".mysql_error($return2)."<br />".$sql; //Query echoen om te zien of daar iets fout in is
}
}
$sql1="SELECT DISTINCT ip FROM onlineusers WHERE username IS NULL";
$uitslag=mysql_query($sql1);
if (!$uitslag){
echo "Het ophalen lukt niet!";
if(DEBUG_MODE)
{
echo "<br />".mysql_error($uitslag)."<br />".$sql1; //Query echoen om te zien of daar iets fout in is
}
}else{
$aantal_ongeregistreert=mysql_num_rows($uitslag);
}
$sql2="SELECT DISTINCT ip FROM onlineusers WHERE username IS NOT NULL";
$uitslag2=mysql_query($sql2);
if (!$uitslag2){
echo "Het ophalen lukt niet!";
if(DEBUG_MODE)
{
echo "<br />".mysql_error($uitslag2)."<br />".$sql2; //Query echoen om te zien of daar iets fout in is
}
}
$aantal_geregistreert=mysql_num_rows($uitslag2);
echo "Online bezoekers: ".$aantal_ongeregistreert;
echo "</br>";
echo "Online leden: ".$aantal_geregistreert;
//BEKIJK timeout en time
//echo "</br>";
//echo "Timeout: ".$timeout;
//echo "</br>";
//echo "Time---: ".$time;
//echo "</br>";
//echo "time(); = ".time();
if ($time == $timeout){
echo "Error! Time en timeout zijn gelijk, dit kan niet!!!!!";
}
}
?>
Heb je het script bewerkt of ga je gewoon mijn snippet overnemen met een hele kleine aanpassing? Zelfs mijn comments staan er nog in...
Het is niet verstandig te copy/pasten, je moet begrijpen wat je doet. Als je je code zelf niet begrijpt is het verstandig om dit niet in de scriptlib te plaatsen. Lees dus eerst een de beginnershandleidingen en leer daaruit.
Heb je het script bewerkt of ga je gewoon mijn snippet overnemen met een hele kleine aanpassing? Zelfs mijn comments staan er nog in...
Het is niet verstandig te copy/pasten, je moet begrijpen wat je doet. Als je je code zelf niet begrijpt is het verstandig om dit niet in de scriptlib te plaatsen. Lees dus eerst een de beginnershandleidingen en leer daaruit.
Ja, ik snap hem nu wel, maar nu heb ik wel even geknipt en geplakt, omdat ik nu wist dat hij het dan deed...
Ik heb een nieuw PHP boek geleend bij de bieb, Handboek PHP 5. Ik zet hem zo wel even bij de PHP boeken.