[PHP/MYSQL] Script zum adden von Polls

unlord

Erfahrenes Mitglied
Aaaalsssooo:

Ich hab mir bis jetzt folgendes aufgebaut:

Ein Formular:

PHP:
<?php
  if(!isset($_SESSION['admin'])) {
      die("Acess denieded.");
  } else {
      echo "<h3>Neue Umfrage starten</h2>";
      echo '<form name="addPoll" action="index.php?section=admin&action=intern&acp_action=8gr_420g348&acp_status=poll_add_answers" method="POST">';
      echo 'Was wollen sie fragen: <input type="text" name="addPoll_question" size="40"><br>';
      echo 'Wieviel Antworten soll es geben: <input type="text" name="addPoll_sum_answers" size="2"><br><br>';
      echo "<font face=\"Verdana\" size=\"2\"><a href=\"index.php?section=admin&action=intern&acp_action=8gr_420g348&acp_status=poll_add_answers\" onclick=\"window.document.forms['addPoll'].submit(); return false;\" style=\"text-decoration: none\"><font color=\"black\">Antworten eingeben</font></a><br></form>";
  }
?>

Eine Seite zum eingeben der Antworten:

PHP:
<?php
  echo "<h2>Antworten eintragen</h2>";
  $question = $_POST['addPoll_question'];
  $answers = $_POST['addPoll_sum_answers'];
  $answersID = 1;
  echo "<form action=\"index.php?section=admin&action=intern&acp_action=8gr_420g348&acp_status=poll_added\" method=\"POST\">";
  echo "Ihre Frage: ".$question."<br>";
  while($answers > 0) {
        echo "Antwort $answersID: <input type=\"text\" name=\"$answers\" size=\"40\"><br>";
        $answers--;
        $answersID++;
  }
  $answers = $_POST['addPoll_sum_answers'];
  echo "<input type=\"hidden\" name=\"q\" value=\"$question\">";
  echo "<input type=\"hidden\" name=\"a\" value=\"$answers\">";
  echo "<input type=\"submit\"></form>";
?>

Und dann das Script zum adden:

PHP:
<?php
  $question = $_POST['q'];
  $add_poll = "INSERT INTO poll ('Datum', 'Frage') VALUES ('NOW()', '".$question."')";
  mysql_query($add_poll) OR die(mysql_error());
  $sql_pollid = mysql_query("SELECT PollID FROM poll_antworten ORDER BY ID DESC LIMIT 0,1");
  $get_pollid = mysql_fetch_array($sql_pollid);
  $current_pollid = $get_pollid['PollID'];
  $new_pollid = $current_pollid+1;
  $add_answers = "INSERT INTO poll_antworten ('PollID', 'Antwort') VALUES ('".$new_pollid."')"; // jetzt komme ich nicht weiter
?>

Diesen letzten INSERT INTO Befehl muss man wahrscheinlich innerhalb einer While-Schleife, ich weiß nur nicht wie. Wie kann ich jetzt die VALUES der Input-Felder von vorhin eintragen? Hoffe ihr könnt mir helfen. Wenn ihr etwas nicht versteht FRAGT BITTE. ;)

mfg
unlord
 
PHP:
<?php 
  $question = $_POST['q']; 
  $add_poll = "INSERT INTO poll ('Datum', 'Frage') VALUES ('NOW()', '".$question."')"; 
  mysql_query($add_poll) OR die(mysql_error()); 
  $sql_pollid = mysql_query("SELECT PollID FROM poll_antworten ORDER BY ID DESC LIMIT 0,1");
  for ($i = 0; $i < mysql_num_rows ($sql_pollid); $i++)
  {
    $get_pollid = mysql_fetch_assoc($sql_pollid); //Assoziiertes Array, da du eine Zeile weiter ein assoziiertes Array verwendest
    $current_pollid = $get_pollid['PollID']; 
    $new_pollid = $current_pollid+1; 
    $add_answers = "INSERT INTO poll_antworten ('PollID', 'Antwort') VALUES ('".$new_pollid."')"; // jetzt geht es weiter, aber $sql_pollid darf nicht verändert werden
  }
?>
So sollte es gehen, wenn ich dich richtig verstanden habe.
 
Nene, das habe ich nich gemeint, hab auch schlecht erklärt sry. Ich will zusätzlich zu der PollID Antworten einfügen, ich zeige hier mal mein Tabellenaufbau:

poll: ID(INT);Frage;Datum

poll_antworten: ID(INT);PollID(INT, hier wird die ID des polls angegeben, für den die Fragen sind); Antwort; Klicks

So... jetzt habe ich PollID (mein Script zu der PollID funtzt nämlich auch); Klicks bleibt auf 0 und ID is auto_incr, fehlen also nur noch die Antworten...

Ich habe die Antworten ja am Anfang mit einer While-Schleife bestimmt:

PHP:
  while($answers > 0) { 
        echo "Antwort $answersID: <input type=\"text\" name=\"$answers\" size=\"40\"><br>"; 
        $answers--; 
        $answersID++; 
  }

Wie kann ich jetzt wieder den Wert dieser Input-Felder auslesen und dann für INSERT INTO verweden. Vielleicht hilft euch mein kläglicher Versuch, es besser zu verstehen ^^:

PHP:
<?php
  $question = $_POST['q'];
  $add_poll = "INSERT INTO poll (Datum,Frage) VALUES (NOW(), '".$question."')";
  mysql_query($add_poll) OR die(mysql_error());
  $sql_pollid = mysql_query("SELECT PollID FROM poll_antworten ORDER BY ID DESC LIMIT 0,1");
  $get_pollid = mysql_fetch_array($sql_pollid);
  $current_pollid = $get_pollid['PollID'];
  $new_pollid = $current_pollid+1;
  $answers = $_POST['a'];
  while($answers > 0) {
        $sql = "INSERT INTO poll_antworten (PollID, Antwort) VALUES ('".$new_pollid."', '".$answers."')";
        mysql_query($sql) OR die(mysql_error());
        $answers--;
  }
?>

Hierbei werden, was ja auch logisch ist, nicht etwa die Werte der Input-Felder eingetragen, sondern die namen der Input-Felder. Hoffe konnte es dir nun besser erklären. Wenn jemand eine bessere Lösung für ein ACP-Script adden hat, lasse ich mich gerne überraschen, es muss nur in mein Konzept mit den 2 Tabellen passen. (sonst kann man nämlich nicht beliebig viele Antworten erstellen)

mfg
unlord
 
PHP:
  while($answers > 0) { 
        echo "Antwort $answersID: <input type=\"text\" name=\"an[$answers]\" size=\"40\"><br>"; 
        $answers--; 
        $answersID++; 
  }
Speicher erstmal alle Antworten in ein Array. Das mit dem an[$answers] als name macht es.

PHP:
<?php
  $question = $_POST['q'];
  $add_poll = "INSERT INTO poll (Datum,Frage) VALUES (NOW(), '".$question."')";
  mysql_query($add_poll) OR die(mysql_error());
  $sql_pollid = mysql_query("SELECT PollID FROM poll_antworten ORDER BY ID DESC LIMIT 0,1");
  $get_pollid = mysql_fetch_array($sql_pollid);
  $current_pollid = $get_pollid['PollID'];
  $new_pollid = $current_pollid+1;
  $answers = $_POST['a'];
  $an = $_POST["an"]; //Hier
  while($answers > 0) {
        $sql = "INSERT INTO poll_antworten (PollID, Antwort) VALUES ('".$new_pollid."', '".$an[$answers]."')"; // und hier
        mysql_query($sql) OR die(mysql_error());
        $answers--;
  }
?>
 
Ok, geht

Aber jetzt hab ich wieder Probleme mit dem Poll an sich -.-

mfg
unlord
 
Zuletzt bearbeitet:
Also erstmal danke @ won_gak geht jetzt :)

Aber jetzt.... das hier ist mein doppelvote blocker:

PHP:
      echo "<br>Insgesamt haben ".$pro_gesamt." User an der Umfrage teilgenommen.<br><br>";
      $cuser = $_SESSION['user'];
      $getpollid = mysql_query("SELECT ID FROM poll ORDER BY ID DESC LIMIT 0,1");
      $getpid = mysql_fetch_array($getpollid);
      $pollid = $getpid['ID'];
      $checkpoll = mysql_query("SELECT Poll FROM poll_user WHERE Poll = '".$pollid."'");
      $checkuser = mysql_query("SELECT user FROM poll_user WHERE user = '".$cuser."'");
      $fcuser = mysql_num_rows($checkuser);
      $fcpoll = mysql_num_rows($checkpoll);
      if($fcuser == '1' AND $fcpoll == '1') {
         echo "Sie haben bereits am Vote teilgenommen.";
      } else {
         echo "<br><form action=\"index.php?section=poll&action=vote\" method=\"POST\">";
         $apollsql = mysql_query("SELECT ID,PollID,Antwort,Klicks FROM poll_antworten WHERE PollID = '".$pollID."'");
         $getpollid = mysql_query("SELECT ID FROM poll ORDER BY ID DESC LIMIT 0,1");
         $getpid = mysql_fetch_array($getpollid);
         $pollid = $getpid['ID'];
         while($data = mysql_fetch_array($apollsql)) {
               $id = $data['ID'];
               echo "".$data['Antwort'].": <input type=\"radio\" name=\"$pollid\" value=\"$id\"><br>";
         }
         echo "<br><input type=\"submit\" value=\"Voten\"></form>";
      }

So... der aktuelle Vote hat die ID 9, das steht auch bei poll_user bei dem user unlord, mit dem ich gerade eingeloggt bin. Aber es kommt nicht die Meldung "Sie haben bereits am Vote teilgenommen" sondern ich kann imer wieder voten. Ich wüsste nur zu gern warum O_O

mfg
unlord
 
Zuletzt bearbeitet:
PHP:
      $getpid = mysql_fetch_assoc($getpollid); // du musst assoc nehmen um ein assoziiertes Array zu bekommen
      $pollid = $getpid['ID'];
 
So geht es auch nicht:

PHP:
      echo "<br>Insgesamt haben ".$pro_gesamt." User an der Umfrage teilgenommen.<br><br>";
      $cuser = $_SESSION['user'];
      $getpollid = mysql_query("SELECT ID FROM poll ORDER BY ID DESC LIMIT 0,1");
      $getpid = mysql_fetch_assoc($getpollid);
      $pollid = $getpid['ID'];
      $checkpoll = mysql_query("SELECT Poll FROM poll_user WHERE Poll = '".$pollid."'");
      $checkuser = mysql_query("SELECT user FROM poll_user WHERE user = '".$cuser."'");
      $fcpoll = mysql_num_rows($checkpoll);
      $fcuser = mysql_num_rows($checkuser);
      if($fcpoll == $pollid AND $fcuser == $cuser) {
         echo "Sie haben bereits am Vote teilgenommen.";

Was mich vor allem wunder ist, dass es vorher schon einmal genau so ging. Ich habe nämlich dieses Pollscript schon vor ein paar Tagen gemacht, nur ohne Add-Script und da ging es Und ich glaube nicht, dass es an assoc liegt, weil ich immer array verwende... und wie gesagt mit deiner Methode gehts ja leider auch nicht

mfg
unlord
 
Da scheint glaub ich ein logischer Fehler drinzustecken. Du willst doch nachsehen ob in poll_user ein User drin ist, der bei einem Poll bereits teilgenommen hat.
Also:
[
PHP:
      echo "<br>Insgesamt haben ".$pro_gesamt." User an der Umfrage teilgenommen.<br><br>";
      $cuser = $_SESSION['user'];
      $getpollid = mysql_query("SELECT ID FROM poll ORDER BY ID DESC LIMIT 0,1");
      $getpid = mysql_fetch_assoc($getpollid);
      $pollid = $getpid['ID'];
      $checkpoll = mysql_query("SELECT Poll FROM poll_user WHERE Poll = '".$pollid."' AND user = '" . $cuser . "'");
      $fcpoll = mysql_num_rows($checkpoll);
      if($fcpoll == 1) {
         echo "Sie haben bereits am Vote teilgenommen.";

Oder nimm mal diese Funktionen:

PHP:
/*
VOID function set_session_lock ($check)
.......................................
Diese Funktion speichert die IP zusammen mit der Variablen $check. Wird verwendet um IP-Sperren einzurichten.

Siehe: check_session_lock ($check)
*/
function set_session_lock ($check)
{
	global $tables_prefix;

	snd_query ("INSERT INTO " . $tables_prefix . "_session_locks (sess_id, proof, timestamp) VALUES ('" . $_SERVER[REMOTE_ADDR] . "', '$check', " . time () . ")");
}

/*
BOOL function check_session_lock ($check, $t = 86400)
.....................................................
Pendant zu set_session_lock ($check). Diese Funktion überprüft, ob es zu einem $check und der IP-Adresse einen Eintrag gibt.
Falls Ja: => FALSE
Falls Nein: => TRUE
$t gibt das Zeintintervall an, nachdem alte Einträge gelöscht werden. Standard sind 24 Stunden.
*/
function check_session_lock ($check, $t = 86400)
{
	$query = "DELETE FROM " . $tables_prefix . "_session_locks WHERE " . time () . " - timestamp > $t";
	$q = mysql_query ($query) or die ("Error while removing old lock! <br>query: $query<br>" . mysql_error ());

	$foo = give_ret ("_session_locks", "WHERE proof = '$check' AND sess_id = '" . $_SERVER[REMOTE_ADDR] . "'");
	
	if (count ($foo) > 0)
	{
		return FALSE;
	} else {
		return TRUE;
	}
}
 
Okay die erste Version funtzt auf jeden Fall :)

nur... ich seh irgendwie nich den unterschied zwischen:
PHP:
      $checkpoll = mysql_query("SELECT Poll FROM poll_user WHERE Poll = '".$pollid."' AND user = '" . $cuser . "'");
      $fcpoll = mysql_num_rows($checkpoll);
      if($fcpoll == 1) {
         echo "Sie haben bereits am Vote teilgenommen.";

und

PHP:
      $checkpoll = mysql_query("SELECT Poll FROM poll_user WHERE Poll = '".$pollid."'");
$checkuser = mysql_query("SELECT Poll FROM poll_user WHERE user = '" . $cuser . "'");
      $fcpoll = mysql_num_rows($checkpoll);
      $fcuser = mysql_num_rows($checkuser);
      if($fcpoll == 1 AND $fcuser == 1) {
         echo "Sie haben bereits am Vote teilgenommen.";

... läuft das nicht irgendwie aufs selbe raus, vor allem hatte es ja schon mal so funktioniert O_O!? Naja egal, Hauptsache es geht :)

mfg
unlord
 
Zurück