Päätin julkaista oman kyselyjärjestelmäni version 0.1 (PHP5 & MySQL >= 4.1). Soveltuu koodivinkiksi suuren muokattavuutensa tähden. :) Järjestelmä on oikeastaan pelkkä moottori, johon täytyy itse kyetä liittämään omat ulkoasunsa. Tässä kunnossa se tulostaa kohtuullisen rumia sivuja, joiden pitäisi kuitenkin noudattaa XHTML 1.0 strict standardia. Äänestäneet ip:t myös tallennetaan tauluun, joten kaksoisäänestyksen riski vähentyy hieman.
Huomaa, että admin.php ei sisällä mitään ylimääräistä suojausmekanismia, joten se kannattanee suojata vähintäänkin .htaccess -tiedostolla esimerkiksi näin:
<files "admin.php"> AuthUserFile D:\Apache\Palvelin\secured\.htpasswd AuthType Basic AuthName "Administrator script" require valid-user </files>
Koodia saa testata osoitteessa: http://zeph.mine.nu/poll/
Toiminnassa lähes aina 10:00 - 24:00. Jos välttämättä tahdot kokeilla admin -scriptiä, voit lähettää meiliä tai lisätä minut msn messengeriin. Osoite löytyy profiilista.
Tarvitaan kolme taulua vapaavalintaisessa MySQL tietokannassa:
CREATE TABLE ipsvoted (id int(11) NOT NULL auto_increment primary key, ip varchar(4), votedpoll int(11)); CREATE TABLE options (id int(11) NOT NULL auto_increment primary key, name varchar(50), votecount int(5) default '0', poll int(11)); CREATE TABLE polls (id int(11) NOT NULL auto_increment primary key, name varchar(50), description tinytext, active timestamp, inf_active tinyint(1));
P.S. Kiitoksia ajv:lle char_ip funktiosta. :)
(Valitan rivien pituutta, putka ei näy tykkäävän niistä..)
settings.php
<?php $__host = "localhost"; $__user = "root"; $__password = "******"; $__database = "pollsystem"; // put your own database here ?>
index.php
<?php include 'settings.php'; function char_ip($ip){ if(count($osa = explode(".",$ip)) == 4) return substr(sprintf("%c%c%c%c", (int)$osa[0], (int)$osa[1], (int)$osa[2], (int)$osa[3]), 0, 4); else return "errr"; } echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">\n<html>\n\t"; echo "<head>\n\t\t<title>Incendia Poll System</title>\n\t</head>\n\t<body>\n\t\t<h3>Incendia Poll System (v0.1)</h3>\n\t\t"; $mysqli = new mysqli($__host, $__user, $__password, $__database); if (mysqli_connect_errno()) { echo mysqli_connect_error(); exit; } if (isset($_GET['shid'])) { $shid = addslashes(htmlspecialchars($_GET['shid'])); if ($result = $mysqli->query("select id, name, description, (active > FROM_UNIXTIME(".time().")) from polls where id=$shid union select * from options where poll = $shid")) { if($result->num_rows > 0) { $row = $result->fetch_row(); echo "<h4>Results for the poll #{$row[0]}, {$row[1]}</h4>\n\t\t<p><b>{$row[2]}</b></p>\n\t\t"; // give the results $total = 0; $i = 0; $values = array(); $options = array(); while($row = $result->fetch_row()) { $values[$i] = $row[2]; $total += $row[2]; $options[$i] = $row[1]; $i++; } echo "<table>"; $i = 0; foreach($values as $value) { echo "\n\t\t\t<tr>\n\t\t\t\t<td>{$options[$i]}:</td>"; echo "\n\t\t\t\t<td><div style=\"width:".(($total>0)?(round($value*(200/$total),0)):"0"); echo "px;height:18px;margin-bottom:5px;padding-top:1px;background-color:#767FA2;text-align:center;float:left;\"></div>"; echo "</td>\n\t\t\t\t<td>".(($total>0)?(round($value*(100/$total),0)):"0")." %</td>\n\t\t\t</tr>"; $i++; } echo "\n\t\t</table>\n\t\t<p>Total votes cast: $total</p>\n\t\t"; echo "<p><a href=\"".$_SERVER['PHP_SELF']."\"><<</a></p>"; $result->close(); } else { echo "<h4>Poll #$shid doesn't exist.</h4>"; } } } elseif (isset($_GET['pid'])) { $pid = addslashes(htmlspecialchars($_GET['pid'])); if ($result = $mysqli->query("select id, name, description, (active > FROM_UNIXTIME(".time().") || inf_active = TRUE), (select ip from ipsvoted where ip = '".addslashes(char_ip($_SERVER['REMOTE_ADDR']))."' && votedpoll = $pid) from polls where id = $pid union select *, \"\" from options where poll = $pid")) { if ($result->num_rows > 0) { if (!isset($_POST['send'])) { $row = $result->fetch_row(); if ($row[3] == 1 && $row[4] != char_ip($_SERVER['REMOTE_ADDR'])) // timecheck, ipcheck { echo "<h4>Poll #{$row[0]}, {$row[1]}"; echo "</h4>\n\t\t<p><b>{$row[2]}</b></p>\n\t\t"; // let the user vote echo "<form method=\"post\" action=\"?pid=$pid\">\n\t\t\t<p>\n\t\t\t"; $i=0; while($row = $result->fetch_row()) { echo "<input type=\"radio\" name=\"option\" value=\"{$row[0]}\""; echo (($i==0)?" checked=\"checked\"":"")." /> {$row[1]}<br />\n\t\t\t"; $i++; } echo "<br />\n\t\t\t<input type=\"submit\" name=\"send\" value=\"Send\" />\n\t\t\t</p>\n\t\t</form>\n\t\t"; echo "<p>\n\t\t<a href=\"".$_SERVER['PHP_SELF']."\"><<</a></p>"; } else { header("location: ".$_SERVER['PHP_SELF']."?shid=$pid"); } } else { if ($result = $mysqli->query("select ip from ipsvoted where ip = '".addslashes(char_ip($_SERVER['REMOTE_ADDR']))."' && votedpoll = $pid")) { if ($result->num_rows == 0) { // get the val from post[option] and add 1 to the id presented by it $val = intval(htmlspecialchars($_POST['option'])); $mysqli->query("update options set votecount = (votecount + 1) where id = $val"); $mysqli->query("insert into ipsvoted(ip, votedpoll) values('".addslashes(char_ip($_SERVER['REMOTE_ADDR']))."', $pid)"); } header("location: ".$_SERVER['PHP_SELF']."?shid=$pid"); } } } else { echo "<h4>Poll #$pid doesn't exist.</h4>"; } $result->close(); } } else { $a = array(); $b = array(); if ($result = $mysqli->query("select *, (active > FROM_UNIXTIME(" . time() . ")) as act from polls order by act, active desc")) { $i = 0; while($row = $result->fetch_assoc()) { if ($row['act'] == "1" || $row['inf_active'] == "1") $a[$i] = $row; else $b[$i] = $row; $i++; } $result->close(); } if (count($a) > 0) { echo "<h4>Active polls</h4>\n\t\t<table>"; foreach ($a as $row) { extract($row); print "\n\t\t\t<tr>\n\t\t\t\t<td><a href=\"?pid=$id\">$name</a></td>\n\t\t\t\t<td>"; echo (($inf_active)?"<i>infinitely active</i>":$active)."</td>\n\t\t\t</tr>"; } echo "\n\t\t</table>"; } if (count($b) > 0) { echo "\n\t\t<h4>Inactive polls</h4>\n\t\t<table>"; foreach ($b as $row) { extract($row); echo "\n\t\t\t<tr>\n\t\t\t\t<td><a href=\"?shid=$id\">$name</a></td>\n\t\t\t\t<td>$active</td>\n\t\t\t</tr>"; } echo "\n\t\t</table>"; } } $mysqli->close(); echo "\n\t</body>\n</html>" ?>
admin.php
<?php require('settings.php'); $php_s = $_SERVER['PHP_SELF']; function AddPoll() { global $php_s; // Add a poll. if (!isset($_POST['submit'])) { $optioncount = 4; $active=1; $title = ""; $descr = ""; $choices = array("","","",""); if (isset($_POST['addc'])) { $title = $_POST['title']; $descr = $_POST['descr']; $active = $_POST['active']; $choices = $_POST['choices']; $choices[count($choices)] = ""; } if (isset($_POST['del_opt'])) { $title = $_POST['title']; $descr = $_POST['descr']; $active = $_POST['active']; $choices = $_POST['choices']; $delbuttons = $_POST['del_opt']; if (count($choices) > 1) { for ($i=0;$i<count($choices);$i++) { if (isset($delbuttons[$i+1])) { $optioncount -= 1; unset($choices[$i]); break; } } } } echo "<h3>Incendia Poll System (v0.1) admin</h3>\n\t\t"; echo "<h4>Add a poll</h4>\n\t\t"; echo "<form method=\"post\" action=\"$php_s\">\n\t\t\t<table>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Title </b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"title\" size=\"53\" maxlength=\"250\" value=\"$title\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Active*</b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"active\" size=\"3\" maxlength=\"3\" value=\"$active\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Decription </b></td>\n\t\t\t\t\t<td><textarea name=\"descr\" cols=40 rows=7>$descr</textarea></td>\n\t\t\t\t</tr>"; $i = 1; foreach($choices as $choice) { echo "\n\t\t\t\t<tr>\n\t\t\t\t\t<td><b>Option $i</b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"choices[]\" value=\"$choice\" size=\"42\" maxlength=\"250\" /> <input type=\"submit\" name=\"del_opt[$i]\" value=\"Delete\" /></td>\n\t\t\t\t</tr>"; $i++; } echo "\n\t\t\t\t<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td><input type=\"submit\" name=\"addc\" value=\"Add option\" /> <input type=\"submit\" name=\"submit\" value=\"Submit poll\" /><input type=\"hidden\" name=\"add\" value=\"add\"></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td>* <i>(days, 0 = infinite)</i></td>\n\t\t\t\t</tr>\n\t\t\t"; echo "</table>\n\t\t</form>"; } else { $title = htmlspecialchars(addslashes($_POST['title'])); $descr = htmlspecialchars(addslashes($_POST['descr'])); $descr = str_replace("\n", "<br />", $descr); $choices = $_POST['choices']; $active = intval($_POST['active']); if($title != "" && $descr != "" && is_numeric($active)) { global $__host; global $__user; global $__password; global $__database; $mysqli = new mysqli($__host, $__user, $__password, $__database); if (mysqli_connect_errno()) { echo mysqli_connect_error(); exit; } $mysqli->query("insert into polls (name, description, active, inf_active) values ('$title', '$descr', DATE_ADD(NOW(), INTERVAL $active DAY), ".(($active==0)?"TRUE":"FALSE").")"); $choicequery = "insert into options (name, poll) values "; foreach($choices as $choice) { $choicequery .= "('$choice', (select id from polls order by id desc limit 1)), "; } $choicequery = substr($choicequery, 0, strlen($choicequery)-2); $mysqli->query($choicequery); $mysqli->close(); header("Location: $php_s"); } else { header("Location: $php_s"); } } } function RemovePoll($remdata) { global $php_s; global $__host; global $__user; global $__password; global $__database; $mysqli = new mysqli($__host, $__user, $__password, $__database); if (mysqli_connect_errno()) { echo mysqli_connect_error(); exit; } // Delete $id = $remdata; $str = ""; $str2 = ""; $str3 = ""; foreach($id as $i) { $i = addslashes(htmlspecialchars($i)); $str .= "id = $i or "; $str2 .= "poll = $i or "; $str3 .= "votedpoll = $i or "; } $str = substr($str, 0, -4); $str2 = substr($str2, 0, -4); $str3 = substr($str3, 0, -4); $mysqli->query("delete from polls where $str"); $mysqli->query("delete from options where $str2"); $mysqli->query("delete from ipsvoted where $str3"); header("Location: $php_s"); } function ModifyPoll($which) { global $php_s; global $__host; global $__user; global $__password; global $__database; $mysqli = new mysqli($__host, $__user, $__password, $__database); if (mysqli_connect_errno()) { echo mysqli_connect_error(); exit; } // Modify poll. if (!isset($_POST['submit'])) { $optioncount = 4; $active=1; $title = ""; $descr = ""; $choices = array("","","",""); if (!isset($_POST['addc']) && !isset($_POST['del_opt'])) { // Load data. if ($result = $mysqli->query("select name, description, inf_active, (TO_DAYS(active) - TO_DAYS(NOW())) as dc from polls where id = $which union select name, \"\",\"\",\"\" from options where poll = $which")) { if ($result->num_rows > 0) { $row = $result->fetch_row(); $title = $row[0]; $descr = $row[1]; $descr = str_replace( "<br />", "\n", $descr); $active = ($row[2] == 1) ? 0 : $row[3]; $i=0; $choices = array(); while($row = $result->fetch_row()) { $choices[$i]=$row[0]; $i++; } $optioncount = $i+1; } $result->close(); } } if (isset($_POST['addc'])) { $title = $_POST['title']; $descr = $_POST['descr']; $active = $_POST['active']; $choices = $_POST['choices']; $choices[count($choices)] = ""; } if (isset($_POST['del_opt'])) { $title = $_POST['title']; $descr = $_POST['descr']; $active = $_POST['active']; $choices = $_POST['choices']; $delbuttons = $_POST['del_opt']; if (count($choices) > 1) { for ($i=0;$i<count($choices);$i++) { if (isset($delbuttons[$i+1])) { $optioncount -= 1; unset($choices[$i]); break; } } } } echo "<h3>Incendia Poll System (v0.1) admin</h3>\n\t\t"; echo "<h4>Modify poll</h4>\n\t\t"; echo "<form method=\"post\" action=\"$php_s?m=$which\">\n\t\t\t<table>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Title </b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"title\" size=\"53\" maxlength=\"250\" value=\"$title\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Active*</b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"active\" size=\"3\" maxlength=\"3\" value=\"$active\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td><b>Decription </b></td>\n\t\t\t\t\t<td><textarea name=\"descr\" cols=\"40\" rows=\"7\">$descr</textarea></td>\n\t\t\t\t</tr>"; $i = 1; foreach($choices as $choice) { echo "\n\t\t\t\t<tr>\n\t\t\t\t\t<td><b>Option $i</b></td>\n\t\t\t\t\t<td><input type=\"text\" name=\"choices[]\" value=\"$choice\" size=\"42\" maxlength=\"250\" /> <input type=\"submit\" name=\"del_opt[$i]\" value=\"Delete\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; $i++; } echo "<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td><input type=\"checkbox\" name=\"no_opt_edit\" value=\"1\" /> Will any options be edited? (Note: All votes will be cleared!)</td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td><input type=\"submit\" name=\"addc\" value=\"Add option\" /> <input type=\"submit\" name=\"submit\" value=\"Submit\" /></td>\n\t\t\t\t</tr>\n\t\t\t\t"; echo "<tr>\n\t\t\t\t\t<td></td>\n\t\t\t\t\t<td>* <i>(days, 0 = infinite)</i></td>\n\t\t\t\t</tr>\n\t\t\t"; echo "</table>\n\t\t</form>"; } else { $title = htmlspecialchars(addslashes($_POST['title'])); $descr = htmlspecialchars(addslashes($_POST['descr'])); $descr = str_replace("\n", "<br />", $descr); $choices = $_POST['choices']; $active = intval($_POST['active']); if($title != "" && $descr != "" && is_numeric($active)) { $mysqli->query("update polls set name = '$title', description = '$descr', active = DATE_ADD(NOW(), INTERVAL $active DAY), inf_active = ".(($active==0)?"TRUE":"FALSE")." where id = $which"); if(isset($_POST['no_opt_edit'])) { $choicequery = "insert into options (name, poll) values "; foreach($choices as $choice) { $choicequery .= "('$choice', $which), "; } $choicequery = substr($choicequery, 0, strlen($choicequery)-2); $mysqli->query("delete from options where poll = $which"); $mysqli->query("delete from ipsvoted where votedpoll = $which"); $mysqli->query($choicequery); } header("Location: $php_s"); } else { header("Location: $php_s"); } } $mysqli->close(); } echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">\n<html>\n\t<head>\n\t\t<title>Incendia Poll System</title>\n\t</head>\n\t<body>\n\t\t"; if(isset($_POST['add'])) AddPoll(); elseif(isset($_POST['rm'])) RemovePoll($_POST['id']); elseif(isset($_GET['m'])) ModifyPoll(addslashes(htmlspecialchars($_GET['m']))); else { // Parameters for arranging if (isset($_GET['sb'])) $sb = $_GET['sb']; else $sb = 0; if (isset($_GET['d'])) $d = $_GET['d']; else $d = 0; // Transform parameters into a partial query switch($sb) { case 0: { $sb = "active " . (($d == 0) ? "DESC" : "ASC") . ", name ASC"; break; } case 1: { $sb = "name " . (($d == 0) ? "DESC" : "ASC"); break; } default: { $sb = "active " . (($d == 0) ? "DESC" : "ASC") . ", name ASC"; break; } } $mysqli = new mysqli($__host, $__user, $__password, $__database); if (mysqli_connect_errno()) { echo mysqli_connect_error(); exit; } echo "<h3>Incendia Poll System (v0.1) admin</h3>\n\t\t"; print "<form method=\"post\" action=\"$php_s\">\n\t\t\t"; if ($result = $mysqli->query("select * from polls order by $sb")) { print "<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td><a href=\"$php_s?sb=1&d=" . abs($d-1) . "\"><b>Name</b></a></td>\n\t\t\t\t\t<td><a href=\"$php_s?sb=0&d=" . abs($d-1) . "\"><b>Active</b></a></td>\n\t\t\t\t\t<td></td>\n\t\t\t\t</tr>"; while($row = $result->fetch_assoc()) { extract($row); print "\n\t\t\t\t<tr>\n\t\t\t\t\t<td><div><input type=\"checkbox\" name=\"id[]\" value=\"$id\" /> $name</div></td>\n\t\t\t\t\t<td>".(($inf_active)?"<i>infinitely active</i>":$active)."</td>\n\t\t\t\t\t<td><a href=\"$php_s?m=$id\">Modify</a></td>\n\t\t\t\t</tr>\n\t\t\t"; } print "</table>\n\t\t\t<p>\n\t\t\t"; } print "<input type=\"submit\" name=\"rm\" value=\"Remove\" />\n\t\t\t<input type=\"submit\" name=\"add\" value=\"Add\" />\n\t\t\t</p>\n\t\t</form>"; $mysqli->close(); } echo "\n\t</body>\n</html>" ?>
- Ihan höhlää käyttää mysqliä. useimmilla palvelimilla on kuitenkin php4 vielä, elikkä toi ei toimi melkein missään.
- Kommentoinnit vähän naurattaa. Noissa kohdissa tollaset kommentitha on ihan turhia, koodista tajuaa ihan hyvin mitä se tekee.
- selventäis hurjasti jos sisentäsit noi hommelit mitä echoat ulos tyyliin
<?php echo "Moikka\n" . "Tämä on uudella rivillä\n"; ?>
epäselvän näköstä ja vaikealukuista ku noi on tolleen karmean pitkiä ja yhdellä rivillä.
- mitä varten käytät jossain echoa ja jossain printiä? päätä jo. Lisäks näyttää hassulta kun jossain echoat tosi isoja rivejä ja jossain sit viis echoa peräkkäin.
- "täytyy kyetä liittämään oma ulkoasunsa" joo, olisit voinut selventää koodia sitä varten. Nyt jos haluaa käyttää niin saa itte ettiä tuolta sun leiskan roinat ja korvata ne.
- jossai käytät $_GETistä otettuun arvoon addslashes()ia, etkä edes tarkista magic_quotes_gpc:tä (taitaa jopa olla oletuksenaki päällä php:ssä).
- usein tehään silleen että tiedot laitetaan raakana kantaan ja muotoillaan (esim htmlspecialchars()) vasta tulostaessa...
- sisentäsit noi queryt.
noi nyt tärkeimpinä ekana tuli mieleen.
Yritän jokaiseen kommenttiisi vastata parhaani mukaan:
- Omalla palvelimella on vain php5 ja mysqli, joten lieni viisasta käyttää olemassa olevia paketteja.
- Kommentoinnit ovat ehkä naiiveja tai turhia, mutta selkeyttävät koodia ihan itseäni ajatellen jos siihen palaan vaikkapa vuoden päästä.
Makuasia, omassa editorissa pitkistä riveistä saa helpommin selvää kuin pätkityistä. Kokeiltu juttu.
- Kyseisestä asiasta on valitettu ennenkin.. PHP ei ole ainoa ohjelmointikieli, jota käytän, minkä vuoksi riippuen muista sinä päivänä käyttämistä kielistä laitan sen komennon joka ensiksi tulee mieleen. Voit toki käyttää Replace All komentoa, jos ei kelpaa.. :) Rivien pituus vaihtelee, sillä kirjoitan ne sitä mukaa kun pääni tuottaa koodia. Jos itse tarvitsen seuraavan rivin pitääkseni ajatukset koossa, teen sen auliisti.
- Edelleen koodi oli alunperin täysin omaan käyttööni suunnattu. Laitoin sen kuitenkin tänne sillä siitä saattaisi jolle kulle olla hyötyä. Ehkäpä olisi pitänyt tulostaa jonain <xml> syötteenä, jonka jokin toinen scripti voisi parsia?..
- Ihan tietoturvan vuoksi laitan ne slashit jokaiseen merkkijonoon.. (edit: omassa pääkoneessa serveri.. ei ole kiva kadottaa mitään) Mielestäni ei paljoa aikaa kuluta laittaa niitä jokaiseen. Ei ole vaivan arvoista testata magic_quotes_gpc:tä (joka on omassa palvelimessa pois päältä tietääkseni), vaikka voisi senkin toki tehdä helposti copy & pastettamalla samat rivit uudestaan ja uudestaan.
- Miksei voisi tehdä toisinpäin? Ei ole kiva selata konsolilla kantaa kun \n merkit sotkevat kaiken. Perusteluja..?
- Sisennetty teksti on omalla editorillani hankalampaa lukea kuin sisentämätön (makuasia?). Kokeiltu on tätäkin.
Vielä lopuksi: tavoitteenani ei ollut tehdä koodia, jonka jokainen voisi copy & pastettaa .php tiedostoon; käynnistää sen ja nauttia valmiista ohjelmasta. Sitä varten ovat projektit.
Ei niit slashei laiteta merkkijonoon jos ne on siinä jo. Ideaa tuplaquotettaa? esim käyttäjä laittaa '-merkin, servun taikuus muuttaa sen -> \', ja sun addslashes() muuttaa sen -> \\\', eli escapoi \-merkin ja '-merkin. Näkyy sit sivulla vääri viimeistään.
Ja raakana on kiva olla romut kannassa ku niitten tulostusmuotoa kuitenki joskus muutetaan, ja sitte pitää parsia sitä purkasti. Ihan raaka teksti on paljon helpompi muotoilla sit jälkeenpäin. Ja mitenkä \n:t sekottaa? Ja eks voi tehdä nettisivupohjaista selaushommelia?
Pilkun raiskausta:
Eikös nämä saisi yhteen riviin:
<?php global $__host; global $__user; global $__password; global $__database; //Näin: global $__host, $__user, $__password, $__database; //Ja $str = ""; $str2 = ""; $str3 = ""; //Näin: $str=$str2=$str3=""; ?>
No ihan turhaa valitustahan tämä on, mutta pistää vain silmään, kun ite tykkään tehä mahollisimman paljon yhelle riville :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.