Wie man eine PHP-gestützte Umfrage entwirft und erstellt

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Umfragen machen Spaß! Sie können dazu beitragen, die Leser Ihrer Website einzubinden und Ihnen und dem Umfrageteilnehmer wertvolle Informationen zu liefern. Lassen Sie uns Schritt für Schritt eine Umfrage von Grund auf neu erstellen. Von der Photoshop-Gestaltung bis hin zu den PHP/MySQL, die sie antreiben. Hier ist, was wir bauen werden

Die Live-Demo ist nicht mehr online, aber Sie können ein .zip aller Dateien dieser Demo herunterladen.

1. Hintergrund in Photoshop gestalten

Erstellen Sie ein brandneues Photoshop-Dokument. In meinem Fall habe ich den Hintergrund mit einem Dunkelblau (#233743) gefüllt und es auf eine Größe von 700x700 Pixel eingestellt.

Erstellen Sie dann eine brandneue Ebene (drücken Sie das kleine Seiten-Symbol im Ebenen-Bedienfeld) über Ihrer Hintergrundebene. Wählen Sie das Verlaufswerkzeug (Unterwerkzeug des Füllwerkzeugs). Stellen Sie sicher, dass das Verlaufswerkzeug auf Vordergrund zu Transparent, radial und volle Deckkraft wie hier eingestellt ist

In meinem Fall habe ich eine etwas hellere blaue Farbe (#364c5a) verwendet und einen Verlauf von fast oben in der Mitte herausgezogen. Der Verlauf kann "außerhalb" des oberen Randes gehen, aber stellen Sie sicher, dass er nicht an den Seiten oder unten herausragt. Die Idee ist, dass wir dies über einem Hintergrund mit einem passenden Blau zentrieren werden, daher wollen wir nicht, dass der Verlauf abrupt endet. Der Grund, warum wir dies auf einer eigenen Ebene erstellen, ist, dass wir es verschieben können, ohne es neu machen zu müssen.

Fügen wir nun den lustigen "POLL!"-Text oben hinzu. Hier habe ich die Schriftart Agenda Black (einer meiner neuen Favoriten) in einem noch helleren Blauton (#e3f1fa) verwendet. Ich habe sie frei transformiert (Command-T), um sie leicht zu drehen und ihr dann einen leichten Schatten in den Ebenenstilen gegeben.

Nun ist die Grafik bereit zum Speichern. Sie können "Für Web und Geräte speichern" aus dem Menü Datei auswählen. Verwenden Sie eine hochqualitative JPG-Einstellung (am besten für größere Bilder mit Verläufen). Benennen Sie die Datei "page-bg.jpg" und speichern Sie sie in einem "images"-Ordner innerhalb eines Verzeichnisses, das Sie für dieses Projekt verwenden werden.

2. Seitenstruktur aufbauen

Eine Umfrage ist in unserem Fall nur ein wirklich einfaches Formular. Im Grunde eine Reihe von Radio-Button-Eingaben und ein Senden-Button. Hier ist das gesamte HTML-Markup:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Poll</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<fieldset>
	<legend>What is your JavaScript library of choice?</legend>
	<form action="<?php echo $editFormAction; ?>" id="form1" name="form1" method="POST">
		<label>
			<input type="radio" name="Poll" value="mootools" id="Poll_0" />
			Mootools
		 </label>
		<label>
			<input type="radio" name="Poll" value="prototype" id="Poll_1" />
			Prototype
		</label>
		<label>
			<input type="radio" name="Poll" value="jquery" id="Poll_2" />
			jQuery
		</label>
		<label>
			<input type="radio" name="Poll" value="spry" id="Poll_3" />
			Spry
		</label>
		<label>
			<input type="radio" name="Poll" value="other" id="Poll_4" />
			Other
		</label>
		<input type="submit" name="submit" id="submit" value="Vote" />
		<input type="hidden" name="id" value="form1" />
		<input type="hidden" name="MM_insert" value="form1" />
	</form>
</fieldset>
</body>
</html>

Einige Punkte, die hier im Markup zu beachten sind. Ich habe mein Formular in ein fieldset gesetzt. Nichts Funktionales damit verbunden, ich mag einfach, wie die fieldset/legend-Kombination aussieht und uns einen Ansatzpunkt für einige CSS-Stile bietet. Beachten Sie auch, wie die Eingaben innerhalb der label-Elemente liegen. Dies ermöglicht es Benutzern, auf die Wörter und auf den Radio-Button zu klicken, um ihn auszuwählen, was gut ist. Beachten Sie auch das kleine bisschen PHP in der Aktion für das Formular, das wir später behandeln werden.

Hier ist das CSS

* { 
	margin: 0; 
	padding: 0; 
}
body { 
	font-size: 62.5%; 
	font-family: Georgia, serif;
	background: url(images/page-bg.jpg) top center no-repeat #233743; 
}
h6 {
	font-size: 1.4em;
	margin-bottom: 15px;
}
a { color: white; }
label, li {
	display: block;
	padding: 5px;
	font-size: 1.4em;
	color: #e3f1fa;
}
fieldset {
	margin: 115px auto;
	width: 400px;
	padding: 8px 15px 15px 15px;
	border: 1px solid white;
	display: block; /* IE 7 Requires This */
	}
	legend {
		padding: 4px 6px 4px 6px;
		border: 1px solid white;
		font-size: 2.0em;
		color: #e3f1fa;
		font-style: italic;
	}
ul { list-style: none; margin-bottom: 15px;}
.results-bar {
	padding: 10px;
	color: white;
	background: url(images/result-bar-bg.png) left center;
	white-space: nowrap;
}
span.total-votes {
	font-size: 2.6em;
}

Beachten Sie die dort unten stehenden Stile für Dinge, die noch nicht in unserem Markup vorhanden sind. Diese sind für die Ergebnisseite, zu der wir später kommen werden.

3. Eine Datenbank zum Speichern von Ergebnissen erstellen

Die meisten Hosting-Pakete erlauben es Ihnen, Datenbanken auf Ihrem Server zu erstellen. Wenn Sie noch nicht wissen, wie das geht, müssen Sie sich möglicherweise an Ihren Hoster wenden oder in dessen Hilfe-Bereichen nachsehen, wie Sie eine neue hinzufügen.

CSS-Tricks läuft auf Media Temple, daher gibt es ein praktisches kleines Werkzeug direkt im Domain-Admin-Bereich zur Erstellung neuer Datenbanken.

Stellen Sie sicher, dass es sich um eine MySQL-Datenbank handelt. Die vier Dinge, die Sie wissen müssen, sind der Hostname, der Datenbankbenutzername, das Datenbankpasswort und der Name der Datenbank.

Nun müssen Sie eine neue Datei im Verzeichnis erstellen, das Sie für dieses Projekt begonnen haben, namens "conn_vote.php". Ich habe meine in einem Unterordner namens "Connections" platziert. Hier ist das PHP:

<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_conn_vote = "localhost";
$database_conn_vote = "your-database-name";
$username_conn_vote = "your-database-username";
$password_conn_vote = "your-database-password";
//$conn_vote = mysql_pconnect($hostname_conn_vote, $username_conn_vote, $password_conn_vote) or trigger_error(mysql_error(),E_USER_ERROR);
$conn_vote = mysql_connect($hostname_conn_vote, $username_conn_vote, $password_conn_vote) or die('Can\'t create connection: '.mysql_error());
mysql_select_db($database_conn_vote, $conn_vote) or die('Can\'t access specified db: '.mysql_error());
?>

Beachten Sie die vier fett gedruckten Zeilen oben, das sind die vier Variablen für die vier Dinge, die Sie wissen müssen. Die Wahrscheinlichkeit ist groß, dass Ihr Host localhost ist, aber nicht immer. Im Fall von Media Temple wie bei mir ist es etwas wie: internal-db.s12345.gridserver.com

Ihre brandneue leere Datenbank benötigt eine Tabellenstruktur und einige gefälschte Daten, um loszulegen. Hier ist etwas SQL, das Sie ausführen können, um das zu erledigen:

-- 
-- Table structure for table `poll`
-- 
CREATE TABLE `poll` (
  `id` int(3) NOT NULL auto_increment,
  `question` varchar(200) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 ;
-- 
-- Dumping fake data for table `poll`
-- 
INSERT INTO `poll` VALUES (42, 'jquery');
INSERT INTO `poll` VALUES (41, 'mootools');
INSERT INTO `poll` VALUES (40, 'other');
INSERT INTO `poll` VALUES (39, 'mootools');
INSERT INTO `poll` VALUES (38, 'jquery');
INSERT INTO `poll` VALUES (37, 'mootools');
INSERT INTO `poll` VALUES (36, 'spry');
INSERT INTO `poll` VALUES (35, 'jquery');
INSERT INTO `poll` VALUES (21, 'mootools');
INSERT INTO `poll` VALUES (22, 'other');
INSERT INTO `poll` VALUES (23, 'mootools');
INSERT INTO `poll` VALUES (24, 'mootools');
INSERT INTO `poll` VALUES (25, 'prototype');
INSERT INTO `poll` VALUES (26, 'other');
INSERT INTO `poll` VALUES (27, 'mootools');
INSERT INTO `poll` VALUES (28, 'spry');
INSERT INTO `poll` VALUES (29, 'jquery');
INSERT INTO `poll` VALUES (30, 'mootools');
INSERT INTO `poll` VALUES (31, 'prototype');
INSERT INTO `poll` VALUES (32, 'mootools');
INSERT INTO `poll` VALUES (33, 'mootools');
INSERT INTO `poll` VALUES (34, 'mootools');

Die meisten Hoster bieten auch Zugriff auf phpMyAdmin zum Ausführen solcher Dinge. **Stellen Sie sicher**, dass Sie sich in Ihrer neuen Datenbank befinden und dann können Sie dieses SQL einfügen und ausführen.

4. Mit PHP zum Laufen bringen

Jetzt sind wir bereit für etwas PHP-Coding-Magie, um das alles zum Laufen zu bringen. Ich kann nicht vorgeben, das alles zu verstehen, aber der Kern ist, dass es Ihre ausgewählte Option nimmt, sie in einen schön lesbaren und sicheren Zeichenkettenwert umwandelt und als neuen Eintrag in der Tabelle unserer DB speichert.

Vielen Dank an Jonathan Fean für das PHP, das diese Sache antreibt, und an David Walsh für die Hilfe bei der Lösung einiger Probleme und die Inbetriebnahme auf meinem Server.

Fügen Sie diesen PHP-Code am Anfang (noch vor dem DOCTYPE) Ihrer poll.php-Datei ein.

<?php require_once('Connections/conn_vote.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO poll (id, question) VALUES (%s, %s)",
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['Poll'], "text"));

  mysql_select_db($database_conn_vote, $conn_vote);
  $Result1 = mysql_query($insertSQL, $conn_vote) or die(mysql_error());

  $insertGoTo = "results.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

$colname_rs_vote = "-1";
if (isset($_GET['recordID'])) {
  $colname_rs_vote = $_GET['recordID'];
}
mysql_select_db($database_conn_vote, $conn_vote);
$query_rs_vote = sprintf("SELECT * FROM poll WHERE id = %s", GetSQLValueString($colname_rs_vote, "int"));
$rs_vote = mysql_query($query_rs_vote, $conn_vote) or die(mysql_error());
$row_rs_vote = mysql_fetch_assoc($rs_vote);
$totalRows_rs_vote = mysql_num_rows($rs_vote);
?>

Und dieses PHP ganz am Ende der poll.php-Datei (sogar nach dem <html>).

<?php
  mysql_free_result($rs_vote);
?>

5. Eine Ergebnisseite erstellen

Unsere Umfrage funktioniert und sammelt erfolgreich Stimmen, aber die Ergebnisseite ist die eigentliche Belohnung! Dies ist nicht nur der spaßige Teil, sondern unsere PHP-Funktion leitet nach dem Drücken des Abstimmungsbuttons automatisch zu einer "results.php"-Seite weiter, also müssen wir sowieso eine bauen =)

Dieses Mal gebe ich Ihnen das gesamte Markup und das PHP zusammen in einem großen Klumpen.

<?php require_once('Connections/conn_vote.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_conn_vote, $conn_vote);
$query_rs_vote = "SELECT * FROM poll";
$rs_vote = mysql_query($query_rs_vote, $conn_vote) or die(mysql_error());
$row_rs_vote = mysql_fetch_assoc($rs_vote);
$totalRows_rs_vote = mysql_num_rows($rs_vote);

$resultQuestion1 = mysql_query("SELECT * FROM poll WHERE question='mootools'");
$num_rowsQuestion1 = mysql_num_rows($resultQuestion1);

$resultQuestion2 = mysql_query("SELECT * FROM poll WHERE question='prototype'");
$num_rowsQuestion2 = mysql_num_rows($resultQuestion2);

$resultQuestion3 = mysql_query("SELECT * FROM poll WHERE question='jquery'");
$num_rowsQuestion3 = mysql_num_rows($resultQuestion3);

$resultQuestion4 = mysql_query("SELECT * FROM poll WHERE question='spry'");
$num_rowsQuestion4 = mysql_num_rows($resultQuestion4);

$resultQuestion5 = mysql_query("SELECT * FROM poll WHERE question='other'");
$num_rowsQuestion5 = mysql_num_rows($resultQuestion5);

$percentQuestion1 = ($num_rowsQuestion1 / $totalRows_rs_vote)*100;
$percentQuestion2 = ($num_rowsQuestion2 / $totalRows_rs_vote)*100;
$percentQuestion3 = ($num_rowsQuestion3 / $totalRows_rs_vote)*100;
$percentQuestion4 = ($num_rowsQuestion4 / $totalRows_rs_vote)*100;
$percentQuestion5 = ($num_rowsQuestion5 / $totalRows_rs_vote)*100;

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Results</title>
	<link href="style.css" rel="stylesheet" type="text/css" />
</head>

<body>
	<fieldset>
	
		<legend>Results</legend>
		
		<ul>
			<li>
				<?php echo $num_rowsQuestion1 ?> Mootools
				<br />
				<div class="results-bar" style="width: <?php echo round($percentQuestion1,2); ?>%;">
					 <?php echo round($percentQuestion1,2); ?>%
				</div>
			</li>
			
			<li>
				<?php echo $num_rowsQuestion2 ?> Prototype
				<div class="results-bar" style="width: <?php echo round($percentQuestion2,2); ?>%;">
					 <?php echo round($percentQuestion2,2); ?>%
				</div>
			</li>
		
			<li>
				<?php echo $num_rowsQuestion3 ?> jQuery
				<div class="results-bar" style="width: <?php echo round($percentQuestion3,2); ?>%;">
					 <?php echo round($percentQuestion3,2); ?>%
				</div>
			</li>
		
			<li>
				<?php echo $num_rowsQuestion4 ?> Spry
				<div class="results-bar" style="width: <?php echo round($percentQuestion4,2); ?>%;">
					 <?php echo round($percentQuestion4,2); ?>%
				</div>
			</li>
		
			<li>
				<?php echo $num_rowsQuestion5 ?> Other
				<div class="results-bar" style="width: <?php echo round($percentQuestion5,2); ?>%;">
					 <?php echo round($percentQuestion5,2); ?>%
				</div>
			</li>
		</ul>
	
		<h6>Total votes: <?php echo $totalRows_rs_vote ?></h6>
		
		Back to Voting
	
	</fieldset>
	
</body>
</html>

<?php
  mysql_free_result($rs_vote);
?>

Beachten Sie, dass im PHP ein wenig Mathematik betrieben wird, die den Prozentsatz der Gesamtstimmen für jede Umfrageoption berechnet. Das sind nicht nur gute Informationen, sondern wir können diesen Prozentsatz verwenden, um die Breite eines Balkens festzulegen, um unseren Ergebnissen etwas visuellen Flair zu verleihen. Jede Umfrageoption hat ihr eigenes Listenelement, in dem die Gesamtzahl der Stimmen für diesen Artikel zusammen mit einem "results-bar" angezeigt wird, dessen Breite durch Setzen eines Inline-Breitenwerts auf den berechneten Prozentsatz bestimmt wird. Zurück in unserem CSS haben wir dieses Div bereits mit einem dezenten Muster-Hintergrundbild gestaltet.

Die Live-Demo ist nicht mehr online, aber Sie können ein .zip aller Dateien dieser Demo herunterladen.

(Denken Sie daran: Dies erfordert einen Server, der PHP und eine MySQL-Datenbank ausführt, daher müssen Sie die obigen Schritte befolgen, damit es auf Ihrem eigenen Server funktioniert. Photoshop-Datei enthalten.)