Datenbankabruf und Typumwandlung

S-lord

Mitglied
EDIT: // 2 Breiträge weiter unten habe ich das Script komplett neu geschrieben, befasst euch bitte mit der neuen poll.php, bevor ihr zuerst unnötigerweise die alte studiert. ;)

Ich schreibe gerade ein Umfragescript, nur leider funktioniert es nicht so, wie ich das will.
Alles klappt, außer die abfrage der bisherigen Stimmen für eine Wahl, das Addieren um 1 und Updaten der MySQL Datenbank. settype() klappt nur so halb, ich möchte ja die Hits der DB abrufen, um 1 erhöhen und wieder eintragen, womit die Stimme eben gezält wird.

Hier die betreffenden Scripte, zum Verständnis komplett, aber noch nicht fertig, keine Sorge. ;)

poll.php
PHP:
<?php
  require('data.php');
  $aktuelle_ip = $_SERVER['REMOTE_ADDR'];
	$verbindung = mysql_connect($host, $benutzer, $passwort);
	mysql_select_db($db, $verbindung);
  // Verbindung zu POLL
	$sql = 'SELECT * FROM poll ORDER BY start DESC LIMIT 1';
	$ergebnis = mysql_query($sql, $verbindung);
  //Abruf der aktuellen Umfrage
  while ($row = mysql_fetch_array($ergebnis)) {
    echo $row['question'];
    $id_poll = $row['id'];  // id_poll : ID der aktuellen Umfrage
    // Speicherung der IPs
    $ips_before = $row['ips'];  // ips_before : IPs momentan in der DB
  }
      unset($row);
      mysql_free_result($ergebnis);
      // Verbindung zu POLL_QUESTIONS fuer die Hits
      $sql = 'SELECT * FROM poll_questions ORDER BY prio';
      $ergebnis = mysql_query($sql,$verbindung);
      echo '<table>';
      while ($row = mysql_fetch_array($ergebnis)) {
        $total += $row['hits']; // total : Alle Abstimmungen zahlenmaessig zusammengefasst
      }
      unset($row);
      mysql_free_result($ergebnis);
      // Verbindung zu POLL_QUESTIONS fuer Antworten
      $sql = 'SELECT * FROM poll_questions ORDER BY prio';
      $ergebnis = mysql_query($sql,$verbindung);
      echo '<form action="includes/vote.php" method="POST">';
      while ($row = mysql_fetch_array($ergebnis)) {
        // Wenn die momentane IP schon teilgenommen hat, Ergebnisse anzeigen
        if(preg_match("/(" . $aktuelle_ip . ")/",$ips_before)) { //preg_match("/[.]*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[.]*/",
          // Ausgabe Antwortmoeglichkeiten
          echo '<tr><td class="poll">';
          echo $row['answer'];
          echo '</td><td>';
          $percent = round($row['hits']*100/$total,2); // percent : Prozentberechnung der Stimmenverteilung
          echo $percent . '% (' . $row['hits'] . ' Stimmen)';
          echo '</td><td>';
          echo 'Aufwendige Grafikdarstellung'; // Work in progress :p
        // Wenn noch nicht, Formular ausgeben
        } else {
          // Ausgabe Antwortmoeglichkeiten
          echo '<tr><td class="poll">';
          echo $row['answer'];
          echo '</td><td>';
          echo '<input type="radio" name="id_quest" value="' . $row['id'] . '" />';
          settype($row['hits'],'integer');
          $_SESSION['hits'] = $row['hits'];
        }
        echo '</td></tr>';
      }
      echo '</table>';
      // Tabelle beendet
      // Wenn die aktuelle IP bisher nicht teil genommen hat, restliches Formular ausgeben
      if(!preg_match("/(" . $aktuelle_ip . ")/",$ips_before)) {
        $_SESSION['id_poll'] = $id_poll;
        $_SESSION['ips_before'] = $ips_before;
        echo '<input type="submit" name="submit" value="Abstimmen!" class="button" /></form>';
      } else {
        echo 'Sie haben bereits abgestimmt.';
      }
      // Verbindung beenden
      mysql_free_result($ergebnis);
    	mysql_close($verbindung);
?>

Ausgabe1 (wenn schon abgestimmt):
HTML:
Diese Umfrage hat bei mir funktioniert.<table><form action="includes/vote.php" method="POST"><tr><td class="poll">Jo.</td><td>60% (3 Stimmen)</td><td>Aufwendige Grafikdarstellung</td></tr><tr><td class="poll">Nix gibs.</td><td>40% (2 Stimmen)</td><td>Aufwendige Grafikdarstellung</td></tr></table>Sie haben bereits abgestimmt.

Ausgabe2(wenn noch nicht abgestimmt):
HTML:
Diese Umfrage hat bei mir funktioniert.<table><form action="includes/vote.php" method="POST"><tr><td class="poll">Jo.</td><td><input type="radio" name="id_quest" value="4" /></td></tr><tr><td class="poll">Nix gibs.</td><td><input type="radio" name="id_quest" value="5" /></td></tr></table><input type="submit" name="submit" value="Abstimmen!" class="button" /></form>

vote.php
PHP:
<?php
  session_start();
  $aktuelle_ip = $_SERVER['REMOTE_ADDR'];
  if(isset($_POST['submit'])) {
    // Pruefung auf Vorhandensein benoetigter Variablen BESTANDEN BESTANDEN KLAPPT WUNDERBAR!!
      echo isset($_SESSION['hits']);
      echo '<br />';
      echo $_SESSION['hits'];
      echo '<br />';
      echo isset($_SESSION['id_poll']);
      echo '<br />';
      echo $_SESSION['id_poll'];
      echo '<br />';
      echo isset($_SESSION['ips_before']);
      echo '<br />';
      echo $_SESSION['ips_before'];
      echo '<br />';
      echo isset($_POST['submit']);
      echo '<br />';
      echo $_POST['submit'];
      echo '<br />';
      echo isset($_POST['id_quest']);
      echo '<br />';
      echo $_POST['id_quest'];
      echo '<br />Pr&uuml;fung erfolgreich beendet<hr />';
    // Pruefung beendet
    if (isset($_SESSION['hits']) and isset($_SESSION['id_poll']) and isset($_SESSION['ips_before']) and isset($_POST['id_quest'])) {
      require('data.php');
      $verbindung = mysql_connect($host, $benutzer, $passwort);
  	  mysql_select_db($db, $verbindung);
      // Neue IPs = Alte IPs + Neue IP + ", "
      $ips_after = $_SESSION['ips_before'] . $aktuelle_ip . ', ';
          echo 'NEUE IPS<br />';
          echo $ips_after;
      // Updaten: In POLL, IPs auf neue IPs abaendern
      $sql = "UPDATE poll Set ips = '" . $ips_after . "' WHERE id = '" . $_SESSION['id_poll'] . "'";
      $ergebnis = mysql_query($sql,$verbindung);
          echo 'UPDATE DER IPs ABGESCHLOSSEN';
      mysql_free_result($ergebnis);
      // Zugriffe = Zugriffe zuvor + 1
      echo $_SESSION['hits'] . '<br />~~~~~~~~~~~<br />';
      settype($_SESSION['hits'],'integer');
      $hits_after = $_SESSION['hits']+1;
      echo '>>>>>>>>>>>>>>' . $hits_after;
      $sql2 = "UPDATE poll_questions Set hits = '" . $hits_after . "' WHERE id = '" . $_POST['id_quest'] . "'";
      $ergebnis2 = mysql_query($sql2,$verbindung);
      mysql_free_result($ergebnis2);
      mysql_close($verbindung);
      unset($_SESSION['id_poll']);
      unset($_SESSION['ips_before']);
      unset($_SESSION['hits']);
    }
    $_SESSION['meldung'] = 'Sie haben erfolgreich abgestimmt.';
    $_SESSION['farbe'] = 'positiv';
    //header('Location: ../index.php');
  } else {
    $_SESSION['meldung'] = 'Leider ist ein Fehler unterlaufen und Ihre Abstimmung wurde nicht gewertet.';
    $_SESSION['farbe'] = 'negativ';
    //header('Location: ../index.php');
  }
?>


Screenshots der DB:
http://img5.imagebanana.com/img/hfvs89l/Unbenannt1.jpg


Ich danke euch jetzt schon vielfach für eure Hilfe! =)
 
Zuletzt bearbeitet:
Hey,


ich würde dein Script ein wenig ändern.

Erstell´ eine temporäre Tabelle mit den IPs, die bisher abgestimmt haben
IP|Uhrzeit

Und wenn du eine neue Umfrage hast, dann lösche diese Tabelle.

Zur einfachen Überrpüfung sollte es denn reichen

PHP:
$sql = SELECT ip FROM tabelle WHERE ip = "$ip"
if($mysql_num_rows($sql) == 1){
echo "Sorry, Sie haben schon gestimmt"
}

Und mit dem Erhöhen um "1" sollte es reichen, wenn du es incrementierst.
UPDATE spalte SET spalte=spalte+1 WHERE .....


Zudem musst du noch einmal das Formular schließen </form>

PHP:
        echo '<input type="submit" name="submit" value="Abstimmen!" class="button" /></form>';
      } else {
        echo 'Sie haben bereits abgestimmt.';



bo
 
Zuletzt bearbeitet von einem Moderator:
So, nun habe ich deinen Ratschlag berücksichtigt, und die poll.php schonmal komplett neu geschrieben.
Wo ist der Fehler?
Es erfolgt keine Ausgabe, überhaupt nicht!
In meiner index.php wird die poll.php eingefügt, und alles, was nach diesem Include kommt, wird auch im Quelltext verschluckt.
Also die letzte Ausgabe vor dem includen der poll.php ist das Ende der Ausgabe von http..

PHP:
<?php
  require('includes/data.php');
  $ip = $_SERVER['REMOTE_ADDR'];
  $verbindung = mysql_connect($host,$benutzer,$passwort);
  mysql_select_db($db,$verbindung);
  $sql = "SELECT * FROM poll ORDER BY date LIMIT 1";
  $ergebnis = mysql_query($sql,$verbindung);
  while($row = mysql_fetch_array($ergebnis)) {
    $sql2 = "SELECT * FROM poll_answers WHERE number='" . $row['id'] . "' ORDER BY prio";
    $ergebnis2 = mysql_query($sql2,$verbindung);
    echo $row['question'];
    ?>
      <table>
    <?
    if (preg_match("/(" . $ip . ")/",$row['ips']) {
      while ($row2 = mysql_fetch_array($ergebnis2)) {
        ?>
          <tr>
            <td>
              <? echo $row2['answer']; ?>
            </td>
            <td>
              <? echo $row2['hits']*100/$row['hits'] . ' (' . $row2['hits'] . ')'; ?> // 55% (177)
            </td>
            <td>
              Platzhalter:Grafik
            </td>
          </tr>
        <?
      } //  Abfrage Antworten beendet
      ?>
        <tr>
          <td colspan="2">
            Sie haben bereits abgestimmt.
          </td>
        </tr>
      <?
    } else { // if ip schon vorhanden beendet
      ?>
        <form action="includes/vote.php" method="POST">
      <?
      while ($row2 = mysql_fetch_array($ergebnis2)) {
        ?>
          <tr>
            <td>
              <? echo $row2['answer']; ?>
            </td>
            <td>
              <input type="radio" name="id_answer" value="<? echo $row2['id']; ?>" />
            </td>
          </tr>
        <?
      } //  Abfrage Antworten beendet
      ?>
        <tr>
          <td colspan="2">
            <input type="submit" name="submit" value="Abstimmen!" />
          </td>
        </tr>
        </form>
      <?
    } // else ip schon vorhanden beendet
    ?>
      </table>
    <?
  } // Abfrage Umfrage beendet
  mysql_free_result($ergebnis);
  mysql_free_result($ergebnis2);
  mysql_close($verbindung);
?>

Tabellenstruktur ein wenig geändert:

http://img5.imagebanana.com/img/wm170t9/Unbenannt1.jpg
 
Hey,

gib mir mal bitte deine sql ohne Daten.

So kann ich keinen Fehler entdecken :(


Vllt hilft noch ERROR_Reporting(all);


Ich warte ;)


bo
 
Hast du innerhalb der Datei poll.php an verschiedenen Stellen Testausgaben gemacht?
Hast du diese mal direkt aufgerufen?
Hast du Teile einfach mal gelöscht und probiert, ob es dann geht?
Ist error_reporting aktiviert?

Im Normalfall wird bei einem so schwerwiegenden Fehler immer eine Fehlermeldung ausgegeben.
 
Hey,

gib mir mal bitte deine sql ohne Daten.

So kann ich keinen Fehler entdecken :(


Vllt hilft noch ERROR_Reporting(all);


Ich warte ;)


bo


Sql ohne Daten?
Ehm die Datenbankstruktur ist doch in meinem Screenshot im letzten Post ganz unten zu finden?!
Oder wie meinste das? ;)

edit:// Wenn ja, hier:
Code:
CREATE TABLE `poll_answers` (
  `id` smallint(4) NOT NULL auto_increment,
  `number` smallint(5) NOT NULL,
  `prio` tinyint(2) NOT NULL,
  `answer` varchar(100) NOT NULL,
  `hits` int(5) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

Code:
CREATE TABLE `poll` (
  `id` smallint(4) NOT NULL auto_increment,
  `question` varchar(200) NOT NULL,
  `date` bigint(11) NOT NULL,
  `ips` text,
  `expired` tinyint(1) NOT NULL,
  `hits` int(5) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 
Zuletzt bearbeitet:
Hi,


ja das meine ich ;)

Ich erhalte bei folgenden Fehler
PHP:
    if (preg_match("/(" . $ip . ")/",$row['ips']) {
      while ($row2 = mysql_fetch_array($ergebnis2)) {
        ?>

PHP:
Parse error: parse error in D:\XXXXXXX test.php on line 15

Wenn ich die if Bedingung ändere, dann erhalte ich eine Anzeige.
Wieso fügst du die IPs nicht in eine extra Tabelle ein?
So wie du es jetzt hast, ist es "unüblich" :P

bo
 
Hi,


ja das meine ich ;)

Ich erhalte bei folgenden Fehler
PHP:
    if (preg_match("/(" . $ip . ")/",$row['ips']) {
      while ($row2 = mysql_fetch_array($ergebnis2)) {
        ?>

PHP:
Parse error: parse error in D:\XXXXXXX test.php on line 15

Wenn ich die if Bedingung ändere, dann erhalte ich eine Anzeige.
Wieso fügst du die IPs nicht in eine extra Tabelle ein?
So wie du es jetzt hast, ist es "unüblich" :P

bo

Ich würde es gern beibehalten, weil ich die Umfragen dann gern archivieren würde, demnach bei "expired" die 0 auf 1 setzen würde.
Demnach müssen ja für jede Umfrage einzeln die Ips gespeichert werden.
Wie bekommst du die Fehlermeldung? Was ist daran falsch?
Danke schonmal für deine Hilfe! =)
 
Hi,


ich habe eine Umfrage erstellt; ohne IPs,
da habe ich den Fehler bekommen, aber es scheint zu funktionieren,
wenn du aus

PHP:
  if (preg_match("/(" . $ip . ")/",$row['ips'])

PHP:
  if (preg_match("/(" . $ip . ")/",$row['ips']))
machst ;)

Da fehlt ein ")"

Schönen Samstag
mfg
bo
 
Zurück